核心程序在高負載期間週期性地吃掉 CPU
我執行一個具有 24 個核心的生產 Web 伺服器,其中的工作是 CPU 和 I/O 密集型的,但主要是 CPU。當總 CPU 負載約為 85% 或更高時,我的腳本會延遲執行,以保持負載可控。因此,CPU 承受的壓力永遠不會超過我的腳本所知道的它可以處理的壓力。
現在,我的伺服器在一次長達 3 小時的時間塊中進行最大容量生產。大部分時間工作進展順利,但在此期間,CPU系統負載往往會急劇增加。這是由於核心程序“events/x”、“migration/x”和“ksoftirqd/x”,其中“x”是該程序的 CPU 編號。我讀到這表明核心正在努力處理排隊的任務,這是在系統負載過大的情況下發生的。然而,正如我所提到的,我的 CPU 負載是主要瓶頸,故意保持在 ~85% 以避免此類問題。CPU 的這種核心使用會顯著降低生產速度,並且只會延長排隊的任務。奇怪的是,大約 30 分鐘後,系統負載會消失,隨著核心程序減少到零 CPU 使用率,只是稍後再次開始佔用 CPU。在這整個時間裡,提供給 CPU 的工作量沒有改變,通常處理得很好。但是,當這些核心程序啟動時,它會完全終止生產。
這是其中一個事件期間“top -u root”的輸出。使用者 CPU 使用率為 49%,因為系統使用率為 40%。通常這應該是使用者 ~85%,系統 ~5%。但是沒有iowait,系統負載平均為22(out of 24 cores),正常。
top - 13:10:49 up 44 days, 20:29, 1 user, load average: 22.87, 22.73, 21.36 Tasks: 622 total, 24 running, 585 sleeping, 0 stopped, 13 zombie Cpu(s): 49.4%us, 40.3%sy, 0.0%ni, 10.1%id, 0.1%wa, 0.0%hi, 0.2%si, 0.0%st Mem: 32728060k total, 31045092k used, 1682968k free, 353768k buffers Swap: 4194300k total, 243136k used, 3951164k free, 19117436k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 51 root RT 0 0 0 0 S 11.1 0.0 436:03.06 migration/12 100 root 20 0 0 0 0 S 9.5 0.0 49:19.45 events/1 114 root 20 0 0 0 0 S 5.9 0.0 48:14.75 事件/15 3 根 RT 0 0 0 0 S 4.3 0.0 517:58.05 遷移/0 112 根 20 0 0 0 0 S 3.6 0.0 42:00.54 事件/13 27 根 RT 0 0 0 0 S 2.3 0.0 200:59.58 遷移/6 8149 根 20 0 165m 7732 3928 S 2.3 0.0 0:00.07 exim 15 根 RT 0 0 0 0 S 2.0 0.0 450:05.62 遷移/3 39 根 RT 0 0 0 0 S 2.0 0.0 178:08.17 遷移/9 113 根 20 0 0 0 0 S 1.6 0.0 44:00.04 事件/14 178 根 20 0 0 0 0 R 1.6 0.0 53:27。57 kacpid 63 根 RT 0 0 0 0 S 1.3 0.0 439:11.96 遷移/15 81 根 20 0 0 0 0 S 1.0 0.0 17:14.83 ksoftirqd/19 104 根 20 0 0 0 0 S 1.0 0.0 44:58.55 事件/5 115 根 20 0 0 0 0 S 1.0 0.0 47:18.46 事件/16 9 根 20 0 0 0 0 S 0.7 0.0 13:56.20 ksoftirqd/1 25 根 20 0 0 0 0 S 0.7 0.0 12:46.52 ksoftirqd/5 57 根20 0 0 0 0 S 0.7 0.0 11:12.62 ksoftirqd/13 75 根 RT 0 0 0 0 S 0.7 0.0 181:00.24 遷移/18 118 根 20 0 0 0 0 S 0.7 0.0 30:13.06 事件/19 10497 根 20 0 77964 6244 4096 S 0.7 0.0 17:40.25 httpd83 ksoftirqd/19 104 根 20 0 0 0 0 S 1.0 0.0 44:58.55 事件/5 115 根 20 0 0 0 0 S 1.0 0.0 47:18.46 事件/16 9 根 20 0 0 0 0 S 0.7 0.0 13:56.20 ksoftirqd /1 25 根 20 0 0 0 0 S 0.7 0.0 12:46.52 ksoftirqd/5 57 根 20 0 0 0 0 S 0.7 0.0 11:12.62 ksoftirqd/13 75 根 RT 0 0 0 0 S 0.7 0.0 181:00.24 遷移/18 118 根 20 0 0 0 0 S 0.7 0.0 30:13.06 事件/19 10497 根 20 0 77964 6244 4096 S 0.7 0.0 17:40.25 httpd83 ksoftirqd/19 104 根 20 0 0 0 0 S 1.0 0.0 44:58.55 事件/5 115 根 20 0 0 0 0 S 1.0 0.0 47:18.46 事件/16 9 根 20 0 0 0 0 S 0.7 0.0 13:56.20 ksoftirqd /1 25 根 20 0 0 0 0 S 0.7 0.0 12:46.52 ksoftirqd/5 57 根 20 0 0 0 0 S 0.7 0.0 11:12.62 ksoftirqd/13 75 根 RT 0 0 0 0 S 0.7 0.0 181:00.24 遷移/18 118 根 20 0 0 0 0 S 0.7 0.0 30:13.06 事件/19 10497 根 20 0 77964 6244 4096 S 0.7 0.0 17:40.25 httpd7 0.0 12:46.52 ksoftirqd/5 57 根 20 0 0 0 0 S 0.7 0.0 11:12.62 ksoftirqd/13 75 根 RT 0 0 0 0 S 0.7 0.0 181:00.24 遷移/18 118 根 20 0 0 0 0 S 0.7 0.0 30:13.06 事件/19 10497 根 20 0 77964 6244 4096 S 0.7 0.0 17:40.25 httpd7 0.0 12:46.52 ksoftirqd/5 57 根 20 0 0 0 0 S 0.7 0.0 11:12.62 ksoftirqd/13 75 根 RT 0 0 0 0 S 0.7 0.0 181:00.24 遷移/18 118 根 20 0 0 0 0 S 0.7 0.0 30:13.06 事件/19 10497 根 20 0 77964 6244 4096 S 0.7 0.0 17:40.25 httpd
當 CPU 負載被嚴格控制為可管理時,這些程序的行為是否有任何潛在的解釋?記憶體不是問題,因為緩衝區/記憶體的使用量永遠不會超過系統容量的 30%。在搜尋網路時,每個人都指責系統負載過大,但我的伺服器的行為並不表明使用的資源應該導致這種鎖定。
任何建議,將不勝感激。
編輯:我已經在答案部分發布了似乎是解決方案的內容。
看來核心程序在與交換之間的傳輸過程中可能一直在竊取 CPU 時間。伺服器的記憶體設置不知何故在我不知情的情況下被重置,將 swappiness 設置為 60。從“sar -W”的輸出來看,掛斷似乎與 pswpin/s 和 pswpout/s 很大的高負載週期一致(大於 2.00 左右,有時高達 15.00)。將 swappiness 設置為 1 後,我沒有遇到核心程序的相同掛起,並且 sar -W 始終顯示接近零的值。總而言之,在資源需求量大且快速變化的情況下,在高負載和大記憶體傳輸期間進行激進的交換似乎會使系統陷入困境。