top free vmstat

有時候我們除了依賴一些服務器的監控軟件來查看服務器的一些使用情況,更要掌握一些Linux服務器的查看使用狀態的命令,比如你的網站突然崩潰了,或者訪問速度像蝸牛一樣,這時候就要看一下服務器本身是不是出問題了,比如內存被你的緩存redis給寫爆啦,整理一下常用的 top free vmstat 三個命令

top | top -n 10

  1. 使用SSHClient客戶端連接到遠程Linux系統。使用top命令查看系統的當前運行的情況。如圖對top命令執行的結果做了簡單的圖解,下面針對每一項做詳細的解釋。


  2. top命令的第一行“top - 19:56:47 up 39 min,  3 users,  load average: 0.00, 0.00, 0.00”顯示的內容依次爲“系統當前時間 、系統到目前爲止已運行的時間、當前登錄系統的用戶數量、系統負載(任務隊列的平均長度)三個值分別爲1分鐘、5分鐘、15分鐘前到現在的平均值【這三個一般會小於1,如果持續高於5,請仔細查看那個程序影響系統的運行】”

  3. top命令的第二行“Tasks: 120 total,   2 running, 118 sleeping,   0 stopped,   0 zombie”顯示的內容依次“所有啓動的進程數”、“正在運行的進程數”、“掛起的進程數”、“停止的進程數”、“殭屍進程數”。


  4. top命令的第三行“Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st”顯示的內容依次爲“用戶空間佔用CPU百分比”、“內核空間佔用CPU百分比”、“用戶空間內改變過優先級的進程佔用CPU百分比”、“空閒CPU百分比”、“等待輸入輸出CPU時間百分比”、“CPU服務於硬件中斷所耗費的時間總額”、“CPU服務軟中斷所耗費的時間總額”、“Steal Time”

  5. top命令第四行“Mem:    508820k total,   480172k used,    28648k free,    41944k buffers”顯示內容依次爲“物理內存總量”、“已使用的物理內存”、“空閒物理內存”、“內核緩存內存量”。

  6. top命令第5行“Swap:   392184k total,        0k used,   392184k free,   259152k cached”顯示內容依次爲“交換區總量”、“已使用交互區總量”、“空閒交換區總量”、“緩衝的交換區總量”。

  7. top命令第5行“PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND ”顯示內容依次爲“進程ID”、“進程所有者”、“優先級”、“nice值,負值表示高優先級,正值表示低優先級”、“進程使用的虛擬內存總量”、“進程使用的、未被換出的物理內存大小”、“共享內存大小”、“進程狀態”、“上次更新到現在的CPU時間佔用百分比”、“進程使用的物理內存百分比”、“進程使用CPU總時間”、“命令名、命令行”。



序號 列名 含義
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

free -m 

解釋一下Linux上free命令的輸出。

  下面是free的運行結果,一共有4行。爲了方便說明,我加上了列號。這樣可以把free的輸出看成一個二維數組FO(Free Output)。例如:

  • FO[2][1] = 24677460
  • FO[3][2] = 10321516  
                   1          2          3          4          5          6
1              total       used       free     shared    buffers     cached
2 Mem:      24677460   23276064    1401396          0     870540   12084008
3 -/+ buffers/cache:   10321516   14355944
4 Swap:     25151484     224188   24927296

  free的輸出一共有四行,第四行爲交換區的信息,分別是交換的總量(total),使用量(used)和有多少空閒的交換區(free),這個比較清楚,不說太多。

  free輸出地第二行和第三行是比較讓人迷惑的。這兩行都是說明內存使用情況的。第一列是總量(total),第二列是使用量(used),第三列是可用量(free)。

  第一行的輸出時從操作系統(OS)來看的。也就是說,從OS的角度來看,計算機上一共有:

  • 24677460KB(缺省時free的單位爲KB)物理內存,即FO[2][1];
  • 在這些物理內存中有23276064KB(即FO[2][2])被使用了;
  • 還用1401396KB(即FO[2][3])是可用的;

這裏得到第一個等式:

  • FO[2][1] = FO[2][2] + FO[2][3]

FO[2][4]表示被幾個進程共享的內存的,現在已經deprecated,其值總是0(當然在一些系統上也可能不是0,主要取決於free命令是怎麼實現的)。

FO[2][5]表示被OS buffer住的內存。FO[2][6]表示被OS cache的內存。在有些時候buffer和cache這兩個詞經常混用。不過在一些比較低層的軟件裏是要區分這兩個詞的,看老外的洋文:

  • A buffer is something that has yet to be "written" to disk. 
  • A cache is something that has been "read" from the disk and stored for later use.

也就是說buffer是用於存放要輸出到disk(塊設備)的數據的,而cache是存放從disk上讀出的數據。這二者是爲了提高IO性能的,並由OS管理。

Linux和其他成熟的操作系統(例如windows),爲了提高IO read的性能,總是要多cache一些數據,這也就是爲什麼FO[2][6](cached memory)比較大,而FO[2][3]比較小的原因。我們可以做一個簡單的測試:

  1. 釋放掉被系統cache佔用的數據;
    echo 3>/proc/sys/vm/drop_caches

     

  2. 讀一個大文件,並記錄時間;
  3. 關閉該文件;
  4. 重讀這個大文件,並記錄時間;

第二次讀應該比第一次快很多。原來我做過一個BerkeleyDB的讀操作,大概要讀5G的文件,幾千萬條記錄。在我的環境上,第二次讀比第一次大概可以快9倍左右。

  free輸出的第二行是從一個應用程序的角度看系統內存的使用情況。

  • 對於FO[3][2],即-buffers/cache,表示一個應用程序認爲系統被用掉多少內存;
  • 對於FO[3][3],即+buffers/cache,表示一個應用程序認爲系統還有多少內存;

因爲被系統cache和buffer佔用的內存可以被快速回收,所以通常FO[3][3]比FO[2][3]會大很多。

這裏還用兩個等式:

  • FO[3][2] = FO[2][2] - FO[2][5] - FO[2][6]
  • FO[3][3] = FO[2][3] + FO[2][5] + FO[2][6]

這二者都不難理解。

  free命令由procps.*.rpm提供(在Redhat系列的OS上)。free命令的所有輸出值都是從/proc/meminfo中讀出的。

在系統上可能有meminfo(2)這個函數,它就是爲了解析/proc/meminfo的。procps這個包自己實現了meminfo()這個函數。可以下載一個procps的tar包看看具體實現,現在最新版式3.2.8。



vmstat 2 1 | vmstat 2
vmstat工具的使用是通過兩個數字參數來完成的,第一個參數是採樣的時間間隔數,單位是秒,第二個參數是採樣的次數

類別

項目

含義

說明

Procs(進程)

r

等待執行的任務數

展示了正在執行和等待cpu資源的任務個數。當這個值超過了cpu個數,就會出現cpu瓶頸。

B

等待IO的進程數量

 

Memory(內存)

swpd

正在使用虛擬的內存大小,單位k

 

free

空閒內存大小

 

buff

已用的buff大小,對塊設備的讀寫進行緩衝

 

cache

已用的cache大小,文件系統的cache

 

inact

非活躍內存大小,即被標明可回收的內存,區別於free和active

具體含義見:概念補充(當使用-a選項時顯示)

active

活躍的內存大小

具體含義見:概念補充(當使用-a選項時顯示)

Swap

si

每秒從交換區寫入內存的大小(單位:kb/s)

 

so

每秒從內存寫到交換區的大小

 

IO

bi

每秒讀取的塊數(讀磁盤)

現在的Linux版本塊的大小爲1024bytes

bo

每秒寫入的塊數(寫磁盤)

 

system

in

每秒中斷數,包括時鐘中斷

這兩個值越大,會看到由內核消耗的cpu時間會越多

cs

每秒上下文切換數

CPU(以百分比表示)

Us

用戶進程執行消耗cpu時間(user time)

us的值比較高時,說明用戶進程消耗的cpu時間多,但是如果長期超過50%的使用,那麼我們就該考慮優化程序算法或其他措施了

Sy

系統進程消耗cpu時間(system time)

sys的值過高時,說明系統內核消耗的cpu資源多,這個不是良性的表現,我們應該檢查原因。

Id

空閒時間(包括IO等待時間)

 

wa

等待IO時間

Wa過高時,說明io等待比較嚴重,這可能是由於磁盤大量隨機訪問造成的,也有可能是磁盤的帶寬出現瓶頸。








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