cenots7.6系统报“fork:Cannot allocate memory” 报错的解决方法(实操)

最近客户现场部署的服务器,经常出现连接一台虚拟机无法ssh连接,想着大抵是关机了,又或是存储满了(经常遇到这样的事情,因为基本上都是做的厚置备,所以会导致分配容量大于实际容量)。

打开应用程序出现异常日志信息,如下图:,提示资源已达上限和内存不足,

预感到此事不大简单,进入控制台,输入

`w`

好家伙,输出,翻译一下:内存不足或者进程数超限

`fork:Cannot allocate memory

再次尝试输入,free

想查看当前内存使用情况,同样命令不执行,无法查看

在与使用人沟通后,直接关闭电源重启虚拟机解决。

ps:可执行命令解决方法

  1. 查看系统内存使用率是否过高,确定内存不足后禁用内存占用较多的无关服务或者添加内存。
    通过 free、top 命令查看内存使用情况
# top

top - 10:43:05 up 6 days,  1:05,  1 user,  load average: 0.00, 0.01, 0.05
Tasks: 133 total,   1 running, 132 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.1 sy,  0.0 ni, 99.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8009256 total,  5404700 free,   273716 used,  2330840 buff/cache
KiB Swap:  8257532 total,  8257532 free,        0 used.  7412252 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND

​```
9 root      20   0       0      0      0 S   0.3  0.0   4:46.06 rcu_sched
​```

 1878 root      20   0   21692   1324   1000 S   0.3  0.0   1:59.66 irqbalance
 9540 root      20   0       0      0      0 S   0.3  0.0   0:57.49 kworker/0:1
15937 root      20   0  162096   2268   1592 R   0.3  0.0   0:00.05 top
22101 root      20   0       0      0      0 S   0.3  0.0   0:23.94 kworker/1:4
26850 root      20   0  275292   5028   3756 S   0.3  0.1  13:30.88 vmtoolsd

# free -m   -m 参数就是用 M显示内容使用情况
              total        used        free      shared  buff/cache   available
Mem:           7821         266        5278          16        2276        7238
Swap:          8063           0        8063
 
 
total=used+free
total:表示物理,内存总量–机器总的物理内存 单位为:M
used:用掉的内存{ 总计分配给缓存(包含Buffer和cache)使用的数量,但其中可能部分缓存并未实际使用 }
free: 空闲的物理内存–未被分配的内存
shared:共享内存,一般系统不会用到,这里也不讨论
buffers:系统分配但未被使用的buffers数量
cached:系统分配但未被使用的cache数量

2.查看 /var/log/message 是否存在 oom 的记录

grep "Out of memory" /var/log/messages

Linux 内核有个机制叫OOM killer(Out Of Memory killer)。该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉。

3. 核实总进程数是否超限,并修改总进程数 pid_max 配置。

查看系统 pid_max 值。 pid_max 默认值为32768。

root@:~# sysctl kernel.pid_max
kernel.pid_max = 32768

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

# yum install psmisc

pstree -p | wc -l  如没有此命令先安装
744
ps -eLf | wc -l

临时增加总进程数 pid_max

# sysctl -w kernel.pid_max=65535

kernel.pid_max = 65535

永久修改总进程数 pid_max,使配置立即生效。

# echo "kernel.pid_max = 65555" >> /etc/sysctl.conf

# sysctl -p

kernel.pid_max = 65555
posted @ 2024-04-19 12:32  sjkzy  阅读(427)  评论(0编辑  收藏  举报