cenots7.6系统报“fork:Cannot allocate memory” 报错的解决方法(实操)
最近客户现场部署的服务器,经常出现连接一台虚拟机无法ssh连接,想着大抵是关机了,又或是存储满了(经常遇到这样的事情,因为基本上都是做的厚置备,所以会导致分配容量大于实际容量)。
打开应用程序出现异常日志信息,如下图:,提示资源已达上限和内存不足,
预感到此事不大简单,进入控制台,输入
`w`
好家伙,输出,翻译一下:内存不足或者进程数超限
`fork:Cannot allocate memory
再次尝试输入,free
想查看当前内存使用情况,同样命令不执行,无法查看
在与使用人沟通后,直接关闭电源重启虚拟机解决。
ps:可执行命令解决方法
- 查看系统内存使用率是否过高,确定内存不足后禁用内存占用较多的无关服务或者添加内存。
通过 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