Linux:vmstat指令
學習自:
1、Linux分頁管理概述
vmstat(Virtual Memory Statistics,虛擬內存),用于對OS的虛擬內存、進程、CPU活動進行監控。
它是對系統整體情況的分析,無法對某個進程進行深入分析。
1)虛擬內存
Linux系統內存分為物理內存、虛擬內存兩種。
物理內存就是物理內存條上的內存。
虛擬內存是邏輯內存,是指利用硬盤上部分空間作為物理內存的補充,將暫時不用的內存頁寫到硬盤上以空出更多的物理內存供又需要的進程使用。當這些內存頁需要再次使用時,才從虛擬內存中讀回。這一過程對用戶透明。
對Linux來說,虛擬內存就是Swap分區。
2)頁面交換
Linux的內存管理采取的是頁式存取,為保證物理內存可以得到充分使用,內核會在適當時機將內存中最近不常用到頁自動交換到虛擬內存,而將經常使用的信息保存到物理內存。
Linux的頁面交換是不定時進行的,以保證盡可能多的空出物理內存,即使當前物理內存充足,它也會交換,以避免出現實際要交換時卻等待交換的現象。
Linux的頁面交換是有條件的,并非所有頁面不用時都會交換到虛擬內存,Linux內核采用最近最常使用算法,僅將一些不經常使用的頁面交換到虛擬內存。因此有時會看到這種情況:Liunx的物理內存還有很多,但是swap空間也用了很多,這是正常現象。例如一個占用很多內存的進程運行時需要耗費很多資源,此時會有一些不常用的頁面文件交換到swap區,當后續該進程結束并釋放內存,剛剛交換出去的頁并不會主動交換回來,除非它們將要被使用。此時就會出現上述物理內存空閑、swap空間也有占用的現象。
當swap區要交換進來時,它會首先被交換到物理內存,如果此時沒有足夠的物理內存容納這些頁,它們會被立刻交換出去。此時swap區也可能沒有足夠空間來存儲這些頁,最終導致Linux出現假死機、服務異常情況。
3)Linux頁面交換流程
系統中每個進程都需要使用內存,但并非每個進程需要時時刻刻占用內存。
當系統運行所需內存超過了實際物理內存,內核會釋放某些進程所占用但未使用的部分或全部物理內存,將這些進程頁調度到磁盤空間,即上文提到的swap區。此時在物理內存中空出的內存會提供給有需要的進程使用。
在Linux中,通過調頁Paging、交換Swaping實現上述內存調度。調度算法是將最近不常使用的頁面交換到swap區,把活動頁面留到內存中供進程使用。交換的是整個進程全部頁面而非部分頁面。
頁寫入磁盤的過程稱為Page-Out。
頁從磁盤重回內存的過程稱為Page-In。
當內核需要一個頁,但是該頁不在物理內存中,此時會觸發分頁錯誤(Page Fault)。
當內核發現可運行內存減少時,就會通過Page-Out來釋放一部分物理內存。
2、vmstat
1)用途
顯示swap區內存信息。
2)用法
vmstat [-a] [-n] [-S unit] [delay [ count]] vmstat [-s] [-n] [-S unit] vmstat [-m] [-n] [delay [ count]] vmstat [-d] [-n] [delay [ count]] vmstat [-p disk partition] [-n] [delay [ count]] vmstat [-f] vmstat [-V]
這里的delay、count不是參數名,而是具體的數字:
delay:每隔多少秒輸出一次;
count:一共輸出幾次
vmstat -a 2 5
每隔2s輸出一次,一共輸出5次。
3)參數
| 參數 | 說明 |
| a |
顯示active、inactive內存: active:當前進程使用的內存 inactive:已經分配了,但是還未被使用的內存 |
| s |
顯示內存相關統計信息及多種系統活動數量 顯示內存使用的詳細信息 |
| m | 顯示slabinfo |
| d |
顯示磁盤相關統計信息 |
| p | 顯示指定磁盤分區統計信息 |
| n |
只顯示一次表頭 如果不加該參數,每輸出44行就重復顯示一次表頭 |
| S |
使用指定單位,后跟k、K、m、M。 分別代表103,210,106,220B。 默認為K。 |
| f |
顯示系統啟動至今的fork數量。 fork:Linux函數,用于創建子進程,原進程稱為父進程。 |
| V | vmstat版本信息 |
4)輸出字段說明
常規
vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 0 389880 3128 281808 0 0 40 17 75 109 0 0 100 0 0 vmstat -a procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free inact active si so bi bo in cs us sy id wa st 3 0 0 470148 156800 76880 0 0 400 79 97 196 0 1 98 0 0
| 指標 | 用途 | 說明 |
| procs | ||
| r | running,運行隊列中進程數量 |
r>cpu個數,代表當前系統運行慢,有較多進程等待cpu r>4×cpu個數,代表CPU短缺或速率過低 |
| b | 等待IO的進程數量 | 如果disk≠0且b>3,代表io性能不好 |
| memory | ||
| swpd | 已使用swap空間大小 | |
| free | 可用物理內存大小 | |
| buff | 緩沖區內存大小 | |
| cache | 緩存區內存大小 | |
| inact | 非活躍內存(參數-a) | |
| active | 活躍內存(參數-a) | |
| swap | ||
| si | 每秒從swap區寫到內存的大小 | |
| so | 每秒從內存寫到swap區的大小 | |
| io | ||
| bi | 每秒從磁盤讀取的頁數 | 如果長期bi、bo≠0,代表內存不足 |
| bo | 每秒寫入磁盤的頁數 | |
| system | ||
| in | 每秒中斷數,包括時鐘中斷 | |
| cs | 每秒上下文切換數 | |
| CPU | ||
| us | 用戶進程執行時間百分比 |
1)id+us+sy=100 2)如果r>4,且id經常<40,表示cpu負荷很重 3)如果id持續為0且sy>2×us,代表系統面臨CPU資源短缺的問題 |
| sy | 系統進程執行時間百分比 | |
| id | CPU空閑時間百分比 | |
| wa | 等待IO時間 | |
| st | 被虛擬機使用的CPU時間百分比 | |
磁盤:-d
vmstat -d disk- ------------reads------------ ------------writes----------- -----IO------ total merged sectors ms total merged sectors ms cur sec sda 4199 3 350807 3582 308 28 69832 728 0 3 sr0 31 0 147 292 0 0 0 0 0 0
該信息來自/proc/diskstats
| 指標 | 用途 | 說明 |
| reads | ||
| total | 成功讀取的總數 | |
| merged | 分組讀取(產生一個IO) | |
| sectors | 成功讀取的扇區數 | |
| ms | 讀取花費的毫秒 | |
| writes | ||
| total | 成功寫入的總數 | |
| merged | 分組寫入(產生一個IO) | |
| sectors | 成功寫入的扇區數 | |
| ms | 寫入花費的毫秒 | |
| IO | ||
| cur | 正在進行的IO數 | |
| sec | IO花費的秒數 | |
指定磁盤:-p
vmstat -p /dev/sda1 sda1 reads read sectors writes requested writes 156 89110 2 4096
| 指標 | 用途 | 說明 |
| reads | 來自該分區的讀取次數 | |
| read sectors | 來自該分區的讀扇區次數 | |
| writes | 來自該分區的寫入次數 | |
| requested writes | 來自該分區的寫請求次數 |
slab:-m
vmstat -m Cache Num Total Size Pages xfs_dqtrx 0 0 528 15 xfs_dquot 0 0 496 8 xfs_buf 1431 1431 448 9 xfs_bui_item 0 0 200 20 xfs_bud_item 0 0 168 24…… kmem_cache_node 256 256 64 64 kmem_cache 234 234 448 9
該信息來自/proc/slabinfo
Linux的內存分配是以頁為單位,但是如果給某些小對象分配一個完整的頁,會導致頁空間存在浪費。slab可以把頁劃分為多個相等的小內存單元,再把這些小對象統一分到一個頁中,進而減少內部碎片產生(學習自:Linux 內存管理(八)之 slab 分配器_linux slab-CSDN博客)。
5)例子
①每秒采樣一次,一共采兩次
vmstat 1 2 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 4 0 0 470088 4168 206808 0 0 538 106 108 228 1 1 98 0 0 0 0 0 470028 4168 206808 0 0 0 0 84 127 0 0 100 0 0
②指定輸出單位為MB:-S
vmstat -S M procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 0 459 4 201 0 0 457 90 103 211 1 1 98 0 0
③顯示活躍、非活躍內存:-a
vmstat -a procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free inact active si so bi bo in cs us sy id wa st 3 0 0 470148 156800 76880 0 0 400 79 97 196 0 1 98 0 0
在使用參數-a時,所顯示內容相比經典輸出,只是增加了active和inact。
④查看系統fork了多少次:-f
vmstat -f 1291 forks
fork是Linux的一個重要函數,代表從原進程中創建一個子進程,原進程稱為父進程。
該數據來源于/proc/stat中的processes字段:
cat /proc/stat cpu 216 1 392 69682 39 86 21 0 0 0 cpu0 216 1 392 69682 39 86 21 0 0 0 intr 58434 …… ctxt 111387 btime 1730164117 processes 1295 procs_running 3 procs_blocked 0 softirq 57128 7 18948 133 1764 4572 0 101 0 0 31603
⑤顯示內存使用的詳細信息:-s
vmstat -s 828592 K total memory 147540 K used memory 76888 K active memory 156836 K inactive memory 470008 K free memory 4168 K buffer memory 206876 K swap cache 1952764 K total swap 0 K used swap 1952764 K free swap 216 non-nice user cpu ticks 1 nice user cpu ticks 397 system cpu ticks 80120 idle cpu ticks 39 IO-wait cpu ticks 95 IRQ cpu ticks 24 softirq cpu ticks 0 stolen cpu ticks 175473 pages paged in 34748 pages paged out 0 pages swapped in 0 pages swapped out 65064 interrupts 121999 CPU context switches 1730164117 boot time 1296 forks
這些信息分別來自于:/proc/meminfo、/proc/stat、/proc/vmstat
默認顯示單位為KB,可以用-S將單位調整為MB
vmstat -sS M 809 M total memory 144 M used memory 75 M active memory 153 M inactive memory 458 M free memory 4 M buffer memory 202 M swap cache 1906 M total swap 0 M used swap 1906 M free swap 217 non-nice user cpu ticks 1 nice user cpu ticks 398 system cpu ticks 80731 idle cpu ticks 40 IO-wait cpu ticks 96 IRQ cpu ticks 24 softirq cpu ticks 0 stolen cpu ticks 175473 pages paged in 34748 pages paged out 0 pages swapped in 0 pages swapped out 65420 interrupts 122594 CPU context switches 1730164117 boot time 1297 forks

浙公網安備 33010602011771號