我正在使用 kubuntu 18.04
在测试一个生成大量并行进程的脚本时,我开始收到fork: retry: resource temporarily unavailable
错误消息。我假设这是每个用户的进程限制,于是开始查看常用的进程限制配置;最后,我确信 Ubuntu 现在使用 systemd 来配置每个用户的限制,而我需要更改的限制是 TasksMax。
具体来说,通过递归 grepping,我最终找到了这个文件:
$ cat /run/systemd/transient/user-1000.slice
# This is a transient unit file, created programmatically via the systemd API. Do not edit.
[Unit]
Description=User Slice of rici
After=systemd-logind.service
After=systemd-user-sessions.service
[Slice]
TasksMax=10813
我理解所有这些,但它没有告诉我如何更改此值。它所做的只是告诉我如何不这样做(通过编辑文件)。它也没有提供任何有关如何计算数字 10813 的提示;事实上,它似乎是一个奇怪的(尽管不是质数)默认值。
是否有一些简单的命令
ulimit
可用于即时更改此设置?或者甚至是复杂的命令?(我可以使用这个假设的命令来确定当前限制吗?)如果我真的必须重新启动我的登录会话才能更改任务限制(我真的想避免这种情况),我必须做什么才能更改默认值?
答案1
Systemd 使用 Linux 内核的一个特性cgroups控制用户可使用的资源量。此功能比使用命令设置的传统 rlimit 更全面ulimit
。
正如你所发现的,你可以拥有的线程+进程的数量由 systemd 控制TasksMax
参数。该参数的描述为:
这可以采用绝对任务数,也可以采用相对于系统上配置的最大任务数的百分比值。
对于单个用户登录,此参数通常由包含以下内容的文件控制/usr/lib/systemd/system/user-.slice.d/10-defaults.conf
:
[Slice]
TasksMax=33%
这解释了您在用户登录时发现的看似奇怪的值 - 它是总体值的百分比pids.max
(或对于早期内核threads-max
)。
要更改该值:
- 创建一个包含以下内容的文件
/etc/systemd/system/user-.slice.d/99-taskmax.conf
:
[Slice]
TasksMax=80% # or whatever value you want
- 重新加载 systemd:
systemctl daemon-reload
您可以通过在名为 的目录下创建插入文件来更改单个用户的值,/usr/lib/systemd/system/user-${UID}.slice.d
其中${UID}
是您想要更改的用户的用户 ID。
还要注意,放入文件的名称很重要:所有目录中的文件(包括 /usr/lib 下的文件)都按其文件名排序,并且每个参数最后遇到的值就是将要使用的值。