关于Tasks limit参数浅析

背景:客户发现系统用户无法创建进程/线程,导致程序报错
系统:openeuler

systemd的系统在cgroup中对用户的进程数有默认的限制的
1

这个limit值 是cgroup下user-0.slice的 pids.max的值,在/sys/fs/cgroup/pids/user.slice/user-0.slice/pids.max

但是修改pids.max 的值是不会改变limit的值,并且systemctl daemon-reload后这个值会变成初始值。所以怀疑这个值是跟随某个值变化的,后来发现配置文件/usr/lib/systemd/system/user-.slice.d/10-defaults.conf 里面有 TaskMax=80%的配置
3

那么这个limit的值应该是某个值的80%算出来的,排查发现是/proc/sys/kernel/threads-max这个值 乘以80%正好是limit的值。
所以修改limit的限制可以修改threads-max的参数值或者 /usr/lib/systemd/system/user-.slice.d/10-defaults.conf 里TaskMax= 直接修改成数值。
Threads-max是一个内核的参数,在系统启动时在内核中初始化的。那这个值在内核中是怎样算出来的?查了相关资料有一种解释是 maximum number of threads = virtual memory size / (stack size * 1024 * 1024)(这个算法有待考证,但这个参数是和内存相关的)

其实系统全局的限制是在/proc/sys/kernel/threads-max 和 /proc/sys/kernel/pid_max这两个文件中。
一般情况下系统默认的参数pid_max 的值都要比threads-max 大,所以表现出 tasks limit的值和threads-max的值强相关的。下面我们做个实验,在pid_max小于threads-max的情况下:

从图中可以看到,这种情况下tasks limit的值和pid_max的值强相关的。
pid_max 这个值也是一个内核参数,一般情况下是等于 1024*CPU核数。

1 Like