top命令輸出詳解

前言

Linux下的top命令我相信你們都用過,自從我接觸Linux以來就一直用top查看進程的CPU和MEM排行榜。可是top命令的其餘輸出結果我都沒有了解,這些指標都表明什麼呢,什麼狀況下須要關注呢?以及top命令輸出結果的來源數據是什麼呢,又是怎麼一個計算原理呢?python

演示環境

# 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下經常使用的性能分析工具,可以實時(默認是3s刷新一次)的顯示系統的資源使用狀況,以及各類進程的資源使用狀況,相似於Windows的任務管理器。centos

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                                                                                                                                                                  
23444 root      20   0   15.6g 461676   4704 R 198.0  1.4  11:15.26 python                                                                                                                                                                   
16729 root      20   0 9725596 240028   4672 R 113.0  0.7   7:48.49 python                                                                                                                                                                   
 3388 root      20   0 6878028 143196   4720 S  82.4  0.4   1:35.03 python       

第一行數據至關於uptime命令輸出。11:00:54是當前時間,up 54 days,23:55 是系統已經運行的時間,6 users表示當前有6個用戶在登陸,load average:16.32,18.75,21.04分別表示系統一分鐘平均負載,5分鐘平均負載,15分鐘平均負載。緩存

平均負載網絡

平均負載表示的平均活躍進程數,包括正在running的進程數,準備running(就緒態)的進程數,和處於不可中斷睡眠狀態的進程數。若是平均負載數恰好等於CPU核數,那證實每一個核都能獲得很好的利用,若是平均負載數大於核數證實系統處於過載的狀態,一般認爲是超過核數的70%認爲是嚴重過載,須要關注。還需結合1分鐘平均負載,5分鐘平均負載,15分鐘平均負載看負載的趨勢,若是1分鐘負載比較高,5分鐘和15分鐘的平均負載都比較低,則說明是瞬間升高,須要觀察。若是三個值都很高則須要關注下是否某個進程在瘋狂消耗CPU或者有頻繁的IO操做,也有多是系統運行的進程太多,頻繁的進程切換致使。好比說上面的演示環境是一臺8核的centos機器,證實系統是長期處於過載狀態在運行。數據結構

Tasks: 214 total,   4 running, 209 sleeping,   0 stopped,   1 zombie

第二行的Tasks信息展現的系統運行的總體進程數量和狀態信息。214 total 表示系統如今一共有214個用戶進程,4 running 表示4個進程正在處於running狀態,209 sleeping表示209個進程正處於sleeping狀態,0 stopped 表示 0 個進程正處於stopped狀態,1 zombie表示 有1個殭屍進程。app

殭屍進程工具

子進程結束時父進程沒有調用wait()/waitpid()等待子進程結束,那麼就會產生殭屍進程。緣由是子進程結束時並無真正退出,而是留下一個殭屍進程的數據結構在系統進程表中,等待父進程清理,若是父進程已經退出則會由init進程接替父進程進行處理(收屍)。因而可知,若是父進程不做爲而且又不退出,就會有大量的殭屍進程,每一個殭屍進程會佔用進程表的一個位置(slot),若是殭屍進程太多會致使系統沒法建立新的進程,由於進程表的容量是有限的。因此當zombie這個指標太大時須要引發咱們的注意。下面的進程詳細信息中的S列就表明進程的運行狀態,Z表示該進程是殭屍進程。性能

消滅殭屍進程的方法:優化

1.找到殭屍進程的父進程pid(pstress能夠顯示進程父子關係),kill -9 pid,父進程退出後init自動會清理殭屍進程。(須要注意的是kill -9並不能殺死殭屍進程)spa

2.重啓系統。

%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 表示用戶態的CPU時間比例
  • sy system 表示內核態的CPU時間比例
  • ni nice 表示運行低優先級進程的CPU時間比例
  • id idle 表示空閒CPU時間比例
  • wa iowait 表示處於IO等待的CPU時間比例
  • hi hard interrupt 表示處理硬中斷的CPU時間比例
  • si soft interrupt 表示處理軟中斷的CPU時間比例
  • st steal 表示當前系統運行在虛擬機中的時候,被其餘虛擬機佔用的CPU時間比例。

因此總體的CPU使用率=1-id。當us很高時,證實CPU時間主要消耗在用戶代碼,須要優化用戶代碼。sy很高時,說明CPU時間都消耗在內核,要麼是頻繁的系統調用,要麼是頻繁的CPU切換(進程切換/線程切換)。wa很高時,說明有進程在進程頻繁的IO操做,有多是磁盤IO,也有多是網絡IO。si很高時,說明CPU時間消耗在處理軟中斷,網絡收發包會觸發系統軟中斷,因此大量的網絡小包會致使軟中斷的頻繁觸發,典型的SYN Floor會致使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行顯示的是系統內存使用狀況。單位是KiB。totol 表示總內存,free 表示沒使用過的內容,used是已經使用的內存。buff表示用於讀寫磁盤緩存的內存,cache表示用於讀寫文件緩存的內存。avail表示可用的應用內存。

Swap原理是把一塊磁盤空間或者一個本地文件當成內存來使用。Swap total表示能用的swap總量,swap free表示剩餘,used表示已經使用的。這三個值都爲0表示系統關閉了swap功能,因爲演示環境是一臺虛擬機,虛擬機通常都關閉swap功能。

第6行開始日後表示的是具體的每一個進程狀態:

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND 
  • PID 進程ID
  • USER 進程全部者的用戶名,例如root
  • PR 進程調度優先級
  • NI 進程nice值(優先級),越小的值表明越高的優先級
  • VIRT 進程使用的虛擬內存
  • RES 進程使用的物理內存(不包括共享內存)
  • SHR 進程使用的共享內存
  • CPU 進程使用的CPU佔比
  • MEM 進程使用的內存佔比
  • TIME 進程啓動後到如今所用的所有CPU時間
  • COMMAND 進程的啓動命令(默認只顯示二進制,top -c可以顯示命令行和啓動參數)

計算原理

在介紹top命令的各項指標計算原理以前,有必要先介紹下Linux下的proc文件系統,由於top命令的各項數據來源於proc文件系統。proc文件系統是一個虛擬的文件系統,是Linux內核和用戶的一種通訊方式,Linux內核會經過proc文件系統告訴用戶如今內核的狀態信息,用戶也能夠經過寫proc的方式設置內核的一些行爲。與普通文件不一樣的是,這些proc文件是動態建立的,也是動態修改的,由於內核的狀態時刻都在變化。

top顯示的CPU指標都是來源於/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信息,後面的是一個CPU的詳細信息。

可是這些具體的後面的列都是什麼信息呢,咱們能夠經過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).

也就是說從第二列開始日後分別是user,nice,system,idle,iowait,irq(硬中斷),softirq(軟中斷),steal,guest,guest_nice的CPU時間,單位一般是10ms。那麼top裏面的比例又是怎麼算出的呢?

因爲CPU時間是一個累加值,因此咱們要求一個時間段差值來反映當前的CPU狀況,top默認是3s。例如如今取一個user值user1,和當前的一個總量的CPU時間total1

其中total等於上面各項相加,也就是total=user+nice+system+idle+iowait+irq+softirq+steal+guest+guest_nice。3秒後再去一個user值user2和一個總量total2。

那麼這3秒鐘的user平均cpu佔比就等於((user2-user1)/ (total2-total1))/ 3 * 100%。另外每一個具體的CPU計算方式同理。

top內存相關的指標直接讀取/proc/meminfo文件的對應字段:

# 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對應於MemTotal,free 對應於MemFree,avail 對應於MemAailable。

總結

文章從top命令的輸出結果開始,說明哪些指標的異常值須要咱們關注,最後介紹了top命令的cpu計算原理和mem的數據來源。

相關文章
相關標籤/搜索