日志报错 fork:Cannot allocate memory
日志报错 fork:Cannot allocate memory
查看错误
在Linux系统中,当系统内存不足时,内核的OOM killer(Out Of Memory killer)机制可能会启动,并杀掉一些占用内存过多的进程。
查看系统日志:
- 使用
grep
命令:可以通过grep
命令搜索系统日志文件中包含“Out of memory”的行。例如,grep "Out of memory" /var/log/messages
(注意,日志文件的位置和名称可能因Linux发行版而异)。 - 使用
dmesg
命令:dmesg
命令用于显示或控制内核环形缓冲区的消息。当OOM killer启动并杀掉进程时,相关信息也会被写入内核环形缓冲区,因此可以通过dmesg | grep -i kill
来查看相关信息。
解决1:
实例内存未耗尽时触发 Out Of Memory
现象描述
Linux 云服务器在内存使用率未占满的情况下触发了 OOM(Out Of Memory)。如下图所示:
可能原因
可能原因 | 处理措施 |
内存使用率过高 | |
进程数超限 | |
系统可用内存低于 min_free_kbytes 值 |
故障处理
检查内存使用率是否过高
参见 内存使用率过高问题处理 ,查看实例是否内存使用率过高。若实例内存使用率正常,请 检查进程数是否超限。
检查进程数是否超限
1. 参见 日志报错 fork:Cannot allocate memory,核实进程数是否超限。若总进程数未超限,则执行下一步。
2. 登录云服务器,执行以下命令查看 min_free_kbytes
值。
sysctl -a | grep min_free
min_free_kbytes
值单位为 kbytes,下图所示 min_free_kbytes = 1024000
即为1GB。
3. 执行以下命令,使用 VIM 编辑器打开 /etc/sysctl.conf
配置文件。
vim /etc/sysctl.conf
4. 按 i 进入编辑模式,修改 vm.min_free_kbytes
配置项。若该配置项不存在,则直接在配置文件中增加即可。
说明
建议修改 vm.min_free_kbytes
值为不超过总内存的1%即可。
5. 按 Esc 并输入 :wq 后,按 Enter 保存并退出 VIM 编辑器。
6. 执行以下命令,使配置生效即可。
sysctl -p
检查系统可用内存是否低于 min_free_kbytes 值
可能是由系统可用内存低于 min_free_kbytes
值导致。min_free_kbytes
值表示强制 Linux 系统最低保留的空闲内存(Kbytes),如果系统可用内存低于设定的 min_free_kbytes
值,则默认系统启动 oom-killer 或强制重启。具体行为由内核参数 vm.panic_on_oom
值决定:
若 vm.panic_on_oom=0
,则系统会提示 OOM,并启动 oom-killer 杀掉占用最高内存的进程。
若 vm.panic_on_oom =1
,则系统会自动重启。
解决2
现象描述
日志中出现报错信息 “fork:Cannot allocate memory”。如下图所示:
可能原因
可能是进程数超限导致。系统内部的总进程数达到了 pid_max
时,再创建新进程时会报 “fork:Cannot allocate memory” 错。
解决思路
1. 参见 处理步骤,查看实例内存使用率是否过高。
2. 核实总进程数是否超限,并修改总进程数 pid_max
配置。
处理步骤
1. 参见 内存使用率过高问题处理 ,查看实例是否内存使用率过高。若实例内存使用率正常,则执行下一步。
2. 执行以下命令,查看系统 pid_max
值。
sysctl -a | grep pid_max
根据返回结果,进行对应操作:
返回结果如下图所示,pid_max
默认值为32768,请执行下一步。
返回报错信息 “fork:Cannot allocate memory”,则需执行以下命令,临时调大 pid_max
。
echo 42768 > /proc/sys/kernel/pid_max
您可再次执行命令,查看系统 pid_max
值。
3. 执行以下命令,查看系统内部总进程数。
pstree -p | wc -l
若总进程数达到了 pid_max
,则系统在创建新进程时会报 “fork Cannot allocate memory” 错。
说明
您可执行 ps -efL
命令,定位启动进程较多的程序。
4. 将 /etc/sysctl.conf
配置文件中的 kernel.pid_max
值修改为65535,以增加进程数。
执行以下命令,设置系统 pid_max 值
echo "kernel.pid_max=65535" >> /etc/sysctl.conf
修改完成后如下图所示:
5. 执行以下命令,使配置立即生效。
sysctl -p
解决2、3:
vm.panic_on_oom
是一个 Linux 系统参数,用于控制当系统内存不足(即发生 Out Of Memory,OOM)时系统的行为。这个参数可以在 /proc/sys/vm/
目录下进行配置。
配置方法
-
查看当前值:
首先,你可以通过查看/proc/sys/vm/panic_on_oom
文件的内容来了解当前的配置值。使用如下命令:bash复制代码
cat /proc/sys/vm/panic_on_oom
-
修改配置值:
要修改vm.panic_on_oom
的值,你需要编辑/etc/sysctl.conf
文件(或你的系统使用的相应系统控制文件),添加或修改如下行:bash复制代码
vm.panic_on_oom = [新的值]
其中
[新的值]
可以是0
、1
或2
,分别对应不同的行为:0
:内存不足时,启动 OOM killer,但不触发系统重启。1
:内存不足时,有可能会触发 kernel panic(系统重启),也有可能启动 OOM killer(具体行为可能取决于系统和其他因素)。2
:内存不足时,强制触发 kernel panic,导致系统重启。
修改文件后,你需要重新加载 sysctl 配置或重启系统以使更改生效。重新加载 sysctl 配置的命令是:
bash复制代码
sysctl -p
注意事项
- 在修改此参数之前,请确保你了解这些更改对系统稳定性和可用性的影响。
- 如果你在生产环境中使用此参数,请确保已经做好了充分的测试和备份。
vm.panic_on_oom
的设置可能会与系统的其他内存管理策略(如 cgroups 的 OOM 优先级配置)相互作用,因此请确保你的系统配置是协调一致的。