Linux統計進程的CPU利用率命令詳解

來源:互聯網
上載者:User

1.0 概述
在Linux的/proc檔案系統,可以看到自啟動時候開始,所有CPU消耗的時間片;對於個進程,也可以看到進程消耗的時間片。這是一個累計值,可以"非阻塞"的輸出。獲得一定時間間隔的兩次統計就可以計算出這段時間內的進程CPU利用率。

所以,是否存在一種簡單的,非阻塞的方式獲得進程的CPU利用率? 答案是:“沒有”。這裡給出來一個有趣的比喻:"這就像有人給你一張照片,要你回答照片中車子的速度一樣"

1.1 /proc/stat 統計總CPU消耗
這個概念在計算中並不重要,但是瞭解一下還是有益的。在/proc/[pid/]stat中我們可以看到系統統計的CPU時間消耗,這裡都統一使用1/USER_HZ為一個時間片(man proc),多數情況下USER_HZ都是取值100,所以這裡的一個時間片就是10ms。可以通過系統調用sysconf(_SC_CLK_TCK)來獲得準確USER_HZ的取值。

例如:

 代碼如下 複製代碼
# cat /proc/stat|grep "cpu "
cpu  77918485 720414 61184026 19052884316 12152363 1386 1476742 0 0

每一列對應的CPU消耗含義是(man proc):使用者態(user)、低優先順序使用者態(nice)、系統(sys)、閑置、IOWAIT(核心2.5.41+)、中斷(since 2.6.0+)、軟終端(since 2.6.0+)、steal(虛擬環境中其他OS消耗2.6.11+)、guest(為訪客OS運行虛擬CPU消耗2.6.24)

對應如下:

 代碼如下 複製代碼
# cat /proc/stat|grep "cpu "
     |usr      |nice   |sys      |idle        |iowait   |irq   |softirq |steal  |guest
cpu  |77918485 |720414 |61184026 |19052884316 |12152363 |1386  |1476742 |0      |0

所以,計算CPU總消耗可以使用如下shell命令:

 代碼如下 複製代碼
cat /proc/stat|grep "cpu "|awk '{for(i=2;i<=NF;i++)j+=$i;print "cpu_total_slice " j;}'
cpu_total_slice 19208187744

很多地方看到都只是統計前面四列或者五列,這是不完整的;不過,因為通常前四、五列是CPU的主要消耗,所以這樣如此計算也通常是準確的。例如,上例中,前面五列的消耗是CPU消耗的99.99%。

(tips:這裡的時間片和CPU時鐘中斷的jiffy不是一個概念,一個是核心態的,一個使用者態的)

1.2 進程消耗的CPU時間片
在proc檔案系統中,可以通過/proc/[pid]/stat獲得進程消耗的時間片,輸出的第14、15、16、17列分別對應進程使用者態CPU消耗、核心態的消耗、使用者態等待子進程的消耗、核心態等待子進程的消耗(man proc)。所以進程的CPU消耗可以使用如下命令:

 代碼如下 複製代碼
cat /proc/9583/stat|awk '{print "cpu_process_total_slice " $14+$15+$16+$17}'
cpu_process_total_slice 1068099tips

:從這裡可以看到,Linux並沒有進程層級的iowait統計,如果想知道系統的iowait是哪個進程導致,則還需要一些其他的工具輔助。

1.3 "非阻塞"的計算進程CPU利用率
從這裡也看到,是沒有某個時刻CPU利用率的說法的,也就沒法獲得某個時刻的CPU利用率。這就像物理中的"速度"的概念,沒有某一時刻速度的概念,速度一定是一個時間段之內的。那麼要"非阻塞"計算某個進程CPU利用率,則需要取兩次事件間隔進行計算,這兩次事件間隔的操作可以是非阻塞的。計算辦法如下:

* 時刻A,計算作業系統總CPU時間片消耗total_cpu_slice_A;計算進程總CPU時間片消耗;total_process_slice_A
* 時刻B,計算作業系統總CPU時間片消耗total_cpu_slice_B;計算進程總CPU時間片消耗;total_process_slice_BB時刻就可以"非阻塞"的計算這段時間進程的CPU利用率了:

 代碼如下 複製代碼
100%*(total_process_slice_B-total_process_slice_A)/(total_cpu_slice_B-total_cpu_slice_A)

1.4 ps命令顯示的CPU利用率是什麼意思

 代碼如下 複製代碼
man ps
......
       CPU usage is currently expressed as the percentage of time spent running during the entire lifetime of a process. This is
       not ideal, and it does not conform to the standards that ps otherwise conforms to. CPU usage is unlikely to add up to
       exactly 100%.
......

可以看到,ps命令%CPU顯示的是進程自啟動時刻起,直至當前的總平均CPU利用率。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.