系统报“fork:Cannot allocate memory” 报错的解决方法
系统报“fork:Cannot allocate memory” 报错的解决方法
“fork:Cannot allocate memory” 报错的解决方法
- 现象描述
- 可能原因
- 解决方法
1. 现象描述
系统日志里或者运行命令时出现报错信息 fork:Cannot allocate memory
。
2. 可能原因
可能是内存不足或者进程数超限导致。
当系统内部的总进程数达到了 pid_max
时,再创建新进程时会报 fork:Cannot allocate memory
错。
3. 解决方法
1. 查看系统内存使用率是否过高,确定内存不足后禁用内存占用较多的无关服务或者添加内存。
通过 free
、top
命令查看内存使用情况
root@uos-pc:~# top
......
root@uos-pc:~# free -m
total used free shared buff/cache available
Mem: 15032 1224 12179 13 1628 13541
Swap: 16383 0 16383
查看 /var/log/message
是否存在 oom
的记录。
root@uos-pc:~# grep "Out of memory" /var/log/messages
> Linux 内核有个机制叫OOM killer(Out Of Memory killer)。该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉。
2. 核实总进程数是否超限,并修改总进程数 pid_max
配置。
查看系统 pid_max
值。 pid_max
默认值为32768。
root@uos-pc:~# sysctl kernel.pid_max
kernel.pid_max = 32768
查看系统内部总进程数。 若总进程数达到了 pid_max
,则系统在创建新进程时会报 fork Cannot allocate memory
错。
root@uos-pc:~# pstree -p | wc -l
744
执行 ps -efL
命令,定位启动进程较多的程序。
root@uos-pc:~# ps -efL
......
临时增加总进程数 pid_max
root@uos-pc:~# sysctl -w kernel.pid_max=65535
kernel.pid_max = 65535
永久修改总进程数 pid_max
,使配置立即生效。
root@uos-pc:~# echo "kernel.pid_max = 65535" >> /etc/sysctl.conf
root@uos-pc:~# sysctl -p
kernel.pid_max = 65535