使用sysbench模擬多線程調度:sysbench --threads=10 --time=300 threads run
使用vmstat查看CPU上下文切換:
cs列上下文切換次數超過150萬次。
r列就緒隊列長度最大達到8,超過系統CPU的個數4,存在大量的CPU競爭。
sy列超過70%,說明CPU主要是被內核佔用。
in列中斷次數上升到40000以上,說明中斷處理也是個潛在的問題。
系統就緒隊列過長,即正在運行和等待CPU的進程數過多,致使大量的上下文切換,而上下文切換又致使了系統 CPU 的佔用率升高。
使用pidstat -wt 3查看具體線程:
sysbench線程的cswch超過40000,nvcswch超過100000。性能優化
觀察CPU的中斷使用狀況:watch -d cat /proc/interrupts
重調度中斷(RES)超過400萬次,用於喚醒空閒狀態的CPU來調度新的任務運行。多處理器系統(SMP)中,處理器間中斷(Inter-Processor Interrupts,IPI)用來分散任務到不一樣CPU的機制。多線程
第一個終端運行stress命令,模擬一個CPU使用率100%的場景。stress --cpu 1 --timeout 600
在第二個終端運行uptime查看平均負載的變化狀況。watch -d uptime
在第三個終端運行mpstat查看CPU使用率的變化狀況。mpstat -P ALL 5
監控全部CPU,每隔5秒輸出一次。
第二個終端uptime監控的1分鐘的平均負載會緩慢增長到1.21。
第三個終端中CPU3的使用率爲96%,但相應iowait只有0,平均負載的升高是因爲CPU使用率爲100%。
第四個終端運行pidstat查看進程的CPU使用率,發現stress進程的CPU使用率爲100%。pidstat -u 5 1
ide
第一個終端運行stress命令,模擬一個IO密集型進程。stress -i 1 --hdd 1 --timeout 600
第二個終端運行uptime查看平均負載的變化狀況。watch -d uptime
第三個終端運行mpstat查看CPU使用率的變化狀況。mpstat -P ALL 5
第四個終端運行pidstat查看進程的CPU使用率,發現stress進程的CPU使用率相對比較高。pidstat -u 5 1
函數
當系統中運行進程超出CPU運行能力時,就會出現等待CPU的進程。
第一個終端運行stress命令,模擬10個進程的場景。stress -c 10 --timeout 600
因爲系統只有4個邏輯CPU,比10個進程要少得多,於是,系統的CPU處於嚴重過載狀態,平均負載高達9.96。
mpstat查看CPU使用率都接近100%。
10個進程爭搶4個邏輯CPU,每一個進程等待CPU時間(%wait 列)高達60%,嚴重超出CPU計算能力,最終致使CPU過載。
性能
sysbench --threads=8 --time=600 cpu run
使用sysbench開啓8線程壓力測試,持續時間600秒測試
sudo perf top -g -p 30388
實時分析sysbench進程30388的性能
選擇sysbench,按ENTER鍵。
選擇CPU使用率最大的cpu_execute_eventh函數,按ENTER鍵進入查看。
選擇Annotate cpu_execute_event按ENTER鍵進入,查看函數內部調用所佔CPU。
從cpu_excute_event函數調用看,取模運算佔用CPU使用率高達70%以上。
優化
perf record -g -p 28068
採樣sysbench進程性能數據perf report
解析性能數據
線程