1. 程式人生 > >Linux運維之系統性能---vmstat工具分析記憶體的瓶頸

Linux運維之系統性能---vmstat工具分析記憶體的瓶頸

  為了提高磁碟存取效率, Linux做了一些精心的設計, 除了對dentry進行快取(用於VFS,加速檔案路徑名到inode的轉換), 還採取了兩種主要Cache方式:Buffer Cache和Page Cache.前者針對磁碟塊的讀寫,後者針對檔案inode的讀寫.這些Cache有效縮短了I/O系統呼叫(比如read,write,getdents)的時間.

        記憶體活動基本上可以用3個數字來量化:活動虛擬記憶體總量,交換(swapping)率和調頁(paging)率.其中第一個數字表明記憶體的總需求量,後兩個數字表示那些記憶體中有多少比例正處在使用之中.目標是減少記憶體活動或增加記憶體量,直到調頁率保持在一個可以接受的水平上為止.

        活動虛擬記憶體的總量(VM)=實際記憶體大小(size of real memory)(實體記憶體)+使用的交換空間大小(amount of swap space used)

        當程式執行需要的記憶體大於實體記憶體時,UNIX系統採用了調頁機制,即系統copy一些記憶體中的頁面到磁碟上,騰出來空間供程序使用。
  大多數系統可以忍受偶爾的調頁,但是頻繁的調頁會使系統性能急劇下降。

UNIX記憶體管理:UNIX系統通過2種方法進行記憶體管理,“調頁演算法”,“交換技術”。
調頁演算法是將記憶體中最近不常使用的頁面換到磁碟上,把常使用的頁面(活動頁面)保留在記憶體中供程序使用。
交換技術是系統將整個程序,而不是部分頁面,全部換到磁碟上。正常情況下,系統會發生一些交換過程。
當記憶體嚴重不足時,系統會頻繁使用調頁和交換,這增加了磁碟I/O的負載。進一步降低了系統對作業的執行速度,即系統I/O資源問題又會影響到記憶體資源的分配

Unix的虛擬記憶體

  Unix的虛擬記憶體是一個十分複雜的子系統,它實現了程序間程式碼與資料共享機制的透明性,並能夠分配比系統現有實體記憶體更多的記憶體,某些作業系統的虛存甚至能通過提供快取功能影響到檔案系統的效能,各種風格的UNIX的虛存的實現方式區別很大,但都離不開下面的4個概念。

1:實際記憶體
  實際記憶體是指一個系統中實際存在的實體記憶體,稱為RAM。實際記憶體是儲存臨時資料最快最有效的方式,因此必須儘可能地分配給應用程式,現在的RAM的形式有多種:SIMM、DIMM、Rambus、DDR等,很多RAM都可以使用糾錯機制(ECC)。

2:交換空間
  交換空間是專門用於臨時儲存記憶體的一塊磁碟空間,通常在頁面排程和交換程序資料時使用,通常推薦交換空間的大小應該是實體記憶體的二到四倍

3:頁面排程
  頁面排程是指從磁碟向記憶體傳輸資料,以及相反的過程,這個過程之所以被稱為頁面排程,是因為Unix記憶體被平均劃分成大小相等的頁面;通常頁面大小為4KB和8KB(在Solaris中可以用pagesize命令檢視)。當可執行程式開始執行時,它的映象會一頁一頁地從磁碟中換入,與此類似,當某些記憶體在一段時間內空閒,就可以把它們換出到交換空間中,這樣就可以把空閒的RAM交給其他需要它的程式使用。

4:交換
頁面排程通常容易和交換的概念混淆,頁面排程是指把一個程序所佔記憶體的空閒部分傳輸到磁碟上,而交換是指當系統中實際的記憶體已不夠滿足新的分配需求時,把整個程序傳輸到磁碟上,交換活動通常意味著記憶體不足。

[[email protected] ~]# vmstat -n 3       (每個3秒重新整理一次)
procs-----------memory--------------------swap-- ----io---- --system---- ------cpu--------
r   b    swpd   free       buff       cache       si   so    bi    bo   in      cs        us   sy   id   wa
1  0    144   186164   105252   2386848      0    0     18   166   83     2          48   21   31   0
2  0    144   189620   105252   2386848      0    0      0   177   1039   1210     34   10   56   0
0  0    144   214324   105252   2386848      0    0      0    10   1071   670      32    5    63   0
0  0    144   202212   105252   2386848      0    0      0   189   1035   558      20   3   77   0
2  0    144   158772   105252   2386848      0    0      0   203   1065   2832      70    14    15   0

MEMORY
-swap:切換到交換記憶體上的記憶體(預設以KB為單位)
如果SWAP的值不為0,或者還比較大,比如超過100M了,但是SI,SO的值長期為0,這種情況我們可以不用擔心,不會影響系統性能。

-free:空閒的實體記憶體 - buff:作為buffer cache的記憶體,對塊裝置的讀寫進行緩衝
-cache:作為page cache的記憶體,檔案系統的cache
如果cache的值大的時候,說明cache處的檔案數多,如果頻繁訪問到的檔案都能被cache處,那麼磁碟的讀IO bi會非常小。 SWAP
-si:交換記憶體使用,由磁碟調入記憶體
-so:交換記憶體使用,由記憶體調入磁碟
記憶體夠用的時候,這2個值都是0,如果這2個值長期大於0時,系統性能會受到影響,磁碟IO和CPU資源都會被消耗。 有些人看到空閒記憶體(FREE)很少的或接近於0時,就認為記憶體不夠用了,實際上不能光看這一點,Linux是搶佔記憶體式的OS,還要結合si,so,如果free很少,但是si,so也很少(大多時候是0),那麼不用擔心,系統性能這時不會受到影響的。