【linux命令學(xué)習(xí)】— top 命令學(xué)習(xí)

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ì))。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容