系统报“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. 查看系统内存使用率是否过高,确定内存不足后禁用内存占用较多的无关服务或者添加内存。
通过 freetop 命令查看内存使用情况

  1. root@uos-pc:~# top
  2. ......
  3. root@uos-pc:~# free -m
  4. total used free shared buff/cache available
  5. Mem: 15032 1224 12179 13 1628 13541
  6. 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。

  1. root@uos-pc:~# sysctl kernel.pid_max
  2. kernel.pid_max = 32768

查看系统内部总进程数。 若总进程数达到了 pid_max,则系统在创建新进程时会报 fork Cannot allocate memory 错。

  1. root@uos-pc:~# pstree -p | wc -l
  2. 744

执行 ps -efL 命令,定位启动进程较多的程序。

  1. root@uos-pc:~# ps -efL
  2. ......

临时增加总进程数 pid_max

  1. root@uos-pc:~# sysctl -w kernel.pid_max=65535
  2. 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

posted @ 2022-04-29 11:58  云中看世界  阅读(27001)  评论(0编辑  收藏  举报