
我的一台伺服器完全沒有回應:
top - 06:16:53 up 2:14, 1 user, load average: 30.95, 29.96, 22.92
Tasks: 168 total, 2 running, 166 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 12.6 sy, 0.0 ni, 0.0 id, 86.4 wa, 0.0 hi, 0.0 si, 1.1 st
KiB Mem : 1014524 total, 61368 free, 877028 used, 76128 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 4196 avail Mem
scroll coordinates: y = 1/168 (tasks), x = 1/12 (fields)
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
30 root 20 0 0 0 0 S 11.1 0.0 4:04.70 kswapd0
1116 root 20 0 791548 44900 0 S 0.4 4.4 0:14.91 dockerd
1 root 20 0 37752 2664 864 D 0.2 0.3 0:06.00 systemd
很難說發生了什麼,因為我無法真正獲得太多資訊(反應遲鈍),但這就是我所看到的:
- 平均負載非常高
- 我看到大約 20% - 30% CPU 負載
- 我沒有看到高 IO/網路利用率
- 我無法識別運行隊列中有哪些進程
怎麼可能實現高平均負載和低 CPU 使用率?
答案1
您的記憶體不足且系統正在崩潰。沒有足夠的可用記憶體來將所有需要的進程頁面保存在記憶體中,因此作業系統必須釋放一些頁面才能從磁碟載入所需的頁面。由於沒有交換空間,要釋放的頁面無法寫入交換空間,因此唯一的選擇是丟棄只讀代碼頁或縮小緩衝區高速緩存。當執行前進到被丟棄的頁面時,必須再次讀入 RAM,但會犧牲其他頁面。在某些時候,問題會變得非常嚴重,以至於大部分時間都花在等待從磁碟載入頁面上,並且很少有 CPU 週期可用於有用的工作。
嘗試添加一些交換,儘管這可能有幫助,也可能沒有幫助,這取決於進程的負載模式。
答案2
可能是掛載點問題。當系統嘗試掛載當時不可用的掛載點時,它將開始增加系統負載,儘管您可能不會遇到某些進程囤積 CPU。
嘗試:
- 運行一下
mount
,看看是否有某個掛載點當時無法到達。 - 檢查
/etc/fstab
啟動時定義的所有安裝點,並查看當時是否無法到達其中任何一個。