linux下如何擷取cpu的利用率

來源:互聯網
上載者:User

"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附改進過後的shell代碼

 1 #!/bin/sh
2  
3 #功能:計算CPU的利用率,選取採樣點
4 #計算公式:
5 #方法1:cpu usage=(idle2-idle1)/(cpu2-cpu1)*100
6 #方法2: cpu usage=[(user_2 +sys_2+nice_2) - (user_1 + sys_1+nice_1)]/(total_2 - total_1)*100
7 #方法3:(本指令碼採用)
8 #total_0=USER[0]+NICE[0]+SYSTEM[0]+IDLE[0]+IOWAIT[0]+IRQ[0]+SOFTIRQ[0]
9 #total_1=USER[1]+NICE[1]+SYSTEM[1]+IDLE[1]+IOWAIT[1]+IRQ[1]+SOFTIRQ[1]
10 #cpu usage=(IDLE[0]-IDLE[1]) / (total_0-total_1) * 100
11  
12 ##echo user nice system idle iowait irq softirq
13 CPULOG_1=$(awk '/\<cpu\>/{print $2" "$3" "$4" "$5" "$6" "$7" "$8}' /proc/stat)
14 SYS_IDLE_1=$(echo $CPULOG_1 | awk '{print $4}')
15 Total_1=$(echo $CPULOG_1 | awk '{print $1+$2+$3+$4+$5+$6+$7}')
16
17 sleep 5
18
19 CPULOG_2=$(awk '/\<cpu\>/{print $2" "$3" "$4" "$5" "$6" "$7" "$8}' /proc/stat)
20 SYS_IDLE_2=$(echo $CPULOG_2 | awk '{print $4}')
21 Total_2=$(echo $CPULOG_2 | awk '{print $1+$2+$3+$4+$5+$6+$7}')
22
23 SYS_IDLE=`expr $SYS_IDLE_2 - $SYS_IDLE_1`
24
25 Total=`expr $Total_2 - $Total_1`
26
27 #method 1
28 #SYS_USAGE=`expr $SYS_IDLE/$Total*100 |bc -l`
29 #SYS_Rate=`expr 100-$SYS_USAGE |bc -l`
30
31 #method2
32 tmp_rate=`expr 1-$SYS_IDLE/$Total | bc -l`
33 SYS_Rate=`expr $tmp_rate*100 | bc -l`
34
35 #display
36 Disp_SYS_Rate=`expr "scale=3; $SYS_Rate/1" |bc`
37 echo $Disp_SYS_Rate%

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.