Linux中top命令輸出詳解
前言
Linux下的top命令我相信大家都用過(guò),自從我接觸Linux以來(lái)就一直用top查看進(jìn)程的CPU和MEM排行榜。但是top命令的其他輸出結(jié)果我都沒(méi)有了解,這些指標(biāo)都代表什么呢,什么情況下需要關(guān)注呢?以及top命令輸出結(jié)果的來(lái)源數(shù)據(jù)是什么呢,又是怎么一個(gè)計(jì)算原理呢?
演示環(huán)境
# uname -a Linux VM_1_11_centos 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
top命令
top命令是Linux下常用的性能分析工具,能夠?qū)崟r(shí)(默認(rèn)是3s刷新一次)的顯示系統(tǒng)的資源使用情況,以及各種進(jìn)程的資源使用情況,類似于Windows的任務(wù)管理器。
top - 11:00:54 up 54 days, 23:35, 6 users, load average: 16.32, 18.75, 21.04 Tasks: 209 total, 3 running, 205 sleeping, 0 stopped, 1 zombie %Cpu(s): 29.7 us, 18.9 sy, 0.0 ni, 49.3 id, 1.7 wa, 0.0 hi, 0.4 si, 0.0 st KiB Mem : 32781216 total, 1506220 free, 6525496 used, 24749500 buff/cache KiB Swap: 0 total, 0 free, 0 used. 25607592 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND root 20 0 15.6g 461676 4704 R 198.0 1.4 11:15.26 python root 20 0 9725596 240028 4672 R 113.0 0.7 7:48.49 python root 20 0 6878028 143196 4720 S 82.4 0.4 1:35.03 python
第一行數(shù)據(jù)相當(dāng)于uptime命令輸出。11:00:54是當(dāng)前時(shí)間,up 54 days,23:55 是系統(tǒng)已經(jīng)運(yùn)行的時(shí)間,6 users表示當(dāng)前有6個(gè)用戶在登錄,load average:16.32,18.75,21.04分別表示系統(tǒng)一分鐘平均負(fù)載,5分鐘平均負(fù)載,15分鐘平均負(fù)載。
平均負(fù)載
平均負(fù)載表示的平均活躍進(jìn)程數(shù),包括正在running的進(jìn)程數(shù),準(zhǔn)備running(就緒態(tài))的進(jìn)程數(shù),和處于不可中斷睡眠狀態(tài)的進(jìn)程數(shù)。如果平均負(fù)載數(shù)剛好等于CPU核數(shù),那證明每個(gè)核都能得到很好的利用,如果平均負(fù)載數(shù)大于核數(shù)證明系統(tǒng)處于過(guò)載的狀態(tài),通常認(rèn)為是超過(guò)核數(shù)的70%認(rèn)為是嚴(yán)重過(guò)載,需要關(guān)注。還需結(jié)合1分鐘平均負(fù)載,5分鐘平均負(fù)載,15分鐘平均負(fù)載看負(fù)載的趨勢(shì),如果1分鐘負(fù)載比較高,5分鐘和15分鐘的平均負(fù)載都比較低,則說(shuō)明是瞬間升高,需要觀察。如果三個(gè)值都很高則需要關(guān)注下是否某個(gè)進(jìn)程在瘋狂消耗CPU或者有頻繁的IO操作,也有可能是系統(tǒng)運(yùn)行的進(jìn)程太多,頻繁的進(jìn)程切換導(dǎo)致。比如說(shuō)上面的演示環(huán)境是一臺(tái)8核的centos機(jī)器,證明系統(tǒng)是長(zhǎng)期處于過(guò)載狀態(tài)在運(yùn)行。
Tasks: 214 total, 4 running, 209 sleeping, 0 stopped, 1 zombie
第二行的Tasks信息展示的系統(tǒng)運(yùn)行的整體進(jìn)程數(shù)量和狀態(tài)信息。214 total 表示系統(tǒng)現(xiàn)在一共有214個(gè)用戶進(jìn)程,4 running 表示4個(gè)進(jìn)程正在處于running狀態(tài),209 sleeping表示209個(gè)進(jìn)程正處于sleeping狀態(tài),0 stopped 表示 0 個(gè)進(jìn)程正處于stopped狀態(tài),1 zombie表示 有1個(gè)僵尸進(jìn)程。
僵尸進(jìn)程
子進(jìn)程結(jié)束時(shí)父進(jìn)程沒(méi)有調(diào)用wait()/waitpid()等待子進(jìn)程結(jié)束,那么就會(huì)產(chǎn)生僵尸進(jìn)程。原因是子進(jìn)程結(jié)束時(shí)并沒(méi)有真正退出,而是留下一個(gè)僵尸進(jìn)程的數(shù)據(jù)結(jié)構(gòu)在系統(tǒng)進(jìn)程表中,等待父進(jìn)程清理,如果父進(jìn)程已經(jīng)退出則會(huì)由init進(jìn)程接替父進(jìn)程進(jìn)行處理(收尸)。由此可見(jiàn),如果父進(jìn)程不作為并且又不退出,就會(huì)有大量的僵尸進(jìn)程,每個(gè)僵尸進(jìn)程會(huì)占用進(jìn)程表的一個(gè)位置(slot),如果僵尸進(jìn)程太多會(huì)導(dǎo)致系統(tǒng)無(wú)法創(chuàng)建新的進(jìn)程,因?yàn)檫M(jìn)程表的容量是有限的。所以當(dāng)zombie這個(gè)指標(biāo)太大時(shí)需要引起我們的注意。下面的進(jìn)程詳細(xì)信息中的S列就代表進(jìn)程的運(yùn)行狀態(tài),Z表示該進(jìn)程是僵尸進(jìn)程。
消滅僵尸進(jìn)程的方法:
1.找到僵尸進(jìn)程的父進(jìn)程pid(pstress可以顯示進(jìn)程父子關(guān)系),kill -9 pid,父進(jìn)程退出后init自動(dòng)會(huì)清理僵尸進(jìn)程。(需要注意的是kill -9并不能殺死僵尸進(jìn)程)
2.重啟系統(tǒng)。
%Cpu(s): 31.9 us, 30.3 sy, 0.0 ni, 37.0 id, 0.0 wa, 0.0 hi, 0.8 si, 0.0 st
第三行的%Cpu(s)表示的是總體CPU使用情況。
- us user 表示用戶態(tài)的CPU時(shí)間比例
- sy system 表示內(nèi)核態(tài)的CPU時(shí)間比例
- ni nice 表示運(yùn)行低優(yōu)先級(jí)進(jìn)程的CPU時(shí)間比例
- id idle 表示空閑CPU時(shí)間比例
- wa iowait 表示處于IO等待的CPU時(shí)間比例
- hi hard interrupt 表示處理硬中斷的CPU時(shí)間比例
- si soft interrupt 表示處理軟中斷的CPU時(shí)間比例
- st steal 表示當(dāng)前系統(tǒng)運(yùn)行在虛擬機(jī)中的時(shí)候,被其他虛擬機(jī)占用的CPU時(shí)間比例。
所以整體的CPU使用率=1-id。當(dāng)us很高時(shí),證明CPU時(shí)間主要消耗在用戶代碼,需要優(yōu)化用戶代碼。sy很高時(shí),說(shuō)明CPU時(shí)間都消耗在內(nèi)核,要么是頻繁的系統(tǒng)調(diào)用,要么是頻繁的CPU切換(進(jìn)程切換/線程切換)。wa很高時(shí),說(shuō)明有進(jìn)程在進(jìn)程頻繁的IO操作,有可能是磁盤IO,也有可能是網(wǎng)絡(luò)IO。si很高時(shí),說(shuō)明CPU時(shí)間消耗在處理軟中斷,網(wǎng)絡(luò)收發(fā)包會(huì)觸發(fā)系統(tǒng)軟中斷,所以大量的網(wǎng)絡(luò)小包會(huì)導(dǎo)致軟中斷的頻繁觸發(fā),典型的SYN Floor會(huì)導(dǎo)致si很高。
KiB Mem : 32781216 total, 663440 free, 7354900 used, 24762876 buff/cache KiB Swap: 0 total, 0 free, 0 used. 24771700 avail Mem
第4,5行顯示的是系統(tǒng)內(nèi)存使用情況。單位是KiB。totol 表示總內(nèi)存,free 表示沒(méi)使用過(guò)的內(nèi)容,used是已經(jīng)使用的內(nèi)存。buff表示用于讀寫磁盤緩存的內(nèi)存,cache表示用于讀寫文件緩存的內(nèi)存。avail表示可用的應(yīng)用內(nèi)存。
Swap原理是把一塊磁盤空間或者一個(gè)本地文件當(dāng)成內(nèi)存來(lái)使用。Swap total表示能用的swap總量,swap free表示剩余,used表示已經(jīng)使用的。這三個(gè)值都為0表示系統(tǒng)關(guān)閉了swap功能,由于演示環(huán)境是一臺(tái)虛擬機(jī),虛擬機(jī)一般都關(guān)閉swap功能。
第6行開(kāi)始往后表示的是具體的每個(gè)進(jìn)程狀態(tài):
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- PID 進(jìn)程ID
- USER 進(jìn)程所有者的用戶名,例如root
- PR 進(jìn)程調(diào)度優(yōu)先級(jí)
- NI 進(jìn)程nice值(優(yōu)先級(jí)),越小的值代表越高的優(yōu)先級(jí)
- VIRT 進(jìn)程使用的虛擬內(nèi)存
- RES 進(jìn)程使用的物理內(nèi)存(不包括共享內(nèi)存)
- SHR 進(jìn)程使用的共享內(nèi)存
- CPU 進(jìn)程使用的CPU占比
- MEM 進(jìn)程使用的內(nèi)存占比
- TIME 進(jìn)程啟動(dòng)后到現(xiàn)在所用的全部CPU時(shí)間
- COMMAND 進(jìn)程的啟動(dòng)命令(默認(rèn)只顯示二進(jìn)制,top -c能夠顯示命令行和啟動(dòng)參數(shù))
計(jì)算原理
在介紹top命令的各項(xiàng)指標(biāo)計(jì)算原理之前,有必要先介紹下Linux下的proc文件系統(tǒng),因?yàn)閠op命令的各項(xiàng)數(shù)據(jù)來(lái)源于proc文件系統(tǒng)。proc文件系統(tǒng)是一個(gè)虛擬的文件系統(tǒng),是Linux內(nèi)核和用戶的一種通信方式,Linux內(nèi)核會(huì)通過(guò)proc文件系統(tǒng)告訴用戶現(xiàn)在內(nèi)核的狀態(tài)信息,用戶也可以通過(guò)寫proc的方式設(shè)置內(nèi)核的一些行為。與普通文件不同的是,這些proc文件是動(dòng)態(tài)創(chuàng)建的,也是動(dòng)態(tài)修改的,因?yàn)閮?nèi)核的狀態(tài)時(shí)刻都在變化。
top顯示的CPU指標(biāo)都是來(lái)源于/proc/stat文件信息:
# cat /proc/stat cpu 1151829380 20277 540128095 1909004524 21051740 0 10957596 0 0 0 cpu0 143829475 3918 67658924 235696976 5168514 0 1475030 0 0 0 cpu1 144407338 1966 67616825 236756510 3969110 0 1392212 0 0 0 cpu2 144531920 2287 67567520 238021699 2713175 0 1363460 0 0 0 cpu3 143288938 2366 67474485 239715220 2223739 0 1356698 0 0 0 cpu4 143975390 3159 67394206 239494900 1948424 0 1343261 0 0 0 cpu5 144130685 2212 67538520 239431294 1780756 0 1349882 0 0 0 cpu6 144009592 2175 67536945 239683876 1668203 0 1340087 0 0 0 cpu7 143656038 2193 67340668 240204045 1579816 0 1336963 0 0 0
第一行代表的總的CPU信息,后面的是一個(gè)CPU的詳細(xì)信息。
但是這些具體的后面的列都是什么信息呢,我們可以通過(guò)man proc找到答案:
user (1) Time spent in user mode. nice (2) Time spent in user mode with low priority (nice). system (3) Time spent in system mode. idle (4) Time spent in the idle task. This value should be USER_HZ times the second entry in the /proc/uptime pseudo-file. iowait (since Linux 2.5.41) (5) Time waiting for I/O to complete. irq (since Linux 2.6.0-test4) (6) Time servicing interrupts. softirq (since Linux 2.6.0-test4) (7) Time servicing softirqs. steal (since Linux 2.6.11) (8) Stolen time, which is the time spent in other operating systems when running in a virtual‐ ized environment guest (since Linux 2.6.24) (9) Time spent running a virtual CPU for guest operating systems under the control of the Linux kernel. guest_nice (since Linux 2.6.33) (10) Time spent running a niced guest (virtual CPU for guest operating systems under the con‐ trol of the Linux kernel).
也就是說(shuō)從第二列開(kāi)始往后分別是user,nice,system,idle,iowait,irq(硬中斷),softirq(軟中斷),steal,guest,guest_nice的CPU時(shí)間,單位通常是10ms。那么top里面的比例又是怎么算出的呢?
由于CPU時(shí)間是一個(gè)累加值,所以我們要求一個(gè)時(shí)間段差值來(lái)反映當(dāng)前的CPU情況,top默認(rèn)是3s。例如現(xiàn)在取一個(gè)user值user1,和當(dāng)前的一個(gè)總量的CPU時(shí)間total1
其中total等于上面各項(xiàng)相加,也就是total=user+nice+system+idle+iowait+irq+softirq+steal+guest+guest_nice。3秒后再去一個(gè)user值user2和一個(gè)總量total2。
那么這3秒鐘的user平均cpu占比就等于((user2-user1)/ (total2-total1))/ 3 * 100%。另外每個(gè)具體的CPU計(jì)算方式同理。
top內(nèi)存相關(guān)的指標(biāo)直接讀取/proc/meminfo文件的對(duì)應(yīng)字段:
# cat /proc/meminfo MemTotal: 32781216 kB MemFree: 1043556 kB MemAvailable: 25108920 kB Buffers: 427516 kB Cached: 22084612 kB SwapCached: 0 kB Active: 18640888 kB Inactive: 10534920 kB Active(anon): 6664480 kB Inactive(anon): 412 kB Active(file): 11976408 kB Inactive(file): 10534508 kB Unevictable: 4 kB Mlocked: 4 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 1092 kB Writeback: 0 kB AnonPages: 6663764 kB Mapped: 347808 kB Shmem: 1212 kB Slab: 2201292 kB SReclaimable: 1957344 kB SUnreclaim: 243948 kB KernelStack: 73392 kB PageTables: 57300 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 16390608 kB Committed_AS: 42170784 kB VmallocTotal: 34359738367 kB VmallocUsed: 61924 kB VmallocChunk: 34359625048 kB HardwareCorrupted: 0 kB AnonHugePages: 364544 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 376680 kB DirectMap2M: 26886144 kB DirectMap1G: 8388608 kB
其中total對(duì)應(yīng)于MemTotal,free 對(duì)應(yīng)于MemFree,avail 對(duì)應(yīng)于MemAailable。
總結(jié)
文章從top命令的輸出結(jié)果開(kāi)始,說(shuō)明哪些指標(biāo)的異常值需要我們關(guān)注,最后介紹了top命令的cpu計(jì)算原理和mem的數(shù)據(jù)來(lái)源。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
centos7云主機(jī)系統(tǒng)下掛載磁盤的方法
本篇文章主要介紹了centos7云主機(jī)系統(tǒng)下掛載磁盤的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02Linux系統(tǒng)下 centos7下搭建ElasticSearch中間件及常用接口演示
ElasticSearch是一個(gè)基于Lucene的搜索服務(wù)器。它提供了一個(gè)分布式多用戶能力的全文搜索引擎,基于RESTful web接口。這篇文章主要介紹了Linux系統(tǒng)下 centos7下搭建ElasticSearch中間件及常用接口演示 ,需要的朋友可以參考下2019-07-07Linux中FTP賬號(hào)無(wú)法刪除文件夾的解決方案
本篇文章主要給大家分享了Linux中FTP賬號(hào)無(wú)法刪除文件夾的解決方案以及原因探索,有興趣的朋友學(xué)習(xí)下吧。2018-01-01總結(jié)Centos7系統(tǒng)加固知識(shí)點(diǎn)
本篇文章給大家詳細(xì)介紹了LINUX中Centos7系統(tǒng)加固的相關(guān)知識(shí)點(diǎn),如果大家對(duì)此有需要跟著學(xué)習(xí)下吧。2018-02-02Linux下二進(jìn)制編譯安裝MySql centos7的教程
這篇文章主要介紹了Linux下二進(jìn)制編譯安裝MySql centos7的教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09Linux(ubuntu)下實(shí)現(xiàn)增加/刪除文件權(quán)限
下面小編就為大家分享一篇Linux(ubuntu)下實(shí)現(xiàn)增加/刪除文件權(quán)限,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04關(guān)于Linux命令行下的數(shù)學(xué)運(yùn)算示例詳解
在Linux中直接使用數(shù)學(xué)運(yùn)算符進(jìn)行數(shù)學(xué)運(yùn)算往往得不到我們想要的計(jì)算結(jié)果。要在Shell中進(jìn)行數(shù)學(xué)運(yùn)算,我們需要借助點(diǎn)小手段。下面這篇文章主要給大家介紹了關(guān)于Linux命令行下的數(shù)學(xué)運(yùn)算的相關(guān)資料,需要的朋友可以參考下2018-05-05