關於top指令及cpu佔用統計

原文鏈接:
https://blog.csdn.net/cfy_phonex/article/details/18733731
通常,有如下方式可以得到 cpu 利用率情況:

top 命令

e.g. top -m 20 -d 1 -t

User 0%, System 6%, IOW 0%, IRQ 0%
User 1 + Nice 0 + Sys 34 + Idle 494 + IOW 0 + IRQ 0 + SIRQ 1 = 530
 
  PID   TID PR CPU% S     VSS     RSS PCY UID      Thread          Proc
 3385  3385  0   6% R   1460K    484K     root     top             top
  631   631  2   0% S      0K      0K     root     ksmd
    8     8  0   0% S      0K      0K     root     rcu_preempt
    5     5  0   0% S      0K      0K     root     kworker/0:0H
    6     6  1   0% S      0K      0K     root     kworker/u8:0
    7     7  0   0% S      0K      0K     root     migration/0
    9     9  0   0% S      0K      0K     root     rcu_bh
   10    10  1   0% S      0K      0K     root     rcu_sched
   11    11  1   0% S      0K      0K     root     migration/1
   12    12  1   0% S      0K      0K     root     ksoftirqd/1
   14    14  1   0% S      0K      0K     root     kworker/1:0H
   15    15  2   0% S      0K      0K     root     migration/2
   16    16  2   0% S      0K      0K     root     ksoftirqd/2
   18    18  2   0% S      0K      0K     root     kworker/2:0H
   19    19  3   0% S      0K      0K     root     migration/3
   20    20  3   0% S      0K      0K     root     ksoftirqd/3
   22    22  3   0% S      0K      0K     root     kworker/3:0H
   23    23  1   0% S      0K      0K     root     khelper
   33    33  1   0% S      0K      0K     root     kworker/1:1
  111   111  1   0% S      0K      0K     root     bcm_hsotgctrl_e

top 命令是通過 用戶空間 (userspace) 的方式, 統計得到結果。

cat /proc/stat

cpu  11469 450 27068 1882759 487 4 464 0 0 0
cpu0 3098 117 8727 464531 67 3 408 0 0 0
cpu1 2933 130 7136 471014 157 1 30 0 0 0
cpu2 2983 90 5170 474272 131 0 8 0 0 0
cpu3 2455 113 6035 472942 132 0 18 0 0 0
intr 650070 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 72794 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2961 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 7075 0 17
978 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2162 7980 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 313 0 0 4 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9206 0 0 0 0 0 100 0 0 0 0 0 0 0 0 0 0 0 0 20872 0 34798 161365 0 0 0 0 0 0 0 0 13461
3 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 36496 29298 21433 30846 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 2134 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 490 190 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 197 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1288221
btime 1356998414
processes 3399
procs_running 2
procs_blocked 0
softirq 249133 0 103834 1 0 0 0 34224 53095 1547 56432

其中,可以通過 cat /proc/cpuinfo 來驗證 cpu core 的數量。

大多數情況, /proc/stat 得到的結果能夠比較真實的反映系統真實狀態。

然而,因爲因爲 kernel 何時/如何去收集系統狀態信息不確定的特性, 有時得到的結果完全不可靠。

cpu  11469 450 27068 1882759 487 4 464 0 0 0
cpu0 3098 117 8727 464531 67 3 408 0 0 0
cpu1 2933 130 7136 471014 157 1 30 0 0 0
cpu2 2983 90 5170 474272 131 0 8 0 0 0
cpu3 2455 113 6035 472942 132 0 18 0 0 0

其中, 第一行表示所有 cpu 的統計信息。第二行至第五行分別表示 cpu core 0 ~ 4 的統計信息。

總的cpu統計信息值,等於每個 cpu core 對應值的累加。

每一列的數值單位爲 jiffies。 jiffies 是內核的全局變量,用來表示系統啓動以來的節拍數。

user(11469)           表示從系統啓動到當前時刻,處於用戶態的運行時間。不包含nice值爲負的進程。
nice(450)               表示從系統啓動到當前時刻,nice爲負值的進程佔用的cpu時間
system(27068)      表示從系統啓動到當前時刻,處於內核態的運行時間
idle(1882759)       表示從系統啓動到當前時刻,除了 iowait外的等待時間
iowait(487)            表示從系統啓動到當前時刻,io 等待時間
irq(4)                      表示從系統啓動到當前時刻,硬中斷花費的時間
softirq(464)            表示從系統啓動到當前時刻,軟中斷花費的時間
steal(0)                   表示從系統啓動到當前時刻,運行其他虛擬環境中的操作系統花費的時間
guest(0)                  表示從系統啓動到當前時刻,運行在通過Linux內核控制的客戶操作系統上的虛擬cpu 的時間
guest_nice(0)        表示從系統啓動到當前時刻,運行在通過Linux內核控制的客戶操作系統上的虛擬cpu 的時間, nice 爲負值進程

intr 650070 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 72794 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2961 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 7075 0 17
978 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2162 7980 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 313 0 0 4 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9206 0 0 0 0 0 100 0 0 0 0 0 0 0 0 0 0 0 0 20872 0 34798 161365 0 0 0 0 0 0 0 0 13461
3 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 36496 29298 21433 30846 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 2134 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 490 190 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 197 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0


sum(650070)          表示系統中所有中斷次數之和
其後每一個數值,表示從 irq[0] ~ irq[ nr_irqs -1 ] 對應的中斷產生次數

ctxt 1288221
btime 1356998414
processes 3399
procs_running 2
procs_blocked 0

ctxt                        context switch 的次數
btime                   從源代碼應該表示從系統啓動到當前時刻,系統時間 單位:ns。但是實際似乎不變??
processes          系統產生的線程數
procs_running    當前運行的線程數量
procs_blocked   當前被 iowait 阻塞的線程數量

softirq 249133 0 103834 1 0 0 0 34224 53095 1547 56432

sum_softirq(249133)      所有 軟中斷時間之和
HI_SOFTIRQ(0)
TIMER_SOFTIRQ(103834)
NET_TX_SOFTIRQ (1)
NET_RX_SOFTIRQ (0)
BLOCK_SOFTIRQ (0)
BLOCK_IOPOLL_SOFTIRQ (0)
TASKLET_SOFTIRQ (34224)
SCHED_SOFTIRQ ( 53095)
HRTIMER_SOFTIRQ (1547)
RCU_SOFTIRQ (56432)

顯然, sum_softirq 等於所有其他單項 softirq 時間之和。

其中關鍵的IOW調查方式如下:
Linux下的IO檢測工具最常用的是iostat,不過iostat只能查看到總的IO情況。如果要細看具體那一個程序點用的IO較高,可以使用iotop 。不過iotop對內核版本和Python版本有要求,雖然目前主流的CentOS和Ubuntu版本上都適用。不過考慮到其無法適用的場景,推薦個可以查看程序IO使用情況的工具iopp作爲替代方案。

安裝iopp
安裝編譯工具

$ yum install cmake
編譯安裝iopp

$ git clone https://github.com/markwkm/iopp.git
$ cd iopp
$ cmake CMakeLists.txt
$ make && make install
如需指定安裝位置,可按如下方法

指定安裝的目標路徑到/usr/bin下

$ make install DESTDIR=/usr
注:默認安裝目錄位置爲/bin/iopp

使用iopp
iopp語法

$ iopp --help
usage: iopp -h|–help
usage: iopp [-ci] [-k|-m] [delay [count]]
-c, --command display full command line #顯示完整命令行
-h, --help display help #顯示幫助信息
-i, --idle hides idle processes #隱藏空閒進程
-k, --kilobytes display data in kilobytes #以KB爲單位顯示數據
-m, --megabytes display data in megabytes #以MB爲單位顯示數據
-u, --human-readable display data in kilo-, mega-, or giga-bytes #以方便讀的方式顯示數據

列出進程並隱藏I/O空閒的進程
$ iopp -i -k -c 1
pid rchar wchar syscr syscw rkb wkb cwkb command
pid rchar wchar syscr syscw rkb wkb cwkb command
9311 31 0 0 0 0 0 0 iopp
pid rchar wchar syscr syscw rkb wkb cwkb command
9311 31 0 0 0 0 0 0 iopp
pid rchar wchar syscr syscw rkb wkb cwkb command
9311 31 0 0 0 0 0 0 iopp
pid rchar wchar syscr syscw rkb wkb cwkb command
9311 31 0 0 0 0 0 0 iopp
pid rchar wchar syscr syscw rkb wkb cwkb command
9311 31 0 0 0 0 0 0 iopp
pid rchar wchar syscr syscw rkb wkb cwkb command
9311 31 0 0 0 0 0 0 iopp
pid rchar wchar syscr syscw rkb wkb cwkb command
395 0 0 0 0 0 4 0 jbd2/dm-0-8
1229 0 1 0 0 0 8 0 auditd
1251 0 0 0 0 0 4 0 /sbin/rsyslogd
1498 110 0 0 0 0 4 0 crond
9311 31 0 0 0 0 0 0 iopp

iopp輸出的結果解釋如下
pid 進程ID
rchar 將要從磁盤讀取的字節數
wchar 已經寫入或應該要寫入磁盤的字節數
syscr 讀I/O次數
syscw 寫I/O次數
rbytes 真正從磁盤讀取的字節數
wbytes 真正寫入到磁盤的字節數
cwbytes 因爲清空頁面緩存而導致沒有發生操作的字節數
command 執行的命令

另外一篇詳細講述cpu的文章:
https://blog.csdn.net/xia562653223/article/details/19999091
top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源佔用狀況,類似於Windows的任務管理器。下面詳細介紹它的使用方法。

top -01:06:48 up 1:22, 1 user, load average: 0.06, 0.60, 0.48
Tasks: 29 total, 1 running, 28 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 191272k total, 173656k used, 17616k free, 22052k buffers
Swap: 192772k total, 0k used, 192772k free, 123988k cached

PIDUSER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1379 root 16 0 7976 2456 1980 S 0.7 1.3 0:11.03 sshd
14704 root 16 0 2128 980 796 R 0.7 0.5 0:02.72 top
1 root 16 0 1992 632 544 S 0.0 0.3 0:00.90 init
2 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0

統計信息區
前五行是系統整體的統計信息。第一行是任務隊列信息,同uptime 命令的執行結果。其內容如下:

01:06:48當前時間
up 1:22 系統運行時間,格式爲時:分
1 user 當前登錄用戶數
load average: 0.06, 0.60, 0.48 系統負載,即任務隊列的平均長度。
三個數值分別爲 1分鐘、5分鐘、15分鐘前到現在的平均值。

第二、三行爲進程和CPU的信息。當有多個CPU時,這些內容可能會超過兩行。內容如下:

Tasks:29 total 進程總數
1 running 正在運行的進程數
28 sleeping 睡眠的進程數
0 stopped 停止的進程數
0 zombie 殭屍進程數
Cpu(s): 0.3% us 用戶空間佔用CPU百分比
1.0% sy 內核空間佔用CPU百分比
0.0% ni 用戶進程空間內改變過優先級的進程佔用CPU百分比
98.7% id 空閒CPU百分比
0.0% wa 等待輸入輸出的CPU時間百分比
0.0% hi
0.0% si

最後兩行爲內存信息。內容如下:

Mem:191272k total 物理內存總量
173656k used 使用的物理內存總量
17616k free 空閒內存總量
22052k buffers 用作內核緩存的內存量
Swap: 192772k total 交換區總量
0k used 使用的交換區總量
192772k free 空閒交換區總量
123988k cached 緩衝的交換區總量。
內存中的內容被換出到交換區,而後又被換入到內存,但使用過的交換區尚未被覆蓋,
該數值即爲這些內容已存在於內存中的交換區的大小。
相應的內存再次被換出時可不必再對交換區寫入。

進程信息區
統計信息區域的下方顯示了各個進程的詳細信息。首先來認識一下各列的含義。

序號列名含義
a PID 進程id
b PPID 父進程id
c RUSER Real user name
d UID 進程所有者的用戶id
e USER 進程所有者的用戶名
f GROUP 進程所有者的組名
g TTY 啓動進程的終端名。不是從終端啓動的進程則顯示爲?
h PR 優先級
i NI nice值。負值表示高優先級,正值表示低優先級
j P 最後使用的CPU,僅在多CPU環境下有意義
k %CPU 上次更新到現在的CPU時間佔用百分比
l TIME 進程使用的CPU時間總計,單位秒
m TIME+ 進程使用的CPU時間總計,單位1/100秒
n %MEM 進程使用的物理內存百分比
o VIRT 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
p SWAP 進程使用的虛擬內存中,被換出的大小,單位kb。
q RES 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
r CODE 可執行代碼佔用的物理內存大小,單位kb
s DATA 可執行代碼以外的部分(數據段+棧)佔用的物理內存大小,單位kb
t SHR 共享內存大小,單位kb
u nFLT 頁面錯誤次數
v nDRT 最後一次寫入到現在,被修改過的頁面數。
w S 進程狀態。
D=不可中斷的睡眠狀態
R=運行
S=睡眠
T=跟蹤/停止
Z=殭屍進程
x COMMAND 命令名/命令行
y WCHAN 若該進程在睡眠,則顯示睡眠中的系統函數名
z Flags 任務標誌,參考sched.h

默認情況下僅顯示比較重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND列。可以通過下面的快捷鍵來更改顯示內容。

更改顯示內容
通過 f 鍵可以選擇顯示的內容。按 f 鍵之後會顯示列的列表,按 a-z 即可顯示或隱藏對應的列,最後按回車鍵確定。

按 o 鍵可以改變列的顯示順序。按小寫的a-z 可以將相應的列向右移動,而大寫的A-Z 可以將相應的列向左移動。最後按回車鍵確定。

按大寫的 F 或 O 鍵,然後按 a-z 可以將進程按照相應的列進行排序。而大寫的R 鍵可以將當前的排序倒轉。

命令使用

1.工具(命令)名稱
top
2.工具(命令)作用
顯示系統當前的進程和其他狀況;top是一個動態顯示過程,即可以通過用戶按鍵來不斷刷新當前狀態.如果在前臺執行該命令,它將獨佔前臺,直到用戶終止該程序爲止. 比較準確的說,top命令提供了實時的對系統處理器的狀態監視.它將顯示系統中CPU最“敏感”的任務列表.該命令可以按CPU使用.內存使用和執行時間對任務進行排序;而且該命令的很多特性都可以通過交互式命令或者在個人定製文件中進行設定.
3.環境設置
在Linux下使用。
4.使用方法
4.1使用格式
top [-] [d] [p] [q] [c] [C] [S] [s] [n]
4.2參數說明
d 指定每兩次屏幕信息刷新之間的時間間隔。當然用戶可以使用s交互命令來改變之。
p 通過指定監控進程ID來僅僅監控某個進程的狀態。
q該選項將使top沒有任何延遲的進行刷新。如果調用程序有超級用戶權限,那麼top將以儘可能高的優先級運行。
S 指定累計模式
s 使top命令在安全模式中運行。這將去除交互命令所帶來的潛在危險。
i 使top不顯示任何閒置或者僵死進程。
c 顯示整個命令行而不只是顯示命令名
4.3其他
  下面介紹在top命令執行過程中可以使用的一些交互命令。從使用角度來看,熟練的掌握這些命令比掌握選項還重要一些。這些命令都是單字母的,如果在命令行選項中使用了s選項,則可能其中一些命令會被屏蔽掉。
Ctrl+L 擦除並且重寫屏幕。
h或者? 顯示幫助畫面,給出一些簡短的命令總結說明。
k 終止一個進程。系統將提示用戶輸入需要終止的進程PID,以及需要發送給該進程什麼樣的信號。一般的終止進程可以使用15信號;如果不能正常結束那就使用信號9強制結束該進程。默認值是信號15。在安全模式中此命令被屏蔽。
i 忽略閒置和僵死進程。這是一個開關式命令。
q 退出程序。
r 重新安排一個進程的優先級別。系統提示用戶輸入需要改變的進程PID以及需要設置的進程優先級值。輸入一個正值將使優先級降低,反之則可以使該進程擁有更高的優先權。默認值是10。
S 切換到累計模式。
s 改變兩次刷新之間的延遲時間。系統將提示用戶輸入新的時間,單位爲s。如果有小數,就換算成m s。輸入0值則系統將不斷刷新,默認值是5s。需要注意的是如果設置太小的時間,很可能會引起不斷刷新,從而根本來不及看清顯示的情況,而且系統負載也會大大增加。
f或者F 從當前顯示中添加或者刪除項目。
o或者O 改變顯示項目的順序。
l 切換顯示平均負載和啓動時間信息。
m 切換顯示內存信息。
t 切換顯示進程和CPU狀態信息。
c 切換顯示命令名稱和完整命令行。
M 根據駐留內存大小進行排序。
P 根據CPU使用百分比大小進行排序。
T 根據時間/累計時間進行排序。
W 將當前設置寫入~/.toprc文件中。這是寫top配置文件的推薦方法。

關於load average:

命令輸出的最後內容表示在過去的1、5、15分鐘內運行隊列中的平均進程數量。
一般來說只要每個CPU的當前活動進程數不大於3那麼系統的性能就是良好的,如果每個CPU的任務數大於5,那麼就表示這臺機器的性能有嚴重問題。對於上面的例子來說,假設系統有兩個CPU,那麼其每個CPU的當前任務數爲:8.13/2=4.065。這表示該系統的性能是可以接受的。

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