1. 程式人生 > >用/proc/stat計算cpu的佔用率

用/proc/stat計算cpu的佔用率

在Linux下,CPU利用率分為使用者態,系統態和空閒態,分別表示CPU處於使用者態執行的時間,系統核心執行的時間,和空閒系統程序執行的時間,三者之和就是CPU的總時間,當沒有使用者程序、系統程序等需要執行的時候,CPU就執行系統預設的空閒程序。從平常的思維方式理解的話,CPU的利用率就是非空閒程序佔用時間的比例,即CPU執行非空閒程序的時間 CPU總的執行時間。

在Linux系統中,CPU時間的分配資訊儲存在/proc/stat檔案中,利用率的計算應該從這個檔案中獲取資料。檔案的頭幾行記錄了每個CPU的使用者態,系統態,空閒態等狀態下分配的時間片(單位是Jiffies),這些資料是從CPU加電到當前的累計值。常用的監控軟體就是利用/proc/stat裡面的這些資料來計算CPU的利用率的。

不同版本的linux /proc/stat檔案內容不一樣,以Linux 2.6來說,/proc/stat檔案的內容如下:

cpu 2032004 102648 238344 167130733 758440 15159 17878 0

cpu0 1022597 63462 141826 83528451 366530 9362 15386 0

cpu1 1009407 39185 96518 83602282 391909 5796 2492 0

intr 303194010 212852371 3 0 0 11 0 0 2 1 1 0 0 3 0 11097365 0 72615114 6628960 0 179 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

ctxt 236095529

btime 1195210746

processes 401389

procs_running 1

procs_blocked 0

第一行的數值表示的是CPU總的使用情況,所以我們只要用第一行的數字計算就可以了。下表解析第一行各數值的含義(單位:jiffies)

user (2032004)

從系統啟動開始累計到當前時刻,使用者態的CPU時間,不包含nice值為負程序。

nice (102648)

從系統啟動開始累計到當前時刻,nice值為負的程序所佔用的CPU時間

system (238344)

從系統啟動開始累計到當前時刻,核心時間

idle (167130733)

從系統啟動開始累計到當前時刻,除IO等待時間以外其它等待時間

iowait (758440)

從系統啟動開始累計到當前時刻,IO等待時間

irq (15159)

從系統啟動開始累計到當前時刻,硬中斷時間

softirq (17878)

從系統啟動開始累計到當前時刻,軟中斷時間

因為/proc/stat中的數值都是從系統啟動開始累計到當前時刻的積累值,所以需要在不同時間點t1和t2取值進行比較運算,當兩個時間點的間隔較短時,就可以把這個計算結果看作是CPU的即時利用率。

CPU的即時利用率的計算公式:

CPU在t1到t2時間段總的使用時間 = ( user2+ nice2+ system2+ idle2+ iowait2+ irq2+ softirq2) - ( user1+ nice1+ system1+ idle1+ iowait1+ irq1+ softirq1)

CPU在t1到t2時間段空閒使用時間 = (idle2 - idle1)

CPU在t1到t2時間段即時利用率 =  1 - CPU空閒使用時間 / CPU總的使用時間

  這些值是誰,什麼時候記錄的呢?

每次timer的中斷就會記錄一次,記錄在struct cpu_usage_stat 裡,實現在timer_tick ->update_process_times裡。
那麼它的精度就是HZ,如果HZ是100,就意味著每S記錄100次。這個精度當然是不高的,而且容易出錯,下面是在Documentation/cpu-load.txt中的一個例子:
  time line between two timer interrupts
 |--------------------------------------|
 ^                                    ^
 |_ user appA begins working          |
                                      |_ user appA goes to sleep
結果這個A的動作沒有被記錄下來,這一S有可能被記錄到其他的頭上。如果你做的程式正好是那個其他,你就會抱怨說,這真是一陀屎呀。
那麼有沒有高精度的記錄呢?
有,但是要自己寫,就算你用oprofile之類的,他的原理也是用timer_interrupt記錄的,你可以用其他的高精度timer,但是,頻繁的中斷會把系統弄死。所以要自己寫,假設有一個高精度的硬體counter,好像x86下的TimeStamp Counter,
在cpu_idle 裡記錄idle的時間,在asm_do_IRQ裡記錄處理irq的時間,在context_switch記錄進入了那個process,以及時間,在__do_softirq裡記錄處理softirq的時間,把這些東西記錄在一塊全域性數組裡。

相關推薦

/proc/stat計算cpu用率

在Linux下,CPU利用率分為使用者態,系統態和空閒態,分別表示CPU處於使用者態執行的時間,系統核心執行的時間,和空閒系統程序執行的時間,三者之和就是CPU的總時間,當沒有使用者程序、系統程序等需要執行的時候,CPU就執行系統預設的空閒程序。從平常的思維方式理解的話,CPU的利用率就是非空閒程序佔用時間的

linux下/proc/stat 計算CPU利用率

一般來說對於需要大量cpu計算的程序,當前端壓力越大時,CPU利用率越高。但對於I/O網路密集型的程序,即使請求很多,伺服器的CPU也不一定很到,這時的服務瓶頸一般是在磁碟的I/O上。比較長見的就是,大檔案頻繁讀寫的cpu開銷遠小於小檔案頻繁讀寫的開銷。因為在I/O吞吐量一

MyEclipse時CPU用率老是100%,javaw.exe得高

先是一開啟就很高,後來在網上找找找找,找了半天也沒有找出來,後來發現只是在編輯那個Jsp的時候是,換個別的就沒有問題了 ,估計這個頁面有問題啊。 或者JSP編輯器有問題,可以換個編輯器 ============================

java獲取JVM的CPU用率、記憶體用率、執行緒數及伺服器的網口吞吐率、磁碟讀寫速率

怎麼說呢,本人菜鳥一枚,費了幾天時間,終於做了一個用java獲取JVM的CPU佔用率、記憶體佔用率、執行緒數及伺服器的網口吞吐率、磁碟讀寫速率的實現。 其中windows環境下獲取jvm 的cpu佔用率這裡是參考網上別人的東西(在此感謝提供參考的網友),其他的都是基於自己的想法做出來的。該工具類

【轉】Linux下java程序CPU用率高分析方法

文章轉載的地址: https://blog.linuxeye.cn/343.html   在工作當中,肯定會遇到由程式碼所導致的高CPU耗用以及記憶體溢位的情況。這種情況發生時,我們怎麼去找出原因並解決。 一般解決方法是通過top命令找出消耗資源高的執行緒id,利用strace命令檢視該執行緒

Java獲取CPU用率

原文連結:https://www.jianshu.com/p/015cc4805e29 最近做一個Java效能統計的問題,需要統計當前程序佔用CPU的情況,最開始使用Java MxBean來獲取 OperatingSystemMXBean osMxBean = ManagementFactory

Sublime Text 3 CPU用率過高 && WebStorm記憶體佔用過高

  用Sublime Text 3或WebStorm進行前端開發時,遇到了同樣的問題:當專案檔案比較多或檔案比較大時,CPU佔用率或記憶體佔用持續比較高,後來經查閱發現是index files導致的,可以理解為:Sublime Text 3或WebStorm需要不斷重新整理檔案索引,不斷將專案檔案從硬碟中讀到

一行命令讓CPU用率達到100%

一行命令讓CPU佔用率達到100% for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`; do dd if=/dev/zero of=/dev/null & done 說明:

記一次CPU用率和load高的排查

  前不久公司進行了一次大促,晚上值班。大促是從晚上8點多開始的,一開始流量慢慢的進來,觀察了應用的各項指標,一切都是正常的,因為這是雙11過後的第一次大促,想著使用者的購買慾應該不會太強,所以我們的運維同事9點多就回家了在家裡面遠端支援,留下交易組和其它後端的技術值班,樓主就是交易組的。誰知10點整的時候我

(轉)linux top命令中各cpu用率含義及案例分析

原文:https://blog.csdn.net/ydyang1126/article/details/72820349 linux top命令中各cpu佔用率含義 0 效能監控介紹 1 確定應用型別 2 確定基準線統計 0 安裝監控工具

intellij idea cpu用率太大太滿 執行速度太慢 使了五個解決方法最終成功

突然發現,intellij idea 特別卡,在程式碼間移動的時候,居然重新整理都跟不上,然後開啟工作管理員一看,CPU佔用率100%。。。intellij idea自己一個程式的佔用率就高達80~90,這還只是單純的開啟,沒有做其他任何操作。然後,就是解決唄。 方法一:升級idea。 去官

Java 獲取 CPU 用率

轉自:https://www.jianshu.com/p/015cc4805e29 最近做一個Java效能統計的問題,需要統計當前程序佔用CPU的情況,最開始使用Java MxBean來獲取: OperatingSystemMXBean osMxBean = ManagementFactor

linux問題排查 - 高cpu用率的程序和執行緒

1.簡介           一個程式,完成它預設的功能,並不能說明它是一個優良的程式。好的程式,應該是對資源的合理利用,亦或是 用更少的資源(使用合理的演算法),實現更多有效的產出。 &

寫一個守護程序+cpu用率在20%波動的程式

1.cpu佔用率在20%波動的程式怎麼寫 //makecpu.c void makeCpu() { int time_start; int fulltime = 100;//總時間

線上Java程式導致伺服器CPU用率過高的問題排除過程

1、故障現象 客服同事反饋平臺系統執行緩慢,網頁卡頓嚴重,多次重啟系統後問題依然存在,使用top命令檢視伺服器情況,發現CPU佔用率過高。 2、CPU佔用過高問題定位 2.1、定位問題程序 使用top命令檢視資源佔用情況,發現pid為14063的程序佔用了大量的CPU

程式碼執行時 CPU用率100%的解決方法

原因:        建立連線後啟動新的執行緒,如果執行緒中有簡單粗暴的不含阻塞的while(1)迴圈,會持續佔用CPU,導致CPU佔用率極高。 解決: 在while(1)的大迴圈中插入一句sleep

雲伺服器 ECS Linux 系統 CPU 用率較高問題排查思路

如果雲伺服器 ECS Linux 系統的 CPU 持續跑高,則會對系統穩定性和業務執行造成影響。本文對 CPU 佔用率較高問題的排查分析做簡要說明。可以通過 vmstat 從系統維度檢視 CPU 資源的使用情況。用法說明:格式:vmstat -n 1-n 1表示結果一秒重新整理一次。示例輸出:$ vmstat

Linux 系統 CPU 用率較高問題排查思路

CPU負載檢視方法: 使用vmstat檢視系統維度的CPU負載 使用top檢視程序維度的CPU負載 使用 vmstat 檢視系統緯度的 CPU 負載: 可以通過 vmstat 從系統維度檢視 CPU 資源的使用情況。 用法說明: 格式:vmstat -n 1# -n 1

JVM FULL GC太頻繁,CPU用率過高問題

一,問題描述    今天上午時候,kafka的一個topic湧上來超過平常值的一堆資料,消費客戶端就開始出現了幾個明顯的問題:       1,首先是ZK連線超時       2,CPU飆升到400% 

vmware-vmx exe程序CPU用率100 解決方法

                為什麼會有這個問題我不懂,造成這個問題的原因可能有很多。我也不清楚在我電腦上造成這個問題的原因是什