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