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的利用率使用如下公式來計算。???
Total CPU time since boot?= user+nice+system+idle+iowait+irq+softirq+steal
%user = user / total. 注意:在top里,%user = (user + nice)/ total! Util = 100 - idle - iowait - steal出處:https://github.com/Leo-G/DevopsWiki/wiki/How-Linux-CPU-Usage-Time-and-Percentage-is-calculated
?? (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利用率打上去。但是如果是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%
?
轉載于:https://www.cnblogs.com/sunss/archive/2010/09/09/1821986.html
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的linux下如何获取cpu的利用率的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对当今社会的某些现象的感想
- 下一篇: 业务逻辑数据层SqlDataSource