如何增加我的登录会话的 TasksMax 值?

如何增加我的登录会话的 TasksMax 值?

我正在使用 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 的提示;事实上,它似乎是一个奇怪的(尽管不是质数)默认值。

  1. 是否有一些简单的命令ulimit可用于即时更改此设置?或者甚至是复杂的命令?(我可以使用这个假设的命令来确定当前限制吗?)

  2. 如果我真的必须重新启动我的登录会话才能更改任务限制(我真的想避免这种情况),我必须做什么才能更改默认值?

答案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)。

要更改该值:

  1. 创建一个包含以下内容的文件/etc/systemd/system/user-.slice.d/99-taskmax.conf
[Slice]
TasksMax=80% # or whatever value you want
  1. 重新加载 systemd:
systemctl daemon-reload

您可以通过在名为 的目录下创建插入文件来更改单个用户的值,/usr/lib/systemd/system/user-${UID}.slice.d其中${UID}是您想要更改的用户的用户 ID。

还要注意,放入文件的名称很重要:所有目录中的文件(包括 /usr/lib 下的文件)都按其文件名排序,并且每个参数最后遇到的值就是将要使用的值。

相关内容