vmstat是Virtual Meomory Statistics(虛擬記憶體統計)的縮寫,可對作業系統的虛擬記憶體、程式、CPU活動進行監控。他是對系統的整體情況進行統計,不足之處是無法對某個程式進行深入分析。vmstat 工具提供了一種低開銷的系統效能觀察方式。因為 vmstat 本身就是低開銷工具,在非常高負荷的伺服器上,你需要檢視並監控系統的健康情況,在控制視窗還是能夠使用vmstat 輸出結果。在學習vmstat命令前,我們先了解一下Linux系統中關於實體記憶體和虛擬記憶體相關資訊。
實體記憶體和虛擬記憶體區別:
我們知道,直接從實體記憶體讀寫資料要比從硬碟讀寫資料要快的多,因此,我們希望所有資料的讀取和寫入都在記憶體完成,而記憶體是有限的,這樣就引出了實體記憶體與虛擬記憶體的概念。
實體記憶體就是系統硬體提供的記憶體大小,是真正的記憶體,相對於實體記憶體,在linux下還有一個虛擬記憶體的概念,虛擬記憶體就是為了滿足實體記憶體的不足而提出的策略,它是利用磁碟空間虛擬出的一塊邏輯記憶體,用作虛擬記憶體的磁碟空間被稱為交換空間(Swap Space)。
作為實體記憶體的擴充套件,linux會在實體記憶體不足時,使用交換分割槽的虛擬記憶體,更詳細的說,就是核心會將暫時不用的記憶體塊資訊寫到交換空間,這樣以來,實體記憶體得到了釋放,這塊記憶體就可以用於其它目的,當需要用到原始的內容時,這些資訊會被重新從交換空間讀入實體記憶體。
linux的記憶體管理採取的是分頁存取機制,為了保證實體記憶體能得到充分的利用,核心會在適當的時候將實體記憶體中不經常使用的資料塊自動交換到虛擬記憶體中,而將經常使用的資訊保留到實體記憶體。
要深入瞭解linux記憶體執行機制,需要知道下面提到的幾個方面:
首先,Linux系統會不時的進行頁面交換操作,以保持儘可能多的空閒實體記憶體,即使並沒有什麼事情需要記憶體,Linux也會交換出暫時不用的記憶體頁面。這可以避免等待交換所需的時間。
其次,linux進行頁面交換是有條件的,不是所有頁面在不用時都交換到虛擬記憶體,linux核心根據”最近最經常使用“演算法,僅僅將一些不經常使用的頁面檔案交換到虛擬記憶體,有時我們會看到這麼一個現象:linux實體記憶體還有很多,但是交換空間也使用了很多。其實,這並不奇怪,例如,一個佔用很大記憶體的程式執行時,需要耗費很多記憶體資源,此時就會有一些不常用頁面檔案被交換到虛擬記憶體中,但後來這個佔用很多記憶體資源的程式結束並釋放了很多記憶體時,剛才被交換出去的頁面檔案並不會自動的交換進實體記憶體,除非有這個必要,那麼此刻系統實體記憶體就會空閒很多,同時交換空間也在被使用,就出現了剛才所說的現象了。關於這點,不用擔心什麼,只要知道是怎麼一回事就可以了。
最後,交換空間的頁面在使用時會首先被交換到實體記憶體,如果此時沒有足夠的實體記憶體來容納這些頁面,它們又會被馬上交換出去,如此以來,虛擬記憶體中可能沒有足夠空間來儲存這些交換頁面,最終會導致linux出現假當機、服務異常等問題,linux雖然可以在一段時間內自行恢復,但是恢復後的系統已經基本不可用了。
因此,合理規劃和設計linux記憶體的使用,是非常重要的。
虛擬記憶體原理:
在系統中執行的每個程式都需要使用到記憶體,但不是每個程式都需要每時每刻使用系統分配的記憶體空間。當系統執行所需記憶體超過實際的實體記憶體,核心會釋放某些程式所佔用但未使用的部分或所有實體記憶體,將這部分資料儲存在磁碟上直到程式下一次呼叫,並將釋放出的記憶體提供給有需要的程式使用。
在Linux記憶體管理中,主要是通過“調頁Paging”和“交換Swapping”來完成上述的記憶體排程。調頁演算法是將記憶體中最近不常使用的頁面換到磁碟上,把活動頁面保留在記憶體中供程式使用。交換技術是將整個程式,而不是部分頁面,全部交換到磁碟上。
分頁(Page)寫入磁碟的過程被稱作Page-Out,分頁(Page)從磁碟重新回到記憶體的過程被稱作Page-In。當核心需要一個分頁時,但發現此分頁不在實體記憶體中(因為已經被Page-Out了),此時就發生了分頁錯誤(Page Fault)。
當系統核心發現可執行記憶體變少時,就會通過Page-Out來釋放一部分實體記憶體。經管Page-Out不是經常發生,但是如果Page-out頻繁不斷的發生,直到當核心管理分頁的時間超過執行程式的時間時,系統效能會急劇下降。這時的系統已經執行非常慢或進入暫停狀態,這種狀態亦被稱作thrashing(顛簸)。
1.命令格式:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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] |
2.命令功能:
用來顯示虛擬記憶體的資訊
3.命令引數:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
-a:顯示活躍和非活躍記憶體 -f:顯示從系統啟動至今的fork數量 。 -m:顯示slabinfo -n:只在開始時顯示一次各欄位名稱。 -s:顯示記憶體相關統計資訊及多種系統活動數量。 delay:重新整理時間間隔。如果不指定,只顯示一條結果。 count:重新整理次數。如果不指定重新整理次數,但指定了重新整理時間間隔,這時重新整理次數為無窮。 -d:顯示磁碟相關統計資訊。 -p:顯示指定磁碟分割槽統計資訊 -S:使用指定單位顯示。引數有 k 、K 、m 、M ,分別代表1000、1024、1000000、1048576位元組(byte)。預設單位為K(1024 bytes) -V:顯示vmstat版本資訊。 |
4.使用例項:
例項1:顯示虛擬記憶體使用情況
命令:
1 |
vmstat |
輸出:
1 2 3 4 5 6 7 8 9 10 |
[root@localhost ~]# vmstat 5 6 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 3029876 199616 690980 0 0 0 2 3 2 0 0 100 0 0 0 0 0 3029752 199616 690980 0 0 0 41 1009 39 0 0 100 0 0 0 0 0 3029752 199616 690980 0 0 0 3 1004 36 0 0 100 0 0 0 0 0 3029752 199616 690980 0 0 0 4 1004 36 0 0 100 0 0 0 0 0 3029752 199616 690980 0 0 0 6 1003 33 0 0 100 0 0 0 0 0 3029752 199616 690980 0 0 0 5 1003 33 0 0 100 0 0 |
說明:
欄位說明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
Procs(程式): r: 執行佇列中程式數量 b: 等待IO的程式數量 Memory(記憶體): swpd: 使用虛擬記憶體大小 free: 可用記憶體大小 buff: 用作緩衝的記憶體大小 cache: 用作快取的記憶體大小 Swap: si: 每秒從交換區寫到記憶體的大小 so: 每秒寫入交換區的記憶體大小 IO:(現在的Linux版本塊的大小為1024bytes) bi: 每秒讀取的塊數 bo: 每秒寫入的塊數 系統: in: 每秒中斷數,包括時鐘中斷。 cs: 每秒上下文切換數。 CPU(以百分比表示): us: 使用者程式執行時間(user time) sy: 系統程式執行時間(system time) id: 空閒時間(包括IO等待時間),中央處理器的空閒時間 。以百分比表示。 wa: 等待IO時間 |
備註: 如果 r經常大於 4 ,且id經常少於40,表示cpu的負荷很重。如果pi,po 長期不等於0,表示記憶體不足。如果disk 經常不等於0, 且在 b中的佇列 大於3, 表示 io效能不好。Linux在具有高穩定性、可靠性的同時,具有很好的可伸縮性和擴充套件性,能夠針對不同的應用和硬體環境調整,優化出滿足當前應用需要的最佳效能。因此企業在維護Linux系統、進行系統調優時,瞭解系統效能分析工具是至關重要的。
命令:
1 |
vmstat 5 5 |
表示在5秒時間內進行5次取樣。將得到一個資料彙總他能夠反映真正的系統情況。
例項2:顯示活躍和非活躍記憶體
命令:
1 |
vmstat -a 2 5 |
輸出:
1 2 3 4 5 6 7 8 9 10 |
[root@localhost ~]# vmstat -a 2 5 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free inact active si so bi bo in cs us sy id wa st 0 0 0 3029752 387728 513008 0 0 0 2 3 2 0 0 100 0 0 0 0 0 3029752 387728 513076 0 0 0 0 1005 34 0 0 100 0 0 0 0 0 3029752 387728 513076 0 0 0 22 1004 36 0 0 100 0 0 0 0 0 3029752 387728 513076 0 0 0 0 1004 33 0 0 100 0 0 0 0 0 3029752 387728 513076 0 0 0 0 1003 32 0 0 100 0 0 [root@localhost ~]# |
說明:
使用-a選項顯示活躍和非活躍記憶體時,所顯示的內容除增加inact和active外,其他顯示內容與例子1相同。
欄位說明:
1 2 3 4 5 |
Memory(記憶體): inact: 非活躍記憶體大小(當使用-a選項時顯示) active: 活躍的記憶體大小(當使用-a選項時顯示) |
例項3:檢視系統已經fork了多少次
命令:
1 |
vmstat -f |
輸出:
1 2 3 4 5 |
[root@SCF1129 ~]# vmstat -f 12744849 forks [root@SCF1129 ~]# |
說明:
這個資料是從/proc/stat中的processes欄位裡取得的
例項4:檢視記憶體使用的詳細資訊
命令:
1 |
vmstat -s |
輸出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[root@localhost ~]# vmstat -s 4043760 total memory 1013884 used memory 513012 active memory 387728 inactive memory 3029876 free memory 199616 buffer memory 690980 swap cache 6096656 total swap 0 used swap 6096656 free swap 83587 non-nice user cpu ticks 132 nice user cpu ticks 278599 system cpu ticks 913344692 idle cpu ticks 814550 IO-wait cpu ticks 10547 IRQ cpu ticks 21261 softirq cpu ticks 0 stolen cpu ticks 310215 pages paged in 14254652 pages paged out 0 pages swapped in 0 pages swapped out 288374745 interrupts 146680577 CPU context switches 1351868832 boot time 367291 forks |
說明:
這些資訊的分別來自於/proc/meminfo,/proc/stat和/proc/vmstat。
例項5:檢視磁碟的讀/寫
命令:
1 |
vmstat -d |
輸出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[root@localhost ~]# vmstat -d disk- ------------reads------------ ------------writes----------- -----IO------ total merged sectors ms total merged sectors ms cur sec ram0 0 0 0 0 0 0 0 0 0 0 ram1 0 0 0 0 0 0 0 0 0 0 ram2 0 0 0 0 0 0 0 0 0 0 ram3 0 0 0 0 0 0 0 0 0 0 ram4 0 0 0 0 0 0 0 0 0 0 ram5 0 0 0 0 0 0 0 0 0 0 ram6 0 0 0 0 0 0 0 0 0 0 ram7 0 0 0 0 0 0 0 0 0 0 ram8 0 0 0 0 0 0 0 0 0 0 ram9 0 0 0 0 0 0 0 0 0 0 ram10 0 0 0 0 0 0 0 0 0 0 ram11 0 0 0 0 0 0 0 0 0 0 ram12 0 0 0 0 0 0 0 0 0 0 ram13 0 0 0 0 0 0 0 0 0 0 ram14 0 0 0 0 0 0 0 0 0 0 ram15 0 0 0 0 0 0 0 0 0 0 sda 33381 6455 615407 63224 2068111 1495416 28508288 15990289 0 10491 hdc 0 0 0 0 0 0 0 0 0 0 fd0 0 0 0 0 0 0 0 0 0 0 md0 0 0 0 0 0 0 0 0 0 0 [root@localhost ~]# |
說明:
這些資訊主要來自於/proc/diskstats.
merged:表示一次來自於合併的寫/讀請求,一般系統會把多個連線/鄰近的讀/寫請求合併到一起來操作.
例項6:檢視/dev/sda1磁碟的讀/寫
命令:
輸出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[root@SCF1129 ~]# df 檔案系統 1K-塊 已用 可用 已用% 掛載點 /dev/sda3 1119336548 27642068 1034835500 3% /tmpfs 32978376 0 32978376 0% /dev/shm /dev/sda1 1032088 59604 920056 7% /boot [root@SCF1129 ~]# vmstat -p /dev/sda1 sda1 reads read sectors writes requested writes 18607 4249978 6 48[root@SCF1129 ~]# vmstat -p /dev/sda3 sda3 reads read sectors writes requested writes 429350 35176268 28998789 980301488[root@SCF1129 ~]# |
說明:
1 2 3 4 5 6 7 8 9 |
這些資訊主要來自於/proc/diskstats。 reads:來自於這個分割槽的讀的次數。 read sectors:來自於這個分割槽的讀扇區的次數。 writes:來自於這個分割槽的寫的次數。 requested writes:來自於這個分割槽的寫請求次數。 |
例項7:檢視系統的slab資訊
命令:
1 |
vmstat -m |
輸出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
[root@localhost ~]# vmstat -m Cache Num Total Size Pages ip_conntrack_expect 0 0 136 28 ip_conntrack 3 13 304 13 ip_fib_alias 11 59 64 59 ip_fib_hash 11 59 64 59 AF_VMCI 0 0 960 4 bio_map_info 100 105 1064 7 dm_mpath 0 0 1064 7 jbd_4k 0 0 4096 1 dm_uevent 0 0 2608 3 dm_tio 0 0 24 144 dm_io 0 0 48 77 scsi_cmd_cache 10 10 384 10 sgpool-128 32 32 4096 1 sgpool-64 32 32 2048 2 sgpool-32 32 32 1024 4 sgpool-16 32 32 512 8 sgpool-8 45 45 256 15 scsi_io_context 0 0 112 34 ext3_inode_cache 51080 51105 760 5 ext3_xattr 36 88 88 44 journal_handle 18 144 24 144 journal_head 56 80 96 40 revoke_table 4 202 16 202 revoke_record 0 0 32 112 uhci_urb_priv 0 0 56 67 UNIX 13 33 704 11 flow_cache 0 0 128 30 msi_cache 33 59 64 59 cfq_ioc_pool 14 90 128 30 cfq_pool 12 90 216 18 crq_pool 16 96 80 48 deadline_drq 0 0 80 48 as_arq 0 0 96 40 mqueue_inode_cache 1 4 896 4 isofs_inode_cache 0 0 608 6 hugetlbfs_inode_cache 1 7 576 7 Cache Num Total Size Pages ext2_inode_cache 0 0 720 5 ext2_xattr 0 0 88 44 dnotify_cache 0 0 40 92 dquot 0 0 256 15 eventpoll_pwq 3 53 72 53 eventpoll_epi 3 20 192 20 inotify_event_cache 0 0 40 92 inotify_watch_cache 1 53 72 53 kioctx 0 0 320 12 kiocb 0 0 256 15 fasync_cache 0 0 24 144 shmem_inode_cache 254 290 768 5 posix_timers_cache 0 0 128 30 uid_cache 0 0 128 30 ip_mrt_cache 0 0 128 30 tcp_bind_bucket 3 112 32 112 inet_peer_cache 0 0 128 30 secpath_cache 0 0 64 59 xfrm_dst_cache 0 0 384 10 ip_dst_cache 5 10 384 10 arp_cache 1 15 256 15 RAW 3 5 768 5 UDP 5 10 768 5 tw_sock_TCP 0 0 192 20 request_sock_TCP 0 0 128 30 TCP 4 5 1600 5 blkdev_ioc 14 118 64 59 blkdev_queue 20 30 1576 5 blkdev_requests 13 42 272 14 biovec-256 7 7 4096 1 biovec-128 7 8 2048 2 biovec-64 7 8 1024 4 biovec-16 7 15 256 15 biovec-4 7 59 64 59 biovec-1 23 202 16 202 bio 270 270 128 30 utrace_engine_cache 0 0 64 59 Cache Num Total Size Pages utrace_cache 0 0 64 59 sock_inode_cache 33 48 640 6 skbuff_fclone_cache 7 7 512 7 skbuff_head_cache 319 390 256 15 file_lock_cache 1 22 176 22 Acpi-Operand 4136 4248 64 59 Acpi-ParseExt 0 0 64 59 Acpi-Parse 0 0 40 92 Acpi-State 0 0 80 48 Acpi-Namespace 2871 2912 32 112 delayacct_cache 81 295 64 59 taskstats_cache 4 53 72 53 proc_inode_cache 1427 1440 592 6 sigqueue 0 0 160 24 radix_tree_node 13166 13188 536 7 bdev_cache 23 24 832 4 sysfs_dir_cache 5370 5412 88 44 mnt_cache 26 30 256 15 inode_cache 2009 2009 560 7 dentry_cache 60952 61020 216 18 filp 479 1305 256 15 names_cache 3 3 4096 1 avc_node 14 53 72 53 selinux_inode_security 994 1200 80 48 key_jar 2 20 192 20 idr_layer_cache 74 77 528 7 buffer_head 164045 164800 96 40 mm_struct 51 56 896 4 vm_area_struct 1142 1958 176 22 fs_cache 35 177 64 59 files_cache 36 55 768 5 signal_cache 72 162 832 9 sighand_cache 68 84 2112 3 task_struct 76 80 1888 2 anon_vma 458 864 24 144 pid 83 295 64 59 shared_policy_node 0 0 48 77 Cache Num Total Size Pages numa_policy 37 144 24 144 size-131072(DMA) 0 0 131072 1 size-131072 0 0 131072 1 size-65536(DMA) 0 0 65536 1 size-65536 1 1 65536 1 size-32768(DMA) 0 0 32768 1 size-32768 2 2 32768 1 size-16384(DMA) 0 0 16384 1 size-16384 5 5 16384 1 size-8192(DMA) 0 0 8192 1 size-8192 7 7 8192 1 size-4096(DMA) 0 0 4096 1 size-4096 110 111 4096 1 size-2048(DMA) 0 0 2048 2 size-2048 602 602 2048 2 size-1024(DMA) 0 0 1024 4 size-1024 344 352 1024 4 size-512(DMA) 0 0 512 8 size-512 433 480 512 8 size-256(DMA) 0 0 256 15 size-256 1139 1155 256 15 size-128(DMA) 0 0 128 30 size-64(DMA) 0 0 64 59 size-64 5639 5782 64 59 size-32(DMA) 0 0 32 112 size-128 801 930 128 30 size-32 3005 3024 32 112 kmem_cache 137 137 2688 1 |
這組資訊來自於/proc/slabinfo。
slab:由於核心會有許多小物件,這些物件構造銷燬十分頻繁,比如i-node,dentry,這些物件如果每次構建的時候就向記憶體要一個頁(4kb),而其實只有幾個位元組,這樣就會非常浪費,為了解決這個問題,就引入了一種新的機制來處理在同一個頁框中如何分配小儲存區,而slab可以對小物件進行分配,這樣就不用為每一個物件分配頁框,從而節省了空間,核心對一些小物件建立析構很頻繁,slab對這些小物件進行緩衝,可以重複利用,減少記憶體分配次數。
本系列文章:
每天一個 Linux 命令(1):ls命令
每天一個 Linux 命令(2):cd命令
每天一個 Linux 命令(3):pwd命令
每天一個 Linux 命令(4):mkdir命令
每天一個 Linux 命令(5):rm 命令
每天一個 Linux 命令(6):rmdir 命令
每天一個 Linux 命令(7):mv命令
每天一個 Linux 命令(8):cp 命令
每天一個 Linux 命令(9):touch 命令
每天一個 Linux 命令(10):cat 命令
每天一個 Linux 命令(11):nl 命令
每天一個 Linux 命令(12):more 命令
每天一個 Linux 命令(13):less 命令
每天一個 Linux 命令(14):head 命令
每天一個 Linux 命令(15):tail 命令
每天一個 Linux 命令(16):which命令
每天一個 Linux 命令(17):whereis 命令
每天一個 Linux 命令(18):locate 命令
每天一個 Linux 命令(19):find 命令概覽
每天一個 Linux 命令(20):find命令之exec
每天一個 Linux 命令(21):find命令之xargs
每天一個 Linux 命令(22):find 命令的引數詳解
每天一個 Linux 命令(23):Linux 目錄結構
每天一個 Linux 命令(24):Linux 檔案型別與副檔名
每天一個 Linux 命令(25):Linux 檔案屬性詳解
每天一個 Linux 命令(26):用 SecureCRT 來上傳和下載檔案
每天一個 Linux 命令(27):linux chmod 命令
每天一個 Linux 命令(28):tar 命令
每天一個 Linux 命令(29): chgrp 命令
每天一個 Linux 命令(30): chown 命令
每天一個 Linux 命令(31): /etc/group 檔案詳解
每天一個 Linux 命令(32):gzip 命令
每天一個 Linux 命令(33):df 命令
每天一個 Linux 命令(34): du 命令
每天一個 Linux 命令(35): ln 命令
每天一個 Linux 命令(36): diff 命令
每天一個 Linux 命令(37): date 命令
每天一個 Linux 命令(38): cal 命令
每天一個 Linux 命令(39): grep 命令
每天一個 Linux 命令(40): wc 命令
每天一個 Linux 命令(41): ps 命令
每天一個 Linux 命令(44): top 命令
每天一個 Linux 命令(45): free 命令