linux下如何獲取cpu的利用率??

"proc文件系統是一個僞文件系統,它只存在內存當中,而不佔用外存空間。它以文件系統的方式爲訪問系統內核數據的操作提供接口。用戶和應用程序可以通過proc得到系統的信息,並可以改變內核的某些參數。"

    這裏將介紹如何從/proc文件系統中獲取與防火牆相關的一些性能參數,以及如何通過/proc文件系統修改內核的相關配置。

    1、從/proc文件系統獲取相關的性能參數
    cpu使用率:    /proc/stat
    內存使用情況:      /proc/meminfo
    網絡負載信息:    /proc/net/dev

相應的計算方法:(摘自:什麼是proc文件系統,見參考資料)
    (1)   處理器使用率   
    (2)   內存使用率   
    (3)   流入流出數據包   
    (4)   整體網絡負載   
     這些數據分別要從/proc/stat、/proc/net/dev、/proc/meminfo三個文件中提取。如裏有問題或對要提取的數據不太清楚,可以使用man   proc來查看proc文件系統的聯機手冊。   
    (1)   處理器使用率   
    這裏要從/proc/stat中提取四個數據:用戶模式(user)、低優先級的用戶模式(nice)、內核模式(system)以及空閒的處理器時間(idle)。它們均位於/proc/stat文件的第一行。CPU的利用率使用如下公式來計算。   
    CPU利用率   =   100   *(user   +   nice   +   system)/(user   +   nice   +   system   +   idle)   
   (2)   內存使用率   
    這裏需要從/proc/meminfo文件中提取兩個數據,當前內存的使用量(cmem)以及內存總量(amem)。   
    內存使用百分比   =   100   *   (cmem   /   umem)   
    (3)網絡利用率   
    爲了得到網絡利用率的相關數據,需要從/proc/net/dev文件中獲得兩個數據:從本機輸出的數據包數,流入本機的數據包數。它們都位於這個文件的第四行。   
    性能收集程序開始記錄下這兩個數據的初始值,以後每次獲得這個值後均減去這個初始值即爲從集羣啓動開始從本節點通過的數據包。   
    利用上述數據計算出網絡的平均負載,方法如下:   
    平均網絡負載   =   (輸出的數據包+流入的數據包)   /   2
   
    2. 通過/proc文件系統調整相關的內核配置
    允許ip轉發   /proc/sys/net/ipv4/ip_forward
    禁止ping    /proc/sys/net/ipv4/icmp_echo_ignore_all
   
    可以在命令行下直接往上述兩個“文件”裏頭寫入"1"來實現相關配置,如果寫入"0"將取消相關配置。不過在系統重啓以後,這些配置將恢復默認設置,所以,如果想讓這些修改生效,可以把下面的配置直接寫入/etc/profile文件,或者其他隨系統啓動而執行的程序文件中。
 
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

    如果需要獲取其他的性能參數,或者需要對內核進行更多的配置,可以參考下面鏈接中的proc文件系統介紹,也可以直接通過man proc查看相關的信息。

參考資料和相關鏈接

[1] 什麼是proc文件系統
http://blog.chinaunix.net/u1/37836/showart_304248.html
[2] Linux下如何獲取cpu的使用率
http://topic.csdn.net/t/20060701/23/4855045.html
[3] Exploring the /proc/net/ Directory
http://www.linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html?page=1
[4] /proc/net introduction
http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/en-US/Reference_Guide/s2-proc-dir-net.html
[5] 使用ulimit和proc去調整系統參數
http://www.linuxfly.org/post/73.htm

注:文件裏面是一個增量,每過一個時間間隔對應的項使用了CPU都會有增加,要算百分比,得用上上一次的狀態值.

這裏計算cpu使用率是有問題的,需要使用上一狀態的值來計算。
返回
elf 發表於 2007-11-16 09:06 #4

正確的計算方法是,等上一個時間:

1、記錄某個時刻cpu的使用情況
2、等上一個時間段
3、再記錄此刻的cpu使用情況
4、計算總的時間片
把第一次的所有cpu使用情況求和,得到j1
把第二次的所有cpu使用情況求和,得到j2
j2-j1得到這個時間段的所有時間片
即total=j2-j1=第二次的所有列的和-第一次的所有列的和
5、計算idle時間
idle對應第五列的數據,用第二次的減去第一次的即可
idle=第二次的第五列-第一次的第五列
6、計算cpu使用率
rate=(total-idle)/total
見:http://oss.lzu.edu.cn/blog/article.php?tid_1379.html


我們在搞性能測試的時候,對後臺服務器的CPU利用率監控是一個常用的手段。服務器的CPU利用率高,則表明服務器很繁忙。如果前臺響應時間越來越大,而後臺CPU利用率始終上不去,說明在某個地方有瓶頸了,系統需要調優。這個是即使不懂技術的人都容易理解的事情。

上面理解對嗎?我個人覺得不十分準確。這個要看後臺你測試的進程是什麼類型的。如果是計算密集型的進程,當前端壓力越來越大的時候,很容易把CPU利用率打上去。但是如果是I/O網絡密集型的進程,即使客戶端的請求越來越多,但是服務器CPU不一定能上去,這個是你要測試的進程的自然屬性決定的。

什麼是CPU利用率呢?在Linux/Unix下,CPU利用率分爲用戶態,系統態和空閒態,分別表示CPU處於用戶態執行的時間,系統內核執行的時間,和空閒系統進程執行的時間。從計算機加電開始,CPU就一直忙個不停,所以CPU的利用率始終是100%。當沒有用戶進程需要執行的時候,CPU就執行系統缺省的空閒進程。我們所指的CPU利用率是指CPU執行非系統空閒進程的時間 / CPU總的執行時間。

在Linux的內核中,有一個全局變量:Jiffies。 Jiffies代表時間。它的單位隨硬件平臺的不同而不同。系統裏定義了一個常數HZ,代表每秒種最小時間間隔的數目。這樣jiffies的單位就是 1/HZ。Intel平臺jiffies的單位是1/100秒,這就是系統所能分辨的最小時間間隔了。每個CPU時間片,Jiffies都要加1。 CPU的利用率就是用執行用戶態+系統態的Jiffies除以總的Jifffies來表示。

在Linux系統中,CPU利用率的計算來源在/proc/stat文件,這個文件的頭幾行記錄了每個CPU的用戶態,系統態,空閒態等狀態下的不同的Jiffies,常用的監控軟件就是利用/proc/stat裏面的這些數據來計算CPU的利用率的。
包含了所有CPU活動的信息,該文件中的所有值都是從系統啓動開始累計到當前時刻。
/proc/stat/
[work@builder ~]$ cat /proc/stat
cpu 432661 13295 86656 422145968 171474 233 5346
cpu0 123075 2462 23494 105543694 16586 0 4615
cpu1 111917 4124 23858 105503820 69697 123 371
cpu2 103164 3554 21530 105521167 64032 106 334
cpu3 94504 3153 17772 105577285 21158 4 24
intr 1065711094 1057275779 92 0 6 6 0 4 0 3527 0 0 0 70 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7376958 0 0 0 0 0 0 0 1054602 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 19067887
btime 1139187531
processes 270014
procs_running 1
procs_blocked 0


輸出解釋
CPU 以及CPU0、CPU1、CPU2、CPU3每行的每個參數意思(以第一行爲例)爲:
參數 解釋
user (432661) 從系統啓動開始累計到當前時刻,用戶態的CPU時間(單位:jiffies) ,不包含 nice值爲負進程。1jiffies=0.01秒
nice (13295) 從系統啓動開始累計到當前時刻,nice值爲負的進程所佔用的CPU時間(單位:jiffies)
system (86656) 從系統啓動開始累計到當前時刻,核心時間(單位:jiffies)
idle (422145968) 從系統啓動開始累計到當前時刻,除硬盤IO等待時間以外其它等待時間(單位:jiffies)
iowait (171474) 從系統啓動開始累計到當前時刻,硬盤IO等待時間(單位:jiffies) ,
irq (233) 從系統啓動開始累計到當前時刻,硬中斷時間(單位:jiffies)
softirq (5346) 從系統啓動開始累計到當前時刻,軟中斷時間(單位:jiffies)

CPU時間=user+system+nice+idle+iowait+irq+softirq

“intr”這行給出中斷的信息,第一個爲自系統啓動以來,發生的所有的中斷的次數;然後每個數對應一個特定的中斷自系統啓動以來所發生的次數。
“ctxt”給出了自系統啓動以來CPU發生的上下文交換的次數。
“btime”給出了從系統啓動到現在爲止的時間,單位爲秒。
“processes (total_forks) 自系統啓動以來所創建的任務的個數目。
“procs_running”:當前運行隊列的任務的數目。
“procs_blocked”:當前被阻塞的任務的數目。
 
那麼CPU利用率的計算方法:可以使用取兩個採樣點,計算其差值的辦法。
(idle2-idle1)/cpu2-cpu1

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章