-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 配置文件,修改软限制和硬限制

bash 复制代码
[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,修改进程数量限制

bash 复制代码
[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资源限制。

bash 复制代码
[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参数

bash 复制代码
[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
相关推荐
mounter6254 天前
【内核精进】Linux Kernel 设计模式(一):引用计数与可见性的艺术
linux·设计模式·linux kernel
mounter62510 天前
深度解析:Linux 内核为何要移除“直接映射” (Direct Map)?
linux·运维·服务器·security·linux kernel·direct mem map
mounter62516 天前
【内核前沿】从 veth 到 netkit:深度解析 TCP devmem 穿透容器屏障的“队列租赁”黑科技
网络·ebpf·linux kernel·devmem tcp·netkit·队列租赁
张32320 天前
CGroup 资源限制原理
cgroup
计算机与认知1 个月前
Linux UCLAMP机制深度分析
linux kernel
Ray Song2 个月前
cgroup 实战从0到1
linux内核·cgroup·系统资源控制
Ankie Wan3 个月前
cgroup(Control Group)是 Linux 内核提供的一种机制,用来“控制、限制、隔离、统计”进程对系统资源的使用。
linux·容器·cgroup·lxc
叶羽西3 个月前
Android15借助Linux proc虚拟文件系统调试用户态实现
android·linux kernel
optimistic_chen3 个月前
【Docker入门】cgroups 资源控制
linux·运维·ubuntu·docker·容器·cgroup
zfj3215 个月前
容器 的 cpu request limit 与 linux cgroups 的关系
linux·运维·服务器·kubernetes·cgroup