Linux 性能監測:Memory

這裏的講到的 “內存” 包括物理內存和虛擬內存,虛擬內存(Virtual Memory)把計算機的內存空間擴展到硬盤,物理內存(RAM)和硬盤的一部分空間(SWAP)組合在一起作爲虛擬內存爲計算機提供了一個連貫的虛擬內存空間,好處是我們擁有的內存 ”變多了“,可以運行更多、更大的程序,壞處是把部分硬盤當內存用整體性能受到影響,硬盤讀寫速度要比內存慢幾個數量級,並且 RAM 和 SWAP 之間的交換增加了系統的負擔。

在操作系統裏,虛擬內存被分成頁,在 x86 系統上每個頁大小是 4KB。Linux 內核讀寫虛擬內存是以 “頁” 爲單位操作的,把內存轉移到硬盤交換空間(SWAP)和從交換空間讀取到內存的時候都是按頁來讀寫的。內存和 SWAP 的這種交換過程稱爲頁面交換(Paging),值得注意的是 paging 和 swapping 是兩個完全不同的概念,國內很多參考書把這兩個概念混爲一談,swapping 也翻譯成交換,在操作系統裏是指把某程序完全交換到硬盤以騰出內存給新程序使用,和 paging 只交換程序的部分(頁面)是兩個不同的概念。純粹的 swapping 在現代操作系統中已經很難看到了,因爲把整個程序交換到硬盤的辦法既耗時又費力而且沒必要,現代操作系統基本都是 paging 或者 paging/swapping 混合,swapping 最初是在 Unix system V 上實現的。

虛擬內存管理是 Linux 內核裏面最複雜的部分,要弄懂這部分內容可能需要一整本書的講解。VPSee 在這裏只介紹和性能監測有關的兩個內核進程:kswapd 和 pdflush。

  • kswapd daemon 用來檢查 pages_high 和 pages_low,如果可用內存少於 pages_low,kswapd 就開始掃描並試圖釋放 32個頁面,並且重複掃描釋放的過程直到可用內存大於 pages_high 爲止。掃描的時候檢查3件事:1)如果頁面沒有修改,把頁放到可用內存列表裏;2)如果頁面被文件系統修改,把頁面內容寫到磁盤上;3)如果頁面被修改了,但不是被文件系統修改的,把頁面寫到交換空間。

  • pdflush daemon 用來同步文件相關的內存頁面,把內存頁面及時同步到硬盤上。比如打開一個文件,文件被導入到內存裏,對文件做了修改後並保存後,內核並不馬上保存文件到硬盤,由 pdflush 決定什麼時候把相應頁面寫入硬盤,這由一個內核參數 vm.dirty_background_ratio 來控制,比如下面的參數顯示髒頁面(dirty pages)達到所有內存頁面10%的時候開始寫入硬盤。

# /sbin/sysctl -n vm.dirty_background_ratio
10

vmstat

繼續 vmstat 一些參數的介紹,上一篇 Linux 性能監測:CPU 介紹了 vmstat 的部分參數,這裏介紹另外一部分。以下數據來自 VPSee 的一個 256MB RAM,512MB SWAP 的 Xen VPS:

# vmstat 1
procs ----------memory--------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd  free  buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  3 252696  2432   268   7148 3604 2368  3608  2372  288  288  0  0 21 78  1
 0  2 253484  2216   228   7104 5368 2976  5372  3036  930  519  0  0  0 100  0
 0  1 259252  2616   128   6148 19784 18712 19784 18712 3821 1853  0  1  3 95  1
 1  2 260008  2188   144   6824 11824 2584 12664  2584 1347 1174 14  0  0 86  0
 2  1 262140  2964   128   5852 24912 17304 24952 17304 4737 2341 86 10  0  0  4
  • swpd,已使用的 SWAP 空間大小,KB 爲單位;

  • free,可用的物理內存大小,KB 爲單位;

  • buff,物理內存用來緩存讀寫操作的 buffer 大小,KB 爲單位;

  • cache,物理內存用來緩存進程地址空間的 cache 大小,KB 爲單位;

  • si,數據從 SWAP 讀取到 RAM(swap in)的大小,KB 爲單位;

  • so,數據從 RAM 寫到 SWAP(swap out)的大小,KB 爲單位;

  • bi,磁盤塊從文件系統或 SWAP 讀取到 RAM(blocks in)的大小,block 爲單位;

  • bo,磁盤塊從 RAM 寫到文件系統或 SWAP(blocks out)的大小,block 爲單位;

上面是一個頻繁讀寫交換區的例子,可以觀察到以下幾點:

  • 物理可用內存 free 基本沒什麼顯著變化,swapd 逐步增加,說明最小可用的內存始終保持在 256MB X 10% = 2.56MB 左右,當髒頁達到10%的時候(vm.dirty_background_ratio = 10)就開始大量使用 swap;

  • buff 穩步減少說明系統知道內存不夠了,kwapd 正在從 buff 那裏借用部分內存;

  • kswapd 持續把髒頁面寫到 swap 交換區(so),並且從 swapd 逐漸增加看出確實如此。根據上面講的 kswapd 掃描時檢查的三件事,如果頁面被修改了,但不是被文件系統修改的,把頁面寫到 swap,所以這裏 swapd 持續增加。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章