2013年9月30日 星期一

每天一個Linux指令- vmstat指令(針對作業系統的虛擬記憶體、進程、CPU活動進行監控)

每天一個Linux指令- vmstat指令(針對作業系統的虛擬記憶體、進程、CPU活動進行監控)



拷貝來源:


01.http://www.cnblogs.com/peida/archive/2012/12/05/2803591.html


02.http://www.cnblogs.com/peida/archive/2012/12/25/2833108.html


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


輸出:


[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 


說明:


欄位說明:


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


輸出:


 


[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相同。


欄位說明:


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


輸出:


[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磁片的讀/寫


命令:df


輸出:


[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  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對這些小物件進行緩衝,可以重複利用,減少記憶體分配次數。


 


沒有留言:

張貼留言