Arch-Linux
Linux:新伺服器上的 CPU 負載共享
我們有一個新的 Linux el6.x86_64 伺服器,在將我們所有的作業(主要是 java/C++/python/shell)程序移到這個新伺服器上之後,我們觀察到程序執行緩慢。例如,在以前的伺服器上執行的 python 腳本將在 30 分鐘內完成,而在新伺服器上則需要 4 小時來處理。
下面是來自新伺服器的 CPU 使用率統計資訊(用 top 擷取),它一次只顯示一個活動的任務。我需要你的幫助來理解以下內容:
- 如果它有 32 個 CPU,不應該有 32 個任務並行執行嗎?
- 所有這些 CPU 都線上,從 /sys/devices/system/cpu 驗證。是否有任何其他系統將 CPU 可用性設置得很低?
top - 02:04:04 up 5 days, 6:56, 32 users, load average: 3.63, 3.91, 3.47 Tasks: 1208 total, 1 running, 1207 sleeping, 0 stopped, 0 zombie Cpu0 : 23.4%us, 3.0%sy, 0.0%ni, 73.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu1 : 15.4%us, 5.6%sy, 0.0%ni, 79.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu2 : 12.2%us, 1.0%sy, 0.0%ni, 86.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu3 : 3.9%us, 0.3%sy, 0.0%ni, 95.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu4 : 19.3%us, 2.0%sy, 0.0%ni, 78.4%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st Cpu5 : 6.9%us, 0.3%sy, 0.0%ni, 92.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu6 : 1.3%us, 0.0%sy, 0.0%ni, 98.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu7 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu8 : 0.3%us, 0.3%sy, 0.0%ni, 99.0%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st Cpu9 : 0.7%us, 0.0%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu10 : 0.7%us, 0.0%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu11 : 0.7%us, 0.0%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu12 : 0.7%us, 0.0%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu13 : 1.0%us, 0.3%sy, 0.0%ni, 98.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu14 : 1.0%us, 0.0%sy, 0.0%ni, 99.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu15 : 0.7%us, 0.0%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu16 : 42.2%us, 4.0%sy, 0.0%ni, 53.5%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st Cpu17 : 0.7%us, 0.7%sy, 0.0%ni, 98.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu18 : 26.0%us, 2.0%sy, 0.0%ni, 71.7%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st Cpu19 : 0.7%us, 0.3%sy, 0.0%ni, 99.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu20 : 53.8%us, 4.0%sy, 0.0%ni, 41.2%id, 0.0%wa, 0.0%hi, 1.0%si, 0.0%st Cpu21 : 29.3%us, 1.3%sy, 0.0%ni, 69.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu22 : 2.0%us, 0.7%sy, 0.0%ni, 97.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu23 : 0.7%us, 0.0%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu24 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu25 : 0.7%us, 1.0%sy, 0.0%ni, 98.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu26 : 0.7%us, 1.3%sy, 0.0%ni, 98.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu27 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu28 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu29 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu30 : 2.6%us, 0.0%sy, 0.0%ni, 97.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu31 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 396867664k total, 391584344k used, 5283320k free, 414764k buffers
這些程序不會利用額外的核心來更快地執行,除非它們是通過使用執行緒或其他並行機制來設計的。
由於GIL(全域解釋器鎖),Python 尤其不擅長利用多個核心。您可以嘗試使用“多處理”Python 模組來實現更多的首選軟體。
除了購買具有更高時鐘速度的 CPU 之外,您無能為力來提高單核(非 I/O 綁定程序)的性能。但有時您會發現記憶體訪問和記憶體記憶體瓶頸。例如,如果您的機器包含多個通過NUMA連接連接在一起的 CPU,並且程序在這些 CPU 之間頻繁移動,則可能會出現 CPU 必須通過其他 CPU 通過NUMA連接頻繁訪問記憶體(連接到另一個 CPU 的記憶體可以訪問速度明顯慢於直接連接到“ this ”CPU 的記憶體)。
使用 cpuset(1) 命令嘗試將程序固定到特定 CPU 可能是值得的。如果這可行,您還應該查看各種 Kenel NUMA 行為調整參數。
**編輯添加:**另一個需要關注的領域是電源管理,也許由於節能過程,CPU 頻率正在縮減。您可以使用 cpupower(1) 命令檢查和設置 VPU 電源管理設置。