Linux性能監(jiān)測(cè):內(nèi)存篇
這里的講到的 “內(nèi)存” 包括物理內(nèi)存和虛擬內(nèi)存,虛擬內(nèi)存(Virtual Memory)把計(jì)算機(jī)的內(nèi)存空間擴(kuò)展到硬盤(pán),物理內(nèi)存(RAM)和硬盤(pán)的一部分空間(SWAP)組合在一起作為虛擬內(nèi)存為計(jì)算機(jī)提供了一個(gè)連貫的虛擬內(nèi)存空間,好處是我們擁有的內(nèi)存 ”變多了“,可以運(yùn)行更多、更大的程序,壞處是把部分硬盤(pán)當(dāng)內(nèi)存用整體性能受到影響,硬盤(pán)讀寫(xiě)速度要比內(nèi)存慢幾個(gè)數(shù)量級(jí),并且 RAM 和 SWAP 之間的交換增加了系統(tǒng)的負(fù)擔(dān)。
在操作系統(tǒng)里,虛擬內(nèi)存被分成頁(yè),在 x86 系統(tǒng)上每個(gè)頁(yè)大小是 4KB。Linux 內(nèi)核讀寫(xiě)虛擬內(nèi)存是以 “頁(yè)” 為單位操作的,把內(nèi)存轉(zhuǎn)移到硬盤(pán)交換空間(SWAP)和從交換空間讀取到內(nèi)存的時(shí)候都是按頁(yè)來(lái)讀寫(xiě)的。內(nèi)存和 SWAP 的這種交換過(guò)程稱為頁(yè)面交換(Paging),值得注意的是 paging 和 swapping 是兩個(gè)完全不同的概念,國(guó)內(nèi)很多參考書(shū)把這兩個(gè)概念混為一談,swapping 也翻譯成交換,在操作系統(tǒng)里是指把某程序完全交換到硬盤(pán)以騰出內(nèi)存給新程序使用,和 paging 只交換程序的部分(頁(yè)面)是兩個(gè)不同的概念。純粹的 swapping 在現(xiàn)代操作系統(tǒng)中已經(jīng)很難看到了,因?yàn)榘颜麄€(gè)程序交換到硬盤(pán)的辦法既耗時(shí)又費(fèi)力而且沒(méi)必要,現(xiàn)代操作系統(tǒng)基本都是 paging 或者 paging/swapping 混合,swapping 最初是在 Unix system V 上實(shí)現(xiàn)的。
虛擬內(nèi)存管理是 Linux 內(nèi)核里面最復(fù)雜的部分,要弄懂這部分內(nèi)容可能需要一整本書(shū)的講解。VPSee 在這里只介紹和性能監(jiān)測(cè)有關(guān)的兩個(gè)內(nèi)核進(jìn)程:kswapd 和 pdflush。
- kswapd daemon 用來(lái)檢查 pages_high 和 pages_low,如果可用內(nèi)存少于 pages_low,kswapd 就開(kāi)始掃描并試圖釋放 32個(gè)頁(yè)面,并且重復(fù)掃描釋放的過(guò)程直到可用內(nèi)存大于 pages_high 為止。掃描的時(shí)候檢查3件事:1)如果頁(yè)面沒(méi)有修改,把頁(yè)放到可用內(nèi)存列表里;2)如果頁(yè)面被文件系統(tǒng)修改,把頁(yè)面內(nèi)容寫(xiě)到磁盤(pán)上;3)如果頁(yè)面被修改了,但不是被文件系統(tǒng)修改的,把頁(yè)面寫(xiě)到交換空間。
 - pdflush daemon 用來(lái)同步文件相關(guān)的內(nèi)存頁(yè)面,把內(nèi)存頁(yè)面及時(shí)同步到硬盤(pán)上。比如打開(kāi)一個(gè)文件,文件被導(dǎo)入到內(nèi)存里,對(duì)文件做了修改后并保存后,內(nèi)核并不馬上保存文件到硬盤(pán),由 pdflush 決定什么時(shí)候把相應(yīng)頁(yè)面寫(xiě)入硬盤(pán),這由一個(gè)內(nèi)核參數(shù) vm.dirty_background_ratio 來(lái)控制,比如下面的參數(shù)顯示臟頁(yè)面(dirty pages)達(dá)到所有內(nèi)存頁(yè)面10%的時(shí)候開(kāi)始寫(xiě)入硬盤(pán)。
 
# /sbin/sysctl -n vm.dirty_background_ratio 10
vmstat
繼續(xù) vmstat 一些參數(shù)的介紹,上一篇 Linux 性能監(jiān)測(cè):CPU 介紹了 vmstat 的部分參數(shù),這里介紹另外一部分。以下數(shù)據(jù)來(lái)自 VPSee 的一個(gè) 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,可用的物理內(nèi)存大小,KB 為單位;
 - buff,物理內(nèi)存用來(lái)緩存讀寫(xiě)操作的 buffer 大小,KB 為單位;
 - cache,物理內(nèi)存用來(lái)緩存進(jìn)程地址空間的 cache 大小,KB 為單位;
 - si,數(shù)據(jù)從 SWAP 讀取到 RAM(swap in)的大小,KB 為單位;
 - so,數(shù)據(jù)從 RAM 寫(xiě)到 SWAP(swap out)的大小,KB 為單位;
 - bi,磁盤(pán)塊從文件系統(tǒng)或 SWAP 讀取到 RAM(blocks in)的大小,block 為單位;
 - bo,磁盤(pán)塊從 RAM 寫(xiě)到文件系統(tǒng)或 SWAP(blocks out)的大小,block 為單位;
 
上面是一個(gè)頻繁讀寫(xiě)交換區(qū)的例子,可以觀察到以下幾點(diǎn):
- 物理可用內(nèi)存 free 基本沒(méi)什么顯著變化,swapd 逐步增加,說(shuō)明最小可用的內(nèi)存始終保持在 256MB X 10% = 2.56MB 左右,當(dāng)臟頁(yè)達(dá)到10%的時(shí)候(vm.dirty_background_ratio = 10)就開(kāi)始大量使用 swap;
 - buff 穩(wěn)步減少說(shuō)明系統(tǒng)知道內(nèi)存不夠了,kwapd 正在從 buff 那里借用部分內(nèi)存;
 - kswapd 持續(xù)把臟頁(yè)面寫(xiě)到 swap 交換區(qū)(so),并且從 swapd 逐漸增加看出確實(shí)如此。根據(jù)上面講的 kswapd 掃描時(shí)檢查的三件事,如果頁(yè)面被修改了,但不是被文件系統(tǒng)修改的,把頁(yè)面寫(xiě)到 swap,所以這里 swapd 持續(xù)增加。
 
原文:http://www.vpsee.com/2009/11/linux-system-performance-monitoring-memory/
系列導(dǎo)航:
- Linux性能監(jiān)測(cè):監(jiān)測(cè)目的與工具介紹
 - Linux性能監(jiān)測(cè):CPU篇
 - Linux性能監(jiān)測(cè):內(nèi)存篇
 - Linux性能監(jiān)測(cè):磁盤(pán)IO篇
 - Linux性能監(jiān)測(cè):網(wǎng)絡(luò)篇
 















 
 
 


 
 
 
 