统信UOS中出现“fork: Cannot allocate memory”或进程数卡在几百,说明kernel.pid_max已达上限,需调大该参数;临时执行sudo sysctl -w kernel.pid_max=65536验证,永久修改需在/etc/sysctl.conf中添加并运行sudo sysctl -p;用户级限制通过/etc/security/limits.conf配置,且需重新登录生效。

统信UOS系统中运行Java应用、消息队列或高并发微服务时,若频繁出现“fork: Cannot allocate memory”错误,或ps aux显示进程数卡在几百就不再增长,说明内核级最大进程数(PID上限)已触及瓶颈,必须调大kernel.pid_max参数才能支撑更多并发子进程。
临时提高当前系统的最大进程数
这一步只影响当前启动的内核状态,重启后失效,适合快速验证是否为pid_max过低导致的问题。
执行命令:sudo sysctl -w kernel.pid_max=65536
立即验证是否生效:cat /proc/sys/kernel/pid_max
永久修改系统级最大进程数
该设置决定整个内核可分配的PID总数,是所有用户和进程的上限基础。不改这里,limits.conf里设再高的nproc也无效。
第一步:编辑内核参数配置文件
sudo nano /etc/sysctl.conf
第二步:在文件末尾追加一行(不要重复已有行):
kernel.pid_max = 131072
第三步:加载新参数使配置立即生效
【必须执行此步,否则重启前不会生效】
sudo sysctl -p
第四步:确认值已写入内核
cat /proc/sys/kernel/pid_max
为特定用户设置进程数软硬限制
仅当该用户需独立于全局pid_max运行大量子进程(如部署多个Tomcat实例的tomcat用户)时才需要此步。普通用户用默认值即可。
方法一:全局用户统一限制
编辑 limits.conf:
sudo nano /etc/security/limits.conf
在文件末尾添加两行:
* soft nproc 65535
* hard nproc 65535
方法二:为指定用户单独设置
例如限制用户appuser最多启动8192个进程:
sudo nano /etc/security/limits.conf
追加:
appuser soft nproc 8192
appuser hard nproc 8192
注意:修改后需重新登录该用户,或重启其所有shell会话,新限制才会加载。
验证各层级限制是否生效
① 查看内核级PID总数上限:
cat /proc/sys/kernel/pid_max
② 查看当前登录用户的进程数限制:
ulimit -u
③ 检查某具体进程的实际限制(以PID 1234为例):
cat /proc/1234/limits | grep "max processes"
如果第②步输出远小于第①步,说明limits.conf未生效或PAM未启用;如果第③步显示值异常,需检查该进程是否由systemd托管——这类服务需单独在unit文件中配置LimitNPROC。

















