1. 程式人生 > >淺談cpu負載、io、記憶體的查詢命令top vmstat mpstat iostat

淺談cpu負載、io、記憶體的查詢命令top vmstat mpstat iostat

敘述的比較簡單,主要是我一段時間不看,這些想top vmstat mpstat iostat都不會用,用了其中的一些引數不太清晰是什麼意思,所以自己寫個方便看也加深印象

如果沒有裝*.stat 可以yum install sysstat

一、關於top

top - 02:18:30 up 2 days, 18:31,  4 users,  load average: 0.00, 0.01, 0.05

Tasks: 287 total,     1 running,   286 sleeping,     0 stopped,    0 zombie
%Cpu(s):  0.2 us,   0.0 sy,   0.0 ni,  99.7 id,   0.0 wa,   0.0 hi,   0.0 si,   0.0 st
KiB Mem : 16250284 total, 10784844 free,  2007344 used,  3458096 buff/cache
KiB Swap:  2559996 total,  2559996 free,        0 used. 13798652 avail Mem

 PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND

1.在這裡我主要是看cpu  記憶體 的大概使用情況    (當前時間、線上時間、使用者)

 關於load average 分別是1分鐘、5分鐘、15分鐘的平均Load        是一個大概的引數,要結合cpu核和個數來看,lscpu 這個  命令簡單檢視核數和個數   ,關於Load在CPU中可以理解為CPU可以並行處理的任務數,那麼就是“CPU個數 * 核數”,CPU Load = CPU個數 * 核數 那麼就是說CPU正好滿負載,要保證效能有人說最好是小於CPU個數 * 核數 *0.7,對應值最好看load average 5 和15分

要知道每個cpu使用情況我清楚三種方法():

a.top  在動態的top按數字1

b.mpstat -P ALL

c.sar -P ALL

2.VIRT    RES    SHR引數

VIRT:virtual memory usage 虛擬記憶體
a.程序“需要的”虛擬記憶體大小,包括程序使用的庫、程式碼、資料等
b.假如程序申請100m的記憶體,但實際只使用了10m,那麼它會增長100m,而不是實際的使用量

RES:resident memory usage 常駐記憶體
a.程序當前使用的記憶體大小,但不包括swap out
b.包含其他程序的共享
c.如果申請100m的記憶體,實際使用10m,它只增長10m,與VIRT相反
d.關於庫佔用記憶體的情況,它只統計載入的庫檔案所佔記憶體大小

SHR:shared memory 共享記憶體
a.除了自身程序的共享記憶體,也包括其他程序的共享記憶體
b.雖然程序只使用了幾個共享庫的函式,但它包含了整個共享庫的大小
c.計算某個程序所佔的實體記憶體大小公式:RES – SHR
d.swap out後,它將會降下來

3.記憶體前面都好看,主要是 buff/cache難理解。關於top中buff/cache在centos6和cento7點點不一樣,這裡不解惑

a.caching是當在Linux下頻繁存取檔案後,實體記憶體會很快被用光,當程式結束後,記憶體不會被正常釋放

b.buff全稱buffer  快取區,快取

我copy一段,望大家能看懂

buffers/cache佔用的較多,說明系統中有程序曾經讀寫過檔案,但是不要緊,這部分記憶體是當空閒來用的

Linux核心會在記憶體將要耗盡的時候,觸發記憶體回收的工作,以便釋放出記憶體給急需記憶體的程序使用。一般情況下,這個操作中主要的記憶體釋放都來自於對buffer/cache的釋放。尤其是被使用更多的cache空間。既然它主要用來做快取,只是在記憶體夠用的時候加快程序對檔案的讀寫速度,那麼在記憶體壓力較大的情況下,當然有必要清空釋放cache,作為free空間分給相關程序使用。所以一般情況下,我們認為buffer/cache空間可以被釋放,這個理解是正確的。
但是這種清快取的工作也並不是沒有成本。理解cache是幹什麼的就可以明白清快取必須保證cache中的資料跟對應檔案中的資料一致,才能對cache進行釋放。所以伴隨著cache清除的行為的,一般都是系統IO飆高。因為核心要對比cache中的資料和對應硬碟檔案上的資料是否一致,如果不一致需要寫回,之後才能回收

原文:https://blog.csdn.net/u014520745/article/details/79949874

關於記憶體命令還有free

二、與top 看cpu load average相似的還有vmstat

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free          buff        cache     si   so    bi    bo   in  cs us sy  id  wa st
 2  0     0   10786340 122592  3335728    0    0     0     1    6    1   0  0  100  0   0

類別

專案

含義

說明

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等待比較嚴重,這可能是由於磁碟大量隨機訪問造成的,也有可能是磁碟的頻寬出現瓶頸。

三、關於io不得不談iostat

常見用法:

iostat -d -k  1    10       (-d 裝置使用狀態  -k使用block為單位的列強制kilobytes為單位   1每秒資料   10取10段資料)

 iostat -d -x  1 10   檢視裝置使用率(%util)、響應時間(await)

iostat -xd 1 1

Linux 3.10.0-862.14.4.el7.x86_64 (pxe)  11/13/2018      _x86_64_        (16 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s  avgrq-sz  avgqu-sz   await  r_await   w_await  svctm  %util
sda               0.00       0.13       0.19    0.30    0.01     0.02      114.77       0.02        48.26    16.47    68.45     1.59      0.08

rrqm/s:每秒這個裝置相關的讀取請求有多少被Merge了(當系統呼叫需要讀取資料的時候,VFS將請求發到各個FS,如果FS發現不同的讀取請求讀取的是相同Block的資料,FS會將這個請求合併Merge);wrqm/s:每秒這個裝置相關的寫入請求有多少被Merge了。

rsec/s:每秒讀取的扇區數;wsec/:每秒寫入的扇區數。r/s:The number of read requests that were issued to the device per second;w/s:The number of write requests that were issued to the device per second;

await:每一個IO請求的處理的平均時間(單位是毫秒)。這裡可以理解為IO的響應時間,一般地系統IO響應時間應該低於5ms,如果大於10ms就比較大了。

%util:在統計時間內所有處理IO時間,除以總共統計時間。例如,如果統計間隔1秒,該裝置有0.8秒在處理IO,而0.2秒閒置,那麼該裝置的%util = 0.8/1 = 80%,所以該引數暗示了裝置的繁忙程度。一般地,如果該引數是100%表示裝置已經接近滿負荷運行了(當然如果是多磁碟,即使%util是100%,因為磁碟的併發能力,所以磁碟使用未必就到了瓶頸)

argrq-sz    提交給驅動層的IO請求大小,一般不小於4K,不大於max(readahead_kb, max_sectors_kb)

                可用於判斷當前的IO模式,一般情況下,尤其是磁碟繁忙時, 越大代表順序,越小代表隨機

svctm        一次IO請求的服務時間,對於單塊盤,完全隨機讀時,基本在7ms左右,既尋道+旋轉延遲時間

注: 各統計量之間關係

=======================================

%util = ( r/s  +  w/s) * svctm / 1000                        # 佇列長度 =  到達率     *  平均服務時間                    
avgrq-sz = ( rMB/s + wMB/s) * 2048 / (r/s  + w/s)    # 2048 為 1M / 512

=======================================

總結:

iostat 統計的是通用塊層經過合併(rrqm/s, wrqm/s)後,直接向裝置提交的IO資料,可以反映系統整體的IO狀況,但是有以下2個缺點:

1  距離業務層比較遙遠,跟程式碼中的write,read不對應(由於系統預讀 + pagecache + IO排程演算法等因素, 也很難對應)

2  是系統級,沒辦法精確到程序,比如只能告訴你現在磁碟很忙,但是沒辦法告訴你是誰在忙,在忙什麼?