out of memory

日志报错 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 值

检查系统可用内存是否低于 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/ 目录下进行配置。

配置方法

  1. 查看当前值
    首先,你可以通过查看 /proc/sys/vm/panic_on_oom 文件的内容来了解当前的配置值。使用如下命令:

     

    bash复制代码

    cat /proc/sys/vm/panic_on_oom
  2. 修改配置值
    要修改 vm.panic_on_oom 的值,你需要编辑 /etc/sysctl.conf 文件(或你的系统使用的相应系统控制文件),添加或修改如下行:

     

    bash复制代码

    vm.panic_on_oom = [新的值]

    其中 [新的值] 可以是 01 或 2,分别对应不同的行为:

    • 0:内存不足时,启动 OOM killer,但不触发系统重启。
    • 1:内存不足时,有可能会触发 kernel panic(系统重启),也有可能启动 OOM killer(具体行为可能取决于系统和其他因素)。
    • 2:内存不足时,强制触发 kernel panic,导致系统重启。

    修改文件后,你需要重新加载 sysctl 配置或重启系统以使更改生效。重新加载 sysctl 配置的命令是:

     

    bash复制代码

    sysctl -p

注意事项

  • 在修改此参数之前,请确保你了解这些更改对系统稳定性和可用性的影响。
  • 如果你在生产环境中使用此参数,请确保已经做好了充分的测试和备份。
  • vm.panic_on_oom 的设置可能会与系统的其他内存管理策略(如 cgroups 的 OOM 优先级配置)相互作用,因此请确保你的系统配置是协调一致的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值