https://blog.csdn.net/u013332124/article/details/95731226
當(dāng)需要排查一些問(wèn)題或者要看系統(tǒng)的一些指標(biāo)時(shí),我們經(jīng)常會(huì)用到top命令。但是我們大多數(shù)人都只會(huì)簡(jiǎn)單的使用top,比如看下哪個(gè)進(jìn)程cpu、內(nèi)存使用的比較多等。其實(shí),top命令有著豐富的功能供我們使用。
一、基本使用及參數(shù)介紹
通過(guò)top -h我們可以獲取到top當(dāng)前的版本以及支持的所有參數(shù):
top: procps version 3.2.8
usage: top -hv | -abcHimMsS -d delay -n iterations [-u user | -U user] -p pid [,pid ...]
下面逐個(gè)介紹各個(gè)參數(shù)的含義
| 參數(shù) | 表示含義 |
|---|---|
| h | 列出top版本和使用幫助信息 |
| v | 列出top版本和使用幫助信息 |
| a | top界面的進(jìn)程列表以內(nèi)存使用情況來(lái)排序 |
| b | 批處理模式。該模式下不會(huì)接收任何交互命令,純輸出。這個(gè)模式適合想把top結(jié)果輸出到其他程序或者文件的場(chǎng)景。 |
| c | top界面的進(jìn)程列表的Command列中展示具體的命令行(默認(rèn)只有一個(gè)簡(jiǎn)單的進(jìn)程名字,如java。帶上-c后會(huì)顯示具體的執(zhí)行命令,如java -jar xxx.jar) |
| H | 顯示線程的列表(默認(rèn)是進(jìn)程列表),我們經(jīng)常使用這個(gè)參數(shù)來(lái)查看java哪個(gè)線程占滿了cpu資源 |
| i | 帶上這個(gè)參數(shù)的話,進(jìn)程列表將不顯示空閑的進(jìn)程。即只會(huì)顯示在running狀態(tài)中的進(jìn)程 |
| m | 進(jìn)程列表顯示具體使用的內(nèi)存(USED)而不是虛擬內(nèi)存(VIRT) |
| M | 進(jìn)程列表的內(nèi)存使用列會(huì)顯示單位。比如1g,1000m |
| s | 安全模式。不是很清楚作用,感興趣的可以通過(guò)man top具體查看下文檔 |
| S | 累積模式。開啟這個(gè)模式后進(jìn)程的cpu時(shí)間會(huì)加上它的子進(jìn)程的時(shí)間 |
| d | top界面的數(shù)據(jù)更新頻率。默認(rèn)是3s,單位秒 |
| n | 更新幾次后退出top界面 |
| u/U | 進(jìn)程列表只看指定用戶的進(jìn)程 |
| p | 進(jìn)程列表只看指定的進(jìn)程,可以通過(guò)逗號(hào)分割多個(gè)id |
二、top界面各個(gè)維度的含義
默認(rèn)top界面的信息大概如下:
top - 08:26:59 up 586 days, 14:17, 12 users, load average: 0.17, 0.11, 0.18
Tasks: 420 total, 1 running, 419 sleeping, 0 stopped, 0 zombie
Cpu(s): 4.5%us, 2.1%sy, 0.0%ni, 93.1%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st
Mem: 65921144k total, 63430372k used, 2490772k free, 1256820k buffers
Swap: 16777208k total, 12220012k used, 4557196k free, 25095800k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
36714 hadoopus 20 0 15308 1516 936 R 0.7 0.0 0:00.16 top
12032 hadoopus 20 0 106m 524 520 S 0.0 0.0 0:00.11 bash
33401 hadoopus 20 0 105m 1972 1528 S 0.0 0.0 0:00.01 bash
43932 hadoopus 20 0 7953m 300m 2876 S 0.0 0.5 570:46.72 java
1、第一行(系統(tǒng)相關(guān)統(tǒng)計(jì)信息)
08:26:59 :表示系統(tǒng)當(dāng)前的時(shí)間
up 586 days, 14:17 : 表示系統(tǒng)已經(jīng)啟動(dòng)了586天14小時(shí)17分(中間沒(méi)有重啟過(guò))
12 users:當(dāng)前有幾個(gè)用戶登錄系統(tǒng)
load average: 0.17, 0.11, 0.18:當(dāng)前cpu的負(fù)載情況。3個(gè)數(shù)值分別表示1分鐘內(nèi)、5分鐘內(nèi)、15分鐘內(nèi)cpu的負(fù)載情況
load average 解釋
load指標(biāo)一般用來(lái)衡量系統(tǒng)cpu在一定時(shí)間內(nèi)的負(fù)載情況。
top的load指標(biāo)主要來(lái)自于文件/proc/loadavg。/proc是一個(gè)虛擬的文件系統(tǒng)(不占磁盤空間),通過(guò)/proc文件系統(tǒng),我們可以訪問(wèn)linux內(nèi)核的一些實(shí)時(shí)運(yùn)行數(shù)據(jù)。
比如/proc/cpuinfo文件可以獲取到當(dāng)前系統(tǒng)cpu的相關(guān)信息,/proc/meminfo可以獲取到內(nèi)存的相關(guān)信息。同理,通過(guò) /proc/loadavg我們可以獲取到當(dāng)前系統(tǒng)的load指標(biāo)。/proc/loadavg中的信息如下:
0.15 0.11 0.10 1/4406 27140 : 其中前三個(gè)表示1/5/15分鐘內(nèi)的cpu負(fù)載。1/4406表示當(dāng)前系統(tǒng)共有4406個(gè)進(jìn)程(包括線程),其中只有1個(gè)進(jìn)程在運(yùn)行。27140表示最近一次運(yùn)行過(guò)的進(jìn)程號(hào)
那么,load的指標(biāo)是怎么計(jì)算的呢?linux內(nèi)核會(huì)定時(shí)的去采集信息(具體的頻率不是很清楚),然后統(tǒng)計(jì)在運(yùn)行中或者在等待運(yùn)行的進(jìn)程數(shù)量,之后取平均數(shù),就是這個(gè)時(shí)間范圍內(nèi)的cpu負(fù)載了。
注意,這里計(jì)算的時(shí)候會(huì)算上等待要運(yùn)行的進(jìn)程。比如說(shuō)一個(gè)進(jìn)程滿足運(yùn)行條件了,但是當(dāng)前cpu資源不夠(cpu在運(yùn)行其他進(jìn)程),這時(shí)這個(gè)進(jìn)程就需要等待,同時(shí)這個(gè)進(jìn)程也會(huì)算到cpu負(fù)載里面。
舉個(gè)例子,比如某個(gè)時(shí)刻有3個(gè)進(jìn)程在運(yùn)行,2個(gè)進(jìn)程在等待運(yùn)行。那么這個(gè)時(shí)刻的cpu負(fù)載就是5。那么假設(shè)1分鐘內(nèi)取樣了6次,分別是5、3、6、1、0、1,那么1分鐘內(nèi)的cpu負(fù)載就是(5+3+6+1+0+1)/6=2.6。我們通過(guò)top看到的1分鐘內(nèi)的cpu負(fù)載就是這么來(lái)的。
注意,這個(gè)cpu負(fù)載指標(biāo)的計(jì)算和cpu核數(shù)無(wú)關(guān),它只會(huì)統(tǒng)計(jì)當(dāng)前運(yùn)行中的進(jìn)程+等待運(yùn)行的進(jìn)程。比如32核的服務(wù)器上,每個(gè)cpu都剛好運(yùn)行一個(gè)進(jìn)程且沒(méi)有等待運(yùn)行的進(jìn)程,那么此時(shí)cpu負(fù)載就是32。
但是,一般我們要看系統(tǒng)整體負(fù)載的時(shí)候,就會(huì)結(jié)合cpu核數(shù)來(lái)算負(fù)載系數(shù)。比如當(dāng)前系統(tǒng)是2個(gè)cpu,一分鐘內(nèi)的負(fù)載指標(biāo)到達(dá)了4,那么此時(shí)一分鐘內(nèi)的負(fù)載系數(shù)就是2,意味著系統(tǒng)已經(jīng)比較繁忙了(每個(gè)cpu長(zhǎng)期運(yùn)行一個(gè)進(jìn)程+還有一個(gè)進(jìn)程在等待)。根據(jù)網(wǎng)上提供的經(jīng)驗(yàn),當(dāng) cpu負(fù)載值/cpu核數(shù) >= 5時(shí),就說(shuō)明系統(tǒng)已經(jīng)負(fù)載的非常厲害了
2、第二行(進(jìn)程統(tǒng)計(jì)信息)
Tasks: 420 total, 1 running, 419 sleeping, 0 stopped, 0 zombie:一共420個(gè)進(jìn)程,1個(gè)進(jìn)程在running狀態(tài),0個(gè)進(jìn)程處于stopped狀態(tài),0個(gè)僵尸進(jìn)程。(如果帶上-H參數(shù)會(huì)顯示系統(tǒng)總的線程數(shù)量)
在一個(gè)進(jìn)程調(diào)用了exit之后,該進(jìn)程 并非馬上就消失掉,而是留下一個(gè)稱為僵尸進(jìn)程(Zombie)的數(shù)據(jù)結(jié)構(gòu)。在Linux進(jìn)程的5種狀態(tài)中,僵尸進(jìn)程是非常特殊的一種,它已經(jīng)放棄了幾乎所 有內(nèi)存空間,沒(méi)有任何可執(zhí)行代碼,也不能被調(diào)度,僅僅在進(jìn)程列表中保留一個(gè)位置,記載該進(jìn)程的退出狀態(tài)等信息供其他進(jìn)程收集,除此之外,僵尸進(jìn)程不再占有 任何內(nèi)存空間。
3、第三行(cpu相關(guān)信息)
4.5%us:進(jìn)程運(yùn)行在用戶空間的時(shí)間百分比
2.1%sy:進(jìn)程運(yùn)行在內(nèi)核空間的時(shí)間百分比(如果這個(gè)值比較大,就說(shuō)明當(dāng)前系統(tǒng)在進(jìn)行大量的系統(tǒng)調(diào)用)
0.0%ni:修改過(guò)進(jìn)程優(yōu)先級(jí)比的進(jìn)程運(yùn)行時(shí)間百分比
93.1%id:空閑cpu時(shí)間百分比
0.0%wa:進(jìn)程等待IO的CPU時(shí)間百分比(如果IO繁忙,這個(gè)值會(huì)比較高)
0.0%hi:進(jìn)程硬件中斷占的時(shí)間百分比
0.3%si:進(jìn)程軟中斷占的時(shí)間百分比
0.0%st:虛擬機(jī)占的時(shí)間百分比
4、第四行(內(nèi)存信息)
65921144k total, 63430372k used, 2490772k free, 1256820k buffers:總內(nèi)存有65921144k,已經(jīng)使用63430372k,剩余2490772k。其中buffer的空間還有1256820k。
5、第五行(虛擬內(nèi)存信息)
16777208k total, 12220012k used, 4557196k free, 25095800k cached:虛擬內(nèi)存有16777208k,已經(jīng)使用12220012k,剩余4557196k。其中cache的空間還有25095800k。
不了解內(nèi)存和swap內(nèi)存區(qū)別可以先去了解一下linux關(guān)于虛擬內(nèi)存模塊的設(shè)計(jì)。簡(jiǎn)單來(lái)說(shuō),swap內(nèi)存是將磁盤的一部分空間作為內(nèi)存來(lái)使用的手段。
關(guān)于buffer和cache:
buffer一般是用于控制流量,比如我們要將內(nèi)存數(shù)據(jù)寫到磁盤時(shí),為了避免頻繁的進(jìn)行IO,就需要用到buffer先緩存一些數(shù)據(jù)后再統(tǒng)一寫到磁盤,減少IO次數(shù)
cache主要用于加速讀取速度。最典型的就是cpu cache。我們都知道,內(nèi)存讀寫的速度雖然很快,但是還是趕不上cpu計(jì)算的速度。因此cpu cache就是用來(lái)做一些高速緩存,讓cpu在計(jì)算的時(shí)候能最快的取到數(shù)據(jù)。虛擬內(nèi)存中的cache也是為了彌補(bǔ)內(nèi)存和磁盤速度不一致而引入的緩存機(jī)制
6、第六行+(進(jìn)程列表)
后面就是進(jìn)程列表了,進(jìn)程列表會(huì)列出各個(gè)進(jìn)程各個(gè)維度的信息,top支持的維度有:
序號(hào) 列名 含義 是否默認(rèn)顯示
a PID 進(jìn)程id 默認(rèn)顯示
b PPID 父進(jìn)程id 默認(rèn)不顯示
c RUSER Real user name 默認(rèn)不顯示
d UID 進(jìn)程所有者的用戶id 默認(rèn)不顯示
e USER 進(jìn)程所有者的用戶名 默認(rèn)顯示
f GROUP 進(jìn)程所有者的組名 默認(rèn)不顯示
g TTY 啟動(dòng)進(jìn)程的終端名。不是從終端啟動(dòng)的進(jìn)程則顯示為 ? 默認(rèn)不顯示
h PR 內(nèi)核實(shí)際的優(yōu)先級(jí),一般等于NI+20。值越低優(yōu)先級(jí)越高 默認(rèn)顯示
i NI nice值(用戶可以設(shè)置的)。負(fù)值表示高優(yōu)先級(jí),正值表示低優(yōu)先級(jí)。也就是值越小優(yōu)先級(jí)越高 默認(rèn)顯示
j P 最后使用的CPU,僅在多CPU環(huán)境下有意義 默認(rèn)不顯示
k %CPU 上次更新到現(xiàn)在的CPU時(shí)間占用百分比 默認(rèn)顯示
l TIME 進(jìn)程使用的CPU時(shí)間總計(jì),單位秒 默認(rèn)不顯示
m TIME+ 進(jìn)程使用的CPU時(shí)間總計(jì),單位1/100秒 默認(rèn)顯示
n %MEM 進(jìn)程使用的物理內(nèi)存百分比 默認(rèn)顯示
o VIRT 進(jìn)程使用的虛擬內(nèi)存總量,單位kb。VIRT=SWAP+RES 默認(rèn)顯示
p SWAP 進(jìn)程使用的虛擬內(nèi)存中,被換出的大小,單位kb。 默認(rèn)不顯示
q RES 進(jìn)程使用的、未被換出的物理內(nèi)存大小,單位kb。RES=CODE+DATA 默認(rèn)顯示
r CODE 可執(zhí)行代碼占用的物理內(nèi)存大小,單位kb 默認(rèn)不顯示
s DATA 可執(zhí)行代碼以外的部分(數(shù)據(jù)段+棧)占用的物理內(nèi)存大小,單位kb 默認(rèn)不顯示
t SHR 共享內(nèi)存大小,單位kb 默認(rèn)顯示
u nFLT 頁(yè)面錯(cuò)誤次數(shù) 默認(rèn)不顯示
v nDRT 最后一次寫入到現(xiàn)在,被修改過(guò)的頁(yè)面數(shù)。 默認(rèn)不顯示
w S 進(jìn)程狀態(tài)(D=不可中斷的睡眠狀態(tài),R=運(yùn)行,S=睡眠,T=跟蹤/停止,Z=僵尸進(jìn)程) 默認(rèn)不顯示
x COMMAND 命令名/命令行 默認(rèn)顯示
y WCHAN 若該進(jìn)程在睡眠,則顯示睡眠中的系統(tǒng)函數(shù)名 默認(rèn)不顯示
z Flags 任務(wù)標(biāo)志,參考 sched.h 默認(rèn)不顯示
選擇指定列展示/不展示
在top展示界面,我們可以按下f鍵,就會(huì)進(jìn)程列選擇界面:
前面帶號(hào)表示當(dāng)前有展示該列,或者用序號(hào)的大小寫也可以判斷該列是否展示(大寫表示展示,小寫字母表示不展示)*。
:號(hào)前面的字母表示列對(duì)應(yīng)的序號(hào),比如我們要看SWAP列,就按下p,這時(shí)我們小寫p變成了大寫P,并且前面帶上了*。這時(shí)再按下回車,回到top界面就可以看到全新的列展示了。
進(jìn)程列表排序順序調(diào)整
在top展示界面,我們可以按下o鍵,就可以對(duì)進(jìn)程列表的排序順序做調(diào)整了:
*號(hào)和大寫字母表示當(dāng)前列在展示的狀態(tài)。之后通過(guò)序號(hào)來(lái)進(jìn)行列上移或者下移,比如我們想要CPU列的排序往前調(diào)整一點(diǎn),就按下大寫字母K,如果想往后調(diào)整,就按下小寫字母k(大寫表示往上調(diào)整,小寫表示往下調(diào)整)。之后按回車就可以了
三、top的一些小問(wèn)題
在top的man文檔中,有報(bào)告了一個(gè)問(wèn)題。因?yàn)閠op的一些信息是通過(guò)采樣取平均值來(lái)算的,因此top第一次輸出時(shí)一般是沒(méi)有樣本的,所以只能獲取系統(tǒng)的平均值來(lái)輸出。
比如我們?nèi)绻啻屋斎?/p>
top -b -n 1
會(huì)發(fā)現(xiàn)獲取到的CPU統(tǒng)計(jì)信息基本都是一樣的。就是因?yàn)榈谝淮屋敵霁@取的是系統(tǒng)啟動(dòng)后的平均值。
四、其他
top還可以通過(guò)文件進(jìn)行一些特定的配置,這樣就不用每次進(jìn)入top展示界面時(shí)還要去調(diào)整了,不過(guò)感覺(jué)用的機(jī)會(huì)不會(huì)太多。因此就不做太多了解了。
另外,這里只是列出top的一些基本的使用和信息,想更深入了解的可以去看下top的man文檔(寫的很詳細(xì))。