淺談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 是系統級,沒辦法精確到程序,比如只能告訴你現在磁碟很忙,但是沒辦法告訴你是誰在忙,在忙什麼?