1. 程式人生 > >每天一個linux命令:vmstat命令

每天一個linux命令:vmstat命令

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.命令格式:

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.命令引數:

  • -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:顯示虛擬記憶體使用情況
命令:

vmstat

輸出:

[[email protected] ~]# 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 

說明:

欄位說明:
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系統、進行系統調優時,瞭解系統性能分析工具是至關重要的。

命令:vmstat 5 5
表示在5秒時間內進行5次取樣。將得到一個數據彙總他能夠反映真正的系統情況。

例項2:顯示活躍和非活躍記憶體
命令:

vmstat -a 2 5

輸出:

[[email protected] ~]# 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
[[email protected] ~]#  

說明:

使用-a選項顯示活躍和非活躍記憶體時,所顯示的內容除增加inact和active外,其他顯示內容與例子1相同。

欄位說明:
Memory(記憶體):
inact: 非活躍記憶體大小(當使用-a選項時顯示)
active: 活躍的記憶體大小(當使用-a選項時顯示)

例項3:檢視系統已經fork了多少次
命令:

vmstat -f

輸出:

[root@SCF1129 ~]# vmstat -f
     12744849 forks
[root@SCF1129 ~]#

說明:

這個資料是從/proc/stat中的processes欄位裡取得的

例項4:檢視記憶體使用的詳細資訊
命令:

vmstat -s

輸出:

[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:檢視磁碟的讀/寫
命令:

vmstat -d

輸出:

[[email protected] ~]# 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
[[email protected] ~]# 

說明:

這些資訊主要來自於/proc/diskstats.

merged:表示一次來自於合併的寫/讀請求,一般系統會把多個連線/鄰近的讀/寫請求合併到一起來操作.

例項6:檢視/dev/sda1磁碟的讀/寫
命令:
輸出:

[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 ~]#

說明:

這些資訊主要來自於/proc/diskstats。
reads:來自於這個分割槽的讀的次數。
read sectors:來自於這個分割槽的讀扇區的次數。
writes:來自於這個分割槽的寫的次數。
requested writes:來自於這個分割槽的寫請求次數。

例項7:檢視系統的slab資訊
命令:

vmstat -m

輸出:

[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