cpu時間是一項重要的資源,有時,我們需要跟蹤某個時間內占用cpu周期最多的進程。
在普通的桌面系統或膝上系統中,cpu處於高負荷狀態也許不會引發什么問題。但對於需要處理大量請求的服務器來講,cpu是極其重要的資源。
通過監視某個時期內cpu的使用情況,我們可以找出長期占用cpu的進程並對其進行優化,或調試其它相關問題。
在linux系統中,ps命令用於收集系統中進程的詳細信息。這些信息包括cpu使用情況、正在執行的命令、內存使用、進程狀態等。記錄在一個小時內占用過的cpu的進程,然后通過恰當地運用ps以及文本處理就可以找出占用cpu最多的10個進程。
例子,監視並計算一小時內cpu使用情況的shell腳本。
#!/bin/bash # 文件名:pcpu_usage.sh # 用途:計算1小時內進程的cpu占用情況 SECS=3600 UNIT_TIME=60 # 將SECS更改成需要進行監視的總秒數 # UNIT_TIME是取樣的時間間隔,單位是秒 STEPS=$(( $SECS / $UNIT_TIME )) echo Watching CPU usage... ; for ((i=0;i<STEPS;i++)) do ps -eo comm,pcpu | tail -n +2 >> /tmp/cpu_usage.$$ sleep $UNIT_TIME done echo echo CPU eaters : cat /tmp/cpu_usage.$$ | \ awk ' { process[$1]+=$2 } END{ for(i in process) { printf("%-20s %s",i, process[i] ; } }' | sort -nrk 2 | head rm /tmp/cpu_usage.$$ #刪除臨時日志文件
輸出結果:
# ./pcpu_usage.sh
Watching CPU usage...
xofr 20
firefox-bin 15
bash 3
evince 2
pulseaudio 1.0
pcpu.sh 0.3
wpa_supplicant 0
wnck-applet 0
watchdog/0 0
usb-storage 0
注解:
以上腳本中,主要的輸入源是ps -eo comm,pcpu,其中comm表示命令名(command name),pcpu表示cpu例用率(CPU usae in percent)。該命令輸出所有進程名及CPU使用率。每個進程對應一行輸出。因為需要監視一個小時內CPU的使用情況,所以我們得在一個每次迭代時間為60秒的循環中不停地使用ps -eo comm,pcpu | tail -n +2來獲取CPU的使用統計數據,並將這些數據添加到文件/tmp/cpu_usage.$$中。60秒的迭代時間通過sleep 60來提供。這就使得每一分鍾執行一次ps。
tail -n +2用來將ps輸出中的頭部和COMMAND %CPU剝除。
cpu_usage.$$中的$$表示當前腳本的進程ID。假設進程ID為1345,那么在腳本執行時,它會被替換成/tmp/cpu_usage.1345。因為這是一個臨時文件,所以我們把它放在/tmp目錄中。
統計文件在1小時后,准備妥當,文件中包含了60項,分別對應每分鍾的進程狀態。
然后用awk求出每個進程的CPU使用情況。我們用了一個關聯數組來統計CPU的使用情況。其中進程名作為數組索引。
最后根據總的CPU使用情況依數值逆序排序,並通過head獲得前10項的值,加以輸出。
jquery中文網-原創文章,轉載請注明出處。