/proc/ /stat
包含了所有CPU活躍的信息,該文件中的所有值都是從系統啓動開始累計到當前時刻。
[root@localhost ~]# cat /proc/6873/stat
6873 (a.out) R 6723 6873 6723 34819 6873 8388608 77 0 0 0 41958 31 0 0 25 0 3 0 5882654 1409024 56 4294967295 134512640 134513720 3215579040 0 2097798 0 0 0 0 0 0 0 17 0 0 0 [root@localhost ~]#
每個參數意思爲:
參數 解釋
pid=6873 進程(包括輕量級進程,即線程)號
comm=a.out 應用程序或命令的名字
task_state=R 任務的狀態,R:runnign, S:sleeping (TASK_INTERRUPTIBLE), D:disk sleep (TASK_UNINTERRUPTIBLE), T: stopped, T:tracing stop,Z:zombie, X:dead
ppid=6723 父進程ID
pgid=6873 線程組號
sid=6723 c該任務所在的會話組ID
tty_nr=34819(pts/3) 該任務的tty終端的設備號,INT(34817/256)=主設備號,(34817-主設備號)=次設備號
tty_pgrp=6873 終端的進程組號,當前運行在該任務所在終端的前臺任務(包括shell 應用程序)的PID。
task->flags=8388608 進程標誌位,查看該任務的特性
min_flt=77 該任務不需要從硬盤拷數據而發生的缺頁(次缺頁)的次數
cmin_flt=0 累計的該任務的所有的waited-for進程曾經發生的次缺頁的次數目
maj_flt=0 該任務需要從硬盤拷數據而發生的缺頁(主缺頁)的次數
cmaj_flt=0 累計的該任務的所有的waited-for進程曾經發生的主缺頁的次數目
utime=1587 該任務在用戶態運行的時間,單位爲jiffies
stime=1 該任務在覈心態運行的時間,單位爲jiffies
cutime=0 累計的該任務的所有的waited-for進程曾經在用戶態運行的時間,單位爲jiffies
cstime=0 累計的該任務的所有的waited-for進程曾經在覈心態運行的時間,單位爲jiffies
priority=25 任務的動態優先級
nice=0 任務的靜態優先級
num_threads=3 該任務所在的線程組裏線程的個數
it_real_value=0 由於計時間隔導致的下一個 SIGALRM 發送進程的時延,以 jiffy 爲單位.
start_time=5882654 該任務啓動的時間,單位爲jiffies
vsize=1409024(page) 該任務的虛擬地址空間大小
rss=56(page) 該任務當前駐留物理地址空間的大小
Number of pages the process has in real memory,minu 3 for administrative purpose.
這些頁可能用於代碼,數據和棧。
rlim=4294967295(bytes) 該任務能駐留物理地址空間的最大值
start_code=134512640 該任務在虛擬地址空間的代碼段的起始地址
end_code=134513720 該任務在虛擬地址空間的代碼段的結束地址
start_stack=3215579040 該任務在虛擬地址空間的棧的結束地址
kstkesp=0 esp(32 位堆棧指針) 的當前值, 與在進程的內核堆棧頁得到的一致.
kstkeip=2097798 指向將要執行的指令的指針, EIP(32 位指令指針)的當前值.
pendingsig=0 待處理信號的位圖,記錄發送給進程的普通信號
block_sig=0 阻塞信號的位圖
sigign=0 忽略的信號的位圖
sigcatch=082985 被俘獲的信號的位圖
wchan=0 如果該進程是睡眠狀態,該值給出調度的調用點
nswap 被swapped的頁數,當前沒用
cnswap 所有子進程被swapped的頁數的和,當前沒用
exit_signal=17 該進程結束時,向父進程所發送的信號
task_cpu(task)=0 運行在哪個CPU上
task_rt_priority=0 實時進程的相對優先級別
task_policy=0 進程的調度策略,0=非實時進程,1=FIFO實時進程;2=RR實時進程
/proc文件系統是一個僞文件系統,它只存在內存當中,而不佔用外存空間。它以文件系統的方式爲內核與進程提供通信的接口。用戶和應用程序可以通過/proc得到系統的信息,並可以改變內核的某些參數。由於系統的信息,如進程,是動態改變的,所以用戶或應用程序讀取/proc目錄中的文件時,proc文件系統是動態從系統內核讀出所需信息並提交的。
/proc目錄中有一些以數字命名的目錄,它們是進程目錄。系統中當前運行的每一個進程在/proc下都對應一個以進程號爲目錄名的目錄/proc/pid,它們是讀取進程信息的接口。此外,在Linux 2.6.0-test6以上的版本中/proc/pid目錄中有一個task目錄,/proc/pid/task目錄中也有一些以該進程所擁有的線程的線程號命名的目錄/proc/pid/task/tid,它們是讀取線程信息的接口。
/proc/cpuinfo文件
該文件中存放了有關 cpu的相關信息(型號,緩存大小等)。
[zhengangen@buick ~]$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 10
cpu MHz : 3001.177
cache size : 2048 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 1
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe lm pni monitor ds_cpl cid xtpr
bogomips : 6004.52
說明:以下只解釋對我們計算Cpu使用率有用的相關參數。
參數 解釋
processor (0) cpu的一個物理標識
結論1:可以通過該文件根據processor出現的次數統計cpu的邏輯個數(包括多核、超線程)。
/proc/stat文件
該文件包含了所有CPU活動的信息,該文件中的所有值都是從系統啓動開始累計到當前時刻。不同內核版本中該文件的格式可能不大一致,以下通過實例來說明數據該文件中各字段的含義。
實例數據:2.6.24-24版本上的
fjzag@fjzag-desktop:~$ cat /proc/stat
cpu 38082 627 27594 893908 12256 581 895 0 0
cpu0 22880 472 16855 430287 10617 576 661 0 0
cpu1 15202 154 10739 463620 1639 4 234 0 0
intr 120053 222 2686 0 1 1 0 5 0 3 0 0 0 47302 0 0 34194 29775 0 5019 845 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1434984
btime 1252028243
processes 8113
procs_running 1
procs_blocked 0
第一行的數值表示的是CPU總的使用情況,所以我們只要用第一行的數字計算就可以了。下表解析第一行各數值的含義:
參數 解析(單位:jiffies)
(jiffies是內核中的一個全局變量,用來記錄自系統啓動一來產生的節拍數,在linux中,一個節拍大致可理解爲操作系統進程調度的最小時間片,不同linux內核可能值有不同,通常在1ms到10ms之間)
user (38082) 從系統啓動開始累計到當前時刻,處於用戶態的運行時間,不包含 nice值爲負進程。
nice (627) 從系統啓動開始累計到當前時刻,nice值爲負的進程所佔用的CPU時間
system (27594) 從系統啓動開始累計到當前時刻,處於核心態的運行時間
idle (893908) 從系統啓動開始累計到當前時刻,除IO等待時間以外的其它等待時間iowait (12256) 從系統啓動開始累計到當前時刻,IO等待時間(since 2.5.41)
irq (581) 從系統啓動開始累計到當前時刻,硬中斷時間(since 2.6.0-test4)
softirq (895) 從系統啓動開始累計到當前時刻,軟中斷時間(since 2.6.0-test4)stealstolen(0) which is the time spent in other operating systems when running in a virtualized environment(since 2.6.11)
guest(0) which is the time spent running a virtual CPU for guest operating systems under the control of the Linux kernel(since 2.6.24)
結論2:總的cpu時間totalCpuTime = user + nice + system + idle + iowait + irq + softirq + stealstolen + guest
/proc/<pid>/stat文件
該文件包含了某一進程所有的活動的信息,該文件中的所有值都是從系統啓動開始累計
到當前時刻。以下通過實例數據來說明該文件中各字段的含義。
[zhengangen@buick ~]# cat /proc/6873/stat
6873 (a.out) R 6723 6873 6723 34819 6873 8388608 77 0 0 0 41958 31 0 0 25 0 3 0 5882654 1409024 56 4294967295 134512640 134513720 3215579040 0 2097798 0 0 0 0 0 0 0 17 0 0 0
說明:以下只解釋對我們計算Cpu使用率有用相關參數
參數 解釋
pid=6873 進程號
utime=1587 該任務在用戶態運行的時間,單位爲jiffies
stime=41958 該任務在覈心態運行的時間,單位爲jiffies
cutime=0 所有已死線程在用戶態運行的時間,單位爲jiffies
cstime=0 所有已死在覈心態運行的時間,單位爲jiffies
結論3:進程的總Cpu時間processCpuTime = utime + stime + cutime + cstime,該值包括其所有線程的cpu時間。
/proc/<pid>/task/<tid>/stat文件
該文件包含了某一進程所有的活動的信息,該文件中的所有值都是從系統啓動開始累計到當前時刻。該文件的內容格式以及各字段的含義同/proc/<pid>/stat文件。
注意,該文件中的tid字段表示的不再是進程號,而是linux中的輕量級進程(lwp),即我們通常所說的線程。
結論4:線程Cpu時間threadCpuTime = utime + stime
系統中有關進程cpu使用率的常用命令
ps 命令
通過ps命令可以查看系統中相關進程的Cpu使用率的信息。以下在linux man文檔中對ps命令輸出中有關cpu使用率的解釋:
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%.
%cpu cpu utilization of the process in "##.#" format. It is the CPU time used divided by the time the process has been running (cputime/realtime ratio), expressed as a percentage. It will not add up to 100% unless you are lucky.
結論5:ps命令算出來的cpu使用率相對於進程啓動時的平均值,隨着進程運行時間的增大,該值會趨向於平緩。
top命令
通過top命令可以查看系統中相關進程的實時信息(cpu使用率等)。以下是man文檔中對top命令輸出中有關進程cpu使用率的解釋。
#C -- Last used CPU (SMP) A number representing the last used processor. In a true SMP environment this will likely change frequently since the kernel intentionally uses weak affinity. Also, the very act of running top may break this weak affinity and cause more processes to change CPUs more often (because of the extra demand for cpu time).
%CPU -- CPU usage The task’s share of the elapsed CPU time since the last screen update, expressed as a percent-age of total CPU time. In a true SMP environment, if Irix mode is Off, top will operate in Solaris mode where a task’s cpu usage will be divided by the total number of CPUs.
結論6:某一個線程在其運行期間其所使用的cpu可能會發生變化。
結論7:在多核的情況下top命令輸出的cpu使用率實質是按cpu個數*100%計算的。<!--[if !supportAnnotations]-->
單核情況下Cpu使用率的計算
基本思想
通過讀取/proc/stat 、/proc/<pid>/stat、/proc/<pid>/task/<tid>/stat以及/proc/cpuinfo這幾個文件獲取總的Cpu時間、進程的Cpu時間、線程的Cpu時間以及Cpu的個數的信息,然後通過一定的算法進行計算(採樣兩個足夠短的時間間隔的Cpu快照與進程快照來計算進程的Cpu使用率)。
總的Cpu使用率計算
計算方法:
<!--[if !supportLists]-->1、 <!--[endif]-->採樣兩個足夠短的時間間隔的Cpu快照,分別記作t1,t2,其中t1、t2的結構均爲:
(user、nice、system、idle、iowait、irq、softirq、stealstolen、guest)的9元組;
<!--[if !supportLists]-->2、 <!--[endif]-->計算總的Cpu時間片totalCpuTime
<!--[if !supportLists]-->a) <!--[endif]-->把第一次的所有cpu使用情況求和,得到s1;
<!--[if !supportLists]-->b) <!--[endif]-->把第二次的所有cpu使用情況求和,得到s2;
<!--[if !supportLists]-->c) <!--[endif]-->s2 - s1得到這個時間間隔內的所有時間片,即totalCpuTime = j2 - j1 ;
3、計算空閒時間idle
idle對應第四列的數據,用第二次的第四列 - 第一次的第四列即可
idle=第二次的第四列 - 第一次的第四列
6、計算cpu使用率
pcpu =100* (total-idle)/total
某一進程Cpu使用率的計算
計算方法:
<!--[if !supportLists]-->1. <!--[endif]-->採樣兩個足夠短的時間間隔的cpu快照與進程快照,
<!--[if !supportLists]-->a) <!--[endif]-->每一個cpu快照均爲(user、nice、system、idle、iowait、irq、softirq、stealstolen、guest)的9元組;
<!--[if !supportLists]-->b) <!--[endif]-->每一個進程快照均爲 (utime、stime、cutime、cstime)的4元組;
<!--[if !supportLists]-->2. <!--[endif]-->分別根據結論2、結論3計算出兩個時刻的總的cpu時間與進程的cpu時間,分別記作:totalCpuTime1、totalCpuTime2、processCpuTime1、processCpuTime2
<!--[if !supportLists]-->3. <!--[endif]-->計算該進程的cpu使用率pcpu = 100*( processCpuTime2 – processCpuTime1) / (totalCpuTime2 – totalCpuTime1) (按100%計算,如果是多核情況下還需乘以cpu的個數);
實驗數據
/proc/ /stat [root@localhost ~]# cat /proc/6873/stat 每個參數意思爲: /proc文件系統是一個僞文件系統,它只存在內存當中,而不佔用外存空間。它以文件系統的方式爲內核與進程提供通信的接口。用戶和應用程序可以通過/proc得到系統的信息,並可以改變內核的某些參數。由於系統的信息,如進程,是動態改變的,所以用戶或應用程序讀取/proc目錄中的文件時,proc文件系統是動態從系統內核讀出所需信息並提交的。 /proc目錄中有一些以數字命名的目錄,它們是進程目錄。系統中當前運行的每一個進程在/proc下都對應一個以進程號爲目錄名的目錄/proc/pid,它們是讀取進程信息的接口。此外,在Linux 2.6.0-test6以上的版本中/proc/pid目錄中有一個task目錄,/proc/pid/task目錄中也有一些以該進程所擁有的線程的線程號命名的目錄/proc/pid/task/tid,它們是讀取線程信息的接口。 /proc/cpuinfo文件 [zhengangen@buick ~]$ cat /proc/cpuinfo 說明:以下只解釋對我們計算Cpu使用率有用的相關參數。 參數 解釋
fjzag@fjzag-desktop:~$ cat /proc/stat 第一行的數值表示的是CPU總的使用情況,所以我們只要用第一行的數字計算就可以了。下表解析第一行各數值的含義: 參數 解析(單位:jiffies) nice (627) 從系統啓動開始累計到當前時刻,nice值爲負的進程所佔用的CPU時間 system (27594) 從系統啓動開始累計到當前時刻,處於核心態的運行時間 idle (893908) 從系統啓動開始累計到當前時刻,除IO等待時間以外的其它等待時間iowait (12256) 從系統啓動開始累計到當前時刻,IO等待時間(since 2.5.41) irq (581) 從系統啓動開始累計到當前時刻,硬中斷時間(since 2.6.0-test4) softirq (895) 從系統啓動開始累計到當前時刻,軟中斷時間(since 2.6.0-test4)stealstolen(0) which is the time spent in other operating systems when running in a virtualized environment(since 2.6.11) guest(0) which is the time spent running a virtual CPU for guest operating systems under the control of the Linux kernel(since 2.6.24) 結論2:總的cpu時間totalCpuTime = user + nice + system + idle + iowait + irq + softirq + stealstolen + guest /proc/<pid>/stat文件 到當前時刻。以下通過實例數據來說明該文件中各字段的含義。 [zhengangen@buick ~]# cat /proc/6873/stat 6873 (a.out) R 6723 6873 6723 34819 6873 8388608 77 0 0 0 41958 31 0 0 25 0 3 0 5882654 1409024 56 4294967295 134512640 134513720 3215579040 0 2097798 0 0 0 0 0 0 0 17 0 0 0 說明:以下只解釋對我們計算Cpu使用率有用相關參數 參數 解釋 pid=6873 進程號 utime=1587 該任務在用戶態運行的時間,單位爲jiffies stime=41958 該任務在覈心態運行的時間,單位爲jiffies cutime=0 所有已死線程在用戶態運行的時間,單位爲jiffies cstime=0 所有已死在覈心態運行的時間,單位爲jiffies
/proc/<pid>/task/<tid>/stat文件 注意,該文件中的tid字段表示的不再是進程號,而是linux中的輕量級進程(lwp),即我們通常所說的線程。
系統中有關進程cpu使用率的常用命令 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%. %cpu cpu utilization of the process in "##.#" format. It is the CPU time used divided by the time the process has been running (cputime/realtime ratio), expressed as a percentage. It will not add up to 100% unless you are lucky. 結論5:ps命令算出來的cpu使用率相對於進程啓動時的平均值,隨着進程運行時間的增大,該值會趨向於平緩。 top命令 #C -- Last used CPU (SMP) A number representing the last used processor. In a true SMP environment this will likely change frequently since the kernel intentionally uses weak affinity. Also, the very act of running top may break this weak affinity and cause more processes to change CPUs more often (because of the extra demand for cpu time). %CPU -- CPU usage The task’s share of the elapsed CPU time since the last screen update, expressed as a percent-age of total CPU time. In a true SMP environment, if Irix mode is Off, top will operate in Solaris mode where a task’s cpu usage will be divided by the total number of CPUs. 結論6:某一個線程在其運行期間其所使用的cpu可能會發生變化。 結論7:在多核的情況下top命令輸出的cpu使用率實質是按cpu個數*100%計算的。<!--[if !supportAnnotations]--> 單核情況下Cpu使用率的計算 總的Cpu使用率計算 <!--[if !supportLists]-->1、 <!--[endif]-->採樣兩個足夠短的時間間隔的Cpu快照,分別記作t1,t2,其中t1、t2的結構均爲: (user、nice、system、idle、iowait、irq、softirq、stealstolen、guest)的9元組; <!--[if !supportLists]-->2、 <!--[endif]-->計算總的Cpu時間片totalCpuTime <!--[if !supportLists]-->a) <!--[endif]-->把第一次的所有cpu使用情況求和,得到s1; <!--[if !supportLists]-->b) <!--[endif]-->把第二次的所有cpu使用情況求和,得到s2; <!--[if !supportLists]-->c) <!--[endif]-->s2 - s1得到這個時間間隔內的所有時間片,即totalCpuTime = j2 - j1 ; 3、計算空閒時間idle idle對應第四列的數據,用第二次的第四列 - 第一次的第四列即可 idle=第二次的第四列 - 第一次的第四列 6、計算cpu使用率 pcpu =100* (total-idle)/total 某一進程Cpu使用率的計算 <!--[if !supportLists]-->1. <!--[endif]-->採樣兩個足夠短的時間間隔的cpu快照與進程快照, <!--[if !supportLists]-->a) <!--[endif]-->每一個cpu快照均爲(user、nice、system、idle、iowait、irq、softirq、stealstolen、guest)的9元組; <!--[if !supportLists]-->b) <!--[endif]-->每一個進程快照均爲 (utime、stime、cutime、cstime)的4元組; <!--[if !supportLists]-->2. <!--[endif]-->分別根據結論2、結論3計算出兩個時刻的總的cpu時間與進程的cpu時間,分別記作:totalCpuTime1、totalCpuTime2、processCpuTime1、processCpuTime2 <!--[if !supportLists]-->3. <!--[endif]-->計算該進程的cpu使用率pcpu = 100*( processCpuTime2 – processCpuTime1) / (totalCpuTime2 – totalCpuTime1) (按100%計算,如果是多核情況下還需乘以cpu的個數); 實驗數據 實驗一: 監控一空循環的進程的cpu使用率。 說明:左邊的數據是按以上算法得到的數據,其中採樣的時間間隔與top命令刷新屏幕的時間間隔相同。 按以上方法計算得到的cpu使用率 通過top命令得到的 99.50083 98.333336 98.0 98.83138 99.0 99.0 99.83361 98.83527 98.4975 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 7639 fjzag 20 0 206m 10m 7136 S 99 2.2 1:00.74 java 7639 fjzag 20 0 206m 10m 7136 S 99 2.2 1:03.71 java 7639 fjzag 20 0 206m 10m 7136 S 99 2.2 1:06.67 java 7639 fjzag 20 0 206m 10m 7136 S 99 2.2 1:09.63 java 7639 fjzag 20 0 206m 10m 7136 S 98 2.2 1:12.59 java 7639 fjzag 20 0 206m 10m 7136 S 99 2.2 1:15.55 java 7639 fjzag 20 0 206m 10m 7136 S 100 2.2 1:18.55 java 7639 fjzag 20 0 206m 10m 7136 S 100 2.2 1:21.54 java 7639 fjzag 20 0 206m 10m 7136 S 99 2.2 1:24.52 java 7639 fjzag 20 0 206m 10m 7136 S 98 2.2 1:27.46 java 實驗二: 監控jconsole進程的cpu使用率。 說明:左邊的數據是按以上算法得到的數據,其中採樣的時間間隔與top命令刷新屏幕的時間間隔相同。 按以上方法計算得到的cpu使用率 通過top命令得到的 8.681135 12.0 10.350584 7.6539097 7.6539097 5.0 13.021703 11.0 8.666667 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 7753 fjzag 20 0 252m 72m 22m S 10 14.4 0:18.70 jconsole 7753 fjzag 20 0 252m 72m 22m S 12 14.4 0:19.07 jconsole 7753 fjzag 20 0 252m 72m 22m S 11 14.4 0:19.39 jconsole 7753 fjzag 20 0 252m 72m 22m S 7 14.4 0:19.61 jconsole 7753 fjzag 20 0 252m 72m 22m S 7 14.4 0:19.83 jconsole 7753 fjzag 20 0 252m 72m 22m S 5 14.4 0:19.97 jconsole 7753 fjzag 20 0 252m 72m 22m S 14 14.4 0:20.38 jconsole 7753 fjzag 20 0 252m 72m 22m S 10 14.4 0:20.68 jconsole 7753 fjzag 20 0 252m 72m 22m S 9 14.5 0:20.96 jconsole 某一線程Cpu使用率的計算 <!--[if !supportLists]-->1. <!--[endif]-->採樣兩個足夠短的時間隔的cpu快照與線程快照, <!--[if !supportLists]-->a) <!--[endif]-->每一個cpu快照均爲(user、nice、system、idle、iowait、irq、softirq、stealstealon、guest)的9元組; <!--[if !supportLists]-->b) <!--[endif]-->每一個線程快照均爲 (utime、stime)的2元組; <!--[if !supportLists]-->2. <!--[endif]-->分別根據結論2、結論4計算出兩個時刻的總的cpu時間與線程的cpu時間,分別記作:totalCpuTime1、totalCpuTime2、threadCpuTime1、threadCpuTime2 <!--[if !supportLists]-->3. <!--[endif]-->計算該線程的cpu使用率pcpu = 100*( threadCpuTime2 – threadCpuTime1) / (totalCpuTime2 – totalCpuTime1) (按100%計算,如果是多核情況下還需乘以cpu的個數); 實驗數據 實驗一: 監控一空循環的線程的cpu使用率。 說明:左邊的數據是按以上算法得到的數據,其中採樣的時間間隔與top命令刷新屏幕的時間間隔相同。 按以上方法計算得到的cpu使用率 通過top命令得到的 98.83138 97.00997 96.98997 97.49583 98.169716 96.8386 97.333336 93.82304 98.66667 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 7649 fjzag 20 0 206m 10m 7136 R 97 2.2 7:22.94 java 7649 fjzag 20 0 206m 10m 7136 R 97 2.2 7:25.86 java 7649 fjzag 20 0 206m 10m 7136 R 97 2.2 7:28.76 java 7649 fjzag 20 0 206m 10m 7136 R 99 2.2 7:31.72 java 7649 fjzag 20 0 206m 10m 7136 R 98 2.2 7:34.65 java 7649 fjzag 20 0 206m 10m 7136 R 96 2.2 7:37.53 java 7649 fjzag 20 0 206m 10m 7136 R 98 2.2 7:40.47 java 7649 fjzag 20 0 206m 10m 7136 R 96 2.2 7:43.34 java 7649 fjzag 20 0 206m 10m 7136 R 97 2.2 7:46.25 java 實驗二: 監控jconsole程序某一線程的cpu使用率。 說明:左邊的數據是按以上算法得到的數據,其中採樣的時間間隔與top命令刷新屏幕的時間間隔相同。 按以上方法計算得到的cpu使用率 通過top命令得到的 1.3400335 6.644518 1.3333334 0.6677796 0.6666667 1.3333334 1.3333334 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 7755 fjzag 20 0 251m 72m 22m S 1 14.4 0:11.92 jconsole 7755 fjzag 20 0 251m 72m 22m S 7 14.4 0:12.12 jconsole 7755 fjzag 20 0 251m 72m 22m S 2 14.4 0:12.18 jconsole 7755 fjzag 20 0 251m 72m 22m S 0 14.4 0:12.18 jconsole 7755 fjzag 20 0 251m 72m 22m S 1 14.4 0:12.20 jconsole 7755 fjzag 20 0 251m 72m 22m S 1 14.4 0:12.24 jconsole 7755 fjzag 20 0 251m 72m 22m S 1 14.4 0:12.28 jconsole 多核情況下cpu使用率的計算 實驗一 描述: 在雙核的情況下作的一組實驗,第一組數據是通過ps -eLo pid,lwp,pcpu | grep 9140命令查看進程號爲9140的進程中各線程的詳細信息。第二組數據是通過 ps命令查看進程號爲9140進程的cpu使用率。 數據一: pid lwp %cpu 9140 9140 0.0 以上除了紅色標註出來的兩個線程以外,其他的線程都是後臺線程。 數據二: pid %cpu 9140 193 實驗二 描述: 在單核的情況下作的一組實驗,第一組數據是通過ps -eLo pid,lwp,pcpu | grep 6137命令查看進程號爲6137的進程中各線程的詳細信息。第二組數據是通過 ps命令查看進程號爲6137進程的cpu使用率。 數據一: pid lwp %cpu 6137 6137 0.0 6137 6138 0.1 6137 6143 0.0 6137 6144 0.0 6137 6145 0.0 6137 6146 0.0 6137 6147 0.0 6137 6148 0.0 6137 6149 0.0 6137 6150 46.9 空循環線程 6137 6151 46.9 空循環線程 以上除了紅色標註出來的兩個線程以外,其他的線程都是後臺線程。 數據二 pid %cpu 6137 92.9 主要問題: 各個版本都有的4個字段: user、nice、system、idle 2.5.41版本新增字段:iowait 2.6.0-test4新增字段:irq、softirq 2.6.11新增字段:stealstolen : which is the time spent in other operating systems when running in a virtualized environment 2.6.24新增字段:guest: which is the time spent running a virtual CPU for guest operating systems under the control of the Linux kernel 2./proc/pid/task目錄是Linux 2.6.0-test6之後纔有的功能。 3.關於出現cpu使用率爲負的情況,目前想到的解決方案是如果出現負值,連續採樣計算cpu使用率直到爲非負。 4. 有些線程生命週期較短,可能在我們採樣期間就已經死掉了. |
|
實驗二: 監控jconsole進程的cpu使用率。 |
|
說明:左邊的數據是按以上算法得到的數據,其中採樣的時間間隔與top命令刷新屏幕的時間間隔相同。 |
|
按以上方法計算得到的cpu使用率 |
通過top命令得到的 |
8.681135 12.0 10.350584 7.6539097 7.6539097 5.0 13.021703 11.0 8.666667 |
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 7753 fjzag 20 0 252m 72m 22m S 10 14.4 0:18.70 jconsole 7753 fjzag 20 0 252m 72m 22m S 12 14.4 0:19.07 jconsole 7753 fjzag 20 0 252m 72m 22m S 11 14.4 0:19.39 jconsole 7753 fjzag 20 0 252m 72m 22m S 7 14.4 0:19.61 jconsole 7753 fjzag 20 0 252m 72m 22m S 7 14.4 0:19.83 jconsole 7753 fjzag 20 0 252m 72m 22m S 5 14.4 0:19.97 jconsole 7753 fjzag 20 0 252m 72m 22m S 14 14.4 0:20.38 jconsole 7753 fjzag 20 0 252m 72m 22m S 10 14.4 0:20.68 jconsole 7753 fjzag 20 0 252m 72m 22m S 9 14.5 0:20.96 jconsole |
某一線程Cpu使用率的計算
計算方法:
<!--[if !supportLists]-->1. <!--[endif]-->採樣兩個足夠短的時間隔的cpu快照與線程快照,
<!--[if !supportLists]-->a) <!--[endif]-->每一個cpu快照均爲(user、nice、system、idle、iowait、irq、softirq、stealstealon、guest)的9元組;
<!--[if !supportLists]-->b) <!--[endif]-->每一個線程快照均爲 (utime、stime)的2元組;
<!--[if !supportLists]-->2. <!--[endif]-->分別根據結論2、結論4計算出兩個時刻的總的cpu時間與線程的cpu時間,分別記作:totalCpuTime1、totalCpuTime2、threadCpuTime1、threadCpuTime2
<!--[if !supportLists]-->3. <!--[endif]-->計算該線程的cpu使用率pcpu = 100*( threadCpuTime2 – threadCpuTime1) / (totalCpuTime2 – totalCpuTime1) (按100%計算,如果是多核情況下還需乘以cpu的個數);
實驗數據
實驗一: 監控一空循環的線程的cpu使用率。 |
|
說明:左邊的數據是按以上算法得到的數據,其中採樣的時間間隔與top命令刷新屏幕的時間間隔相同。 |
|
按以上方法計算得到的cpu使用率 |
通過top命令得到的 |
98.83138 97.00997 96.98997 97.49583 98.169716 96.8386 97.333336 93.82304 98.66667 |
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 7649 fjzag 20 0 206m 10m 7136 R 97 2.2 7:22.94 java 7649 fjzag 20 0 206m 10m 7136 R 97 2.2 7:25.86 java 7649 fjzag 20 0 206m 10m 7136 R 97 2.2 7:28.76 java 7649 fjzag 20 0 206m 10m 7136 R 99 2.2 7:31.72 java 7649 fjzag 20 0 206m 10m 7136 R 98 2.2 7:34.65 java 7649 fjzag 20 0 206m 10m 7136 R 96 2.2 7:37.53 java 7649 fjzag 20 0 206m 10m 7136 R 98 2.2 7:40.47 java 7649 fjzag 20 0 206m 10m 7136 R 96 2.2 7:43.34 java 7649 fjzag 20 0 206m 10m 7136 R 97 2.2 7:46.25 java |
實驗二: 監控jconsole程序某一線程的cpu使用率。 |
|
說明:左邊的數據是按以上算法得到的數據,其中採樣的時間間隔與top命令刷新屏幕的時間間隔相同。 |
|
按以上方法計算得到的cpu使用率 |
通過top命令得到的 |
1.3400335 6.644518 1.3333334 0.6677796 0.6666667 1.3333334 1.3333334 |
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 7755 fjzag 20 0 251m 72m 22m S 1 14.4 0:11.92 jconsole 7755 fjzag 20 0 251m 72m 22m S 7 14.4 0:12.12 jconsole 7755 fjzag 20 0 251m 72m 22m S 2 14.4 0:12.18 jconsole 7755 fjzag 20 0 251m 72m 22m S 0 14.4 0:12.18 jconsole 7755 fjzag 20 0 251m 72m 22m S 1 14.4 0:12.20 jconsole 7755 fjzag 20 0 251m 72m 22m S 1 14.4 0:12.24 jconsole 7755 fjzag 20 0 251m 72m 22m S 1 14.4 0:12.28 jconsole |
多核情況下cpu使用率的計算
以下通過實驗數據來說明多核情況下某一進程cpu使用率是按cpu個數*100%計算的.
實驗一
描述:
在雙核的情況下作的一組實驗,第一組數據是通過ps -eLo pid,lwp,pcpu | grep 9140命令查看進程號爲9140的進程中各線程的詳細信息。第二組數據是通過 ps命令查看進程號爲9140進程的cpu使用率。
數據一:
pid lwp %cpu
9140 9140 0.0
9140 9141 0.0
9140 9142 0.0
9140 9143 0.0
9140 9144 0.0
9140 9149 0.0
9140 9150 0.0
9140 9151 0.0
9140 9152 0.1
9140 9153 96.6 該線程是一個空循環
9140 9154 95.9 該線程是一個空循環
以上除了紅色標註出來的兩個線程以外,其他的線程都是後臺線程。
數據二:
pid %cpu
9140 193
實驗二
描述:
在單核的情況下作的一組實驗,第一組數據是通過ps -eLo pid,lwp,pcpu | grep 6137命令查看進程號爲6137的進程中各線程的詳細信息。第二組數據是通過 ps命令查看進程號爲6137進程的cpu使用率。
數據一:
pid lwp %cpu
6137 6137 0.0
6137 6138 0.1
6137 6143 0.0
6137 6144 0.0
6137 6145 0.0
6137 6146 0.0
6137 6147 0.0
6137 6148 0.0
6137 6149 0.0
6137 6150 46.9 空循環線程
6137 6151 46.9 空循環線程
以上除了紅色標註出來的兩個線程以外,其他的線程都是後臺線程。
數據二
pid %cpu
6137 92.9
主要問題:
<!--[if !supportLists]-->1. <!--[endif]-->不同內核版本/proc/stat文件格式不大一致。/proc/stat文件中第一行爲總的cpu使用情況。
各個版本都有的4個字段: user、nice、system、idle
2.5.41版本新增字段:iowait
2.6.0-test4新增字段:irq、softirq
2.6.11新增字段:stealstolen : which is the time spent in other operating
systems when running in a virtualized environment
2.6.24新增字段:guest: which is the time spent running a virtual CPU for guest operating systems under the control of the Linux kernel
2./proc/pid/task目錄是Linux 2.6.0-test6之後纔有的功能。
3.關於出現cpu使用率爲負的情況,目前想到的解決方案是如果出現負值,連續採樣計算cpu使用率直到爲非負。
4. 有些線程生命週期較短,可能在我們採樣期間就已經死掉了.