-bash: fork: retry: Resource temporarily unavailable 问题解决

错误提示: -bash: fork: retry: Resource temporarily unavailable

错误分析:之前已经出现过这种资源限制的报错提醒,然后整个系统可用的连接数就已经用完了,无法使用工具来获取系统信息,所以将运行的任务脚本kill后开多个窗口,打开top,监控资源,但是当资源限制提示出现后发现cpu和内存还有很多空余,所以猜想是linux资源限制问题。

因为是使用root用户跑的任务脚本,每次跑到25000左右,线程数50000左右就会出现资源限制,所以修改ulimit,将一些可能影响资源的限制放开,设置为unlimited或者设置一个较高的上限。

修改/etc/security/limits.conf 配置文件,修改软限制和硬限制

[root@130-171 security]# vim limits.conf   
root soft nofile 655360
root hard nofile 655360
* hard nproc 655350
* soft nproc 655350

修改/etc/security/limits.d/20-nproc.conf,修改进程数量限制

[root@130-171 limits.d]# cat 20-nproc.conf 
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
*          soft    nproc     unlimited
root       soft    nproc     unlimited
*          hard    nproc     unlimited
root       hard    nproc     unlimited

修改完以后重启系统生效。

查看ulimit资源限制。

[root@130-171 log]# ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 32133
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 655360
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

继续运行任务程序后发现,资源限制仍然存在。

查看系统日志/var/log/message 过滤错误信息 fork,发现报错信息。发现是kernel内核cgroup机制限制了资源

在Linux系统中,用户slice(User Slice)是systemd服务管理器(systemd)用于组织和管理与用户相关的进程的一种机制。每个登录到系统的用户都会有一个对应的用户slice,用于管理该用户的所有进程。

用户slice的名称通常是user-.slice,其中是用户的实际用户ID。例如,对于用户ID为1000的用户,其用户slice名称可能是user-1000.slice。

用户slice是systemd中的一个Cgroup(控制组),Cgroups是一种用于管理进程组的机制。Cgroups可以用来限制进程的资源使用,例如CPU、内存和进程数量(PIDs)。用户slice通过Cgroups为每个用户提供一个隔离的环境,使得每个用户的进程可以独立运行,并且资源之间不会互相干扰。

当用户登录到系统时,systemd会为该用户创建一个对应的用户slice,并将用户的所有进程分配到该slice中。这样,每个用户的进程都会受到用户slice的资源限制。例如,每个用户的进程数量限制(PIDs限制)可以单独设置,这样即使某个用户的进程数量超出了限制,也不会影响其他用户的进程。

通过用户slice,系统管理员可以更好地管理和控制每个用户的进程,确保系统资源的合理分配和使用。同时,用户slice还可以为每个用户提供一种隔离的环境,防止不同用户之间的进程干扰和影响。

使用systemctl status user-0.slice 命令查看root用户的slice限制,果然是slice限制了资源。

可以使用命令:systemctl set-property user-0.slice TaskMax=80000来设置limit限制的task数

然后查看slice状态。发现已经修改完成。

最后再运行任务程序,发现资源限制问题没有再出现。

也可以在/etc/systemd/system.control/user-0.slice.d/50-TasksMax.conf配置文件里面来配置tasksmax参数

[root@130-171 user-0.slice.d]# vim 50-TasksMax.conf

# This is a drop-in unit file extension, created via "systemctl set-property"

# or an equivalent operation. Do not edit.

[Slice]

TasksMax=200000