cenots7.6系統報“fork:Cannot allocate memory” 報錯的解決方法(實操)

sjkzy發表於2024-04-19

最近客戶現場部署的伺服器,經常出現連線一臺虛擬機器無法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

相關文章