Linux 性能監(jiān)測(cè)

Linux 性能監(jiān)測(cè):IO

2009年11月19日 | 標(biāo)簽:?linux,?monitoring,?performance?| 作者:vpsee

磁盤(pán)通常是計(jì)算機(jī)最慢的子系統(tǒng),也是最容易出現(xiàn)性能瓶頸的地方,因?yàn)榇疟P(pán)離 CPU 距離最遠(yuǎn)而且 CPU 訪問(wèn)磁盤(pán)要涉及到機(jī)械操作,比如轉(zhuǎn)軸、尋軌等。訪問(wèn)硬盤(pán)和訪問(wèn)內(nèi)存之間的速度差別是以數(shù)量級(jí)來(lái)計(jì)算的,就像1天和1分鐘的差別一樣。要監(jiān)測(cè) IO 性能,有必要了解一下基本原理和 Linux 是如何處理硬盤(pán)和內(nèi)存之間的 IO 的。

內(nèi)存頁(yè)

上一篇?Linux 性能監(jiān)測(cè):Memory?提到了內(nèi)存和硬盤(pán)之間的 IO 是以頁(yè)為單位來(lái)進(jìn)行的,在 Linux 系統(tǒng)上1頁(yè)的大小為 4K??梢杂靡韵旅畈榭聪到y(tǒng)默認(rèn)的頁(yè)面大小:

$ /usr/bin/time -v date

...

Page size (bytes): 4096

...

缺頁(yè)中斷

Linux 利用虛擬內(nèi)存極大的擴(kuò)展了程序地址空間,使得原來(lái)物理內(nèi)存不能容下的程序也可以通過(guò)內(nèi)存和硬盤(pán)之間的不斷交換(把暫時(shí)不用的內(nèi)存頁(yè)交換到硬盤(pán),把需要的內(nèi)存頁(yè)從硬盤(pán)讀到內(nèi)存)來(lái)贏得更多的內(nèi)存,看起來(lái)就像物理內(nèi)存被擴(kuò)大了一樣。事實(shí)上這個(gè)過(guò)程對(duì)程序是完全透明的,程序完全不用理會(huì)自己哪一部分、什么時(shí)候被交換進(jìn)內(nèi)存,一切都有內(nèi)核的虛擬內(nèi)存管理來(lái)完成。當(dāng)程序啟動(dòng)的時(shí)候,Linux 內(nèi)核首先檢查 CPU 的緩存和物理內(nèi)存,如果數(shù)據(jù)已經(jīng)在內(nèi)存里就忽略,如果數(shù)據(jù)不在內(nèi)存里就引起一個(gè)缺頁(yè)中斷(Page Fault),然后從硬盤(pán)讀取缺頁(yè),并把缺頁(yè)緩存到物理內(nèi)存里。缺頁(yè)中斷可分為主缺頁(yè)中斷(Major Page Fault)和次缺頁(yè)中斷(Minor Page Fault),要從磁盤(pán)讀取數(shù)據(jù)而產(chǎn)生的中斷是主缺頁(yè)中斷;數(shù)據(jù)已經(jīng)被讀入內(nèi)存并被緩存起來(lái),從內(nèi)存緩存區(qū)中而不是直接從硬盤(pán)中讀取數(shù)據(jù)而產(chǎn)生的中斷是次缺頁(yè)中斷。

上面的內(nèi)存緩存區(qū)起到了預(yù)讀硬盤(pán)的作用,內(nèi)核先在物理內(nèi)存里尋找缺頁(yè),沒(méi)有的話產(chǎn)生次缺頁(yè)中斷從內(nèi)存緩存里找,如果還沒(méi)有發(fā)現(xiàn)的話就從硬盤(pán)讀取。很顯然,把多余的內(nèi)存拿出來(lái)做成內(nèi)存緩存區(qū)提高了訪問(wèn)速度,這里還有一個(gè)命中率的問(wèn)題,運(yùn)氣好的話如果每次缺頁(yè)都能從內(nèi)存緩存區(qū)讀取的話將會(huì)極大提高性能。要提高命中率的一個(gè)簡(jiǎn)單方法就是增大內(nèi)存緩存區(qū)面積,緩存區(qū)越大預(yù)存的頁(yè)面就越多,命中率也會(huì)越高。下面的 time 命令可以用來(lái)查看某程序第一次啟動(dòng)的時(shí)候產(chǎn)生了多少主缺頁(yè)中斷和次缺頁(yè)中斷:

$ /usr/bin/time -v date

...

Major (requiring I/O) page faults: 1

Minor (reclaiming a frame) page faults: 260

...

File Buffer Cache

從上面的內(nèi)存緩存區(qū)(也叫文件緩存區(qū) File Buffer Cache)讀取頁(yè)比從硬盤(pán)讀取頁(yè)要快得多,所以 Linux 內(nèi)核希望能盡可能產(chǎn)生次缺頁(yè)中斷(從文件緩存區(qū)讀),并且能盡可能避免主缺頁(yè)中斷(從硬盤(pán)讀),這樣隨著次缺頁(yè)中斷的增多,文件緩存區(qū)也逐步增大,直到系統(tǒng)只有少量可用物理內(nèi)存的時(shí)候 Linux 才開(kāi)始釋放一些不用的頁(yè)。我們運(yùn)行 Linux 一段時(shí)間后會(huì)發(fā)現(xiàn)雖然系統(tǒng)上運(yùn)行的程序不多,但是可用內(nèi)存總是很少,這樣給大家造成了 Linux 對(duì)內(nèi)存管理很低效的假象,事實(shí)上 Linux 把那些暫時(shí)不用的物理內(nèi)存高效的利用起來(lái)做預(yù)存(內(nèi)存緩存區(qū))呢。下面打印的是 VPSee 的一臺(tái) Sun 服務(wù)器上的物理內(nèi)存和文件緩存區(qū)的情況:

$ cat /proc/meminfo

MemTotal:? ? ? 8182776 kB

MemFree:? ? ? 3053808 kB

Buffers:? ? ? ? 342704 kB

Cached:? ? ? ? 3972748 kB

這臺(tái)服務(wù)器總共有 8GB 物理內(nèi)存(MemTotal),3GB 左右可用內(nèi)存(MemFree),343MB 左右用來(lái)做磁盤(pán)緩存(Buffers),4GB 左右用來(lái)做文件緩存區(qū)(Cached),可見(jiàn) Linux 真的用了很多物理內(nèi)存做 Cache,而且這個(gè)緩存區(qū)還可以不斷增長(zhǎng)。

頁(yè)面類型

Linux 中內(nèi)存頁(yè)面有三種類型:

Read pages,只讀頁(yè)(或代碼頁(yè)),那些通過(guò)主缺頁(yè)中斷從硬盤(pán)讀取的頁(yè)面,包括不能修改的靜態(tài)文件、可執(zhí)行文件、庫(kù)文件等。當(dāng)內(nèi)核需要它們的時(shí)候把它們讀到內(nèi)存中,當(dāng)內(nèi)存不足的時(shí)候,內(nèi)核就釋放它們到空閑列表,當(dāng)程序再次需要它們的時(shí)候需要通過(guò)缺頁(yè)中斷再次讀到內(nèi)存。

Dirty pages,臟頁(yè),指那些在內(nèi)存中被修改過(guò)的數(shù)據(jù)頁(yè),比如文本文件等。這些文件由 pdflush 負(fù)責(zé)同步到硬盤(pán),內(nèi)存不足的時(shí)候由 kswapd 和 pdflush 把數(shù)據(jù)寫(xiě)回硬盤(pán)并釋放內(nèi)存。

Anonymous pages,匿名頁(yè),那些屬于某個(gè)進(jìn)程但是又和任何文件無(wú)關(guān)聯(lián),不能被同步到硬盤(pán)上,內(nèi)存不足的時(shí)候由 kswapd 負(fù)責(zé)將它們寫(xiě)到交換分區(qū)并釋放內(nèi)存。

IO’s Per Second(IOPS)

每次磁盤(pán) IO 請(qǐng)求都需要一定的時(shí)間,和訪問(wèn)內(nèi)存比起來(lái)這個(gè)等待時(shí)間簡(jiǎn)直難以忍受。在一臺(tái) 2001 年的典型 1GHz PC 上,磁盤(pán)隨機(jī)訪問(wèn)一個(gè) word 需要 8,000,000 nanosec = 8 millisec,順序訪問(wèn)一個(gè) word 需要 200 nanosec;而從內(nèi)存訪問(wèn)一個(gè) word 只需要 10 nanosec.(數(shù)據(jù)來(lái)自:Teach Yourself Programming in Ten Years)這個(gè)硬盤(pán)可以提供 125 次 IOPS(1000 ms / 8 ms)。

順序 IO 和 隨機(jī) IO

IO 可分為順序 IO 和 隨機(jī) IO 兩種,性能監(jiān)測(cè)前需要弄清楚系統(tǒng)偏向順序 IO 的應(yīng)用還是隨機(jī) IO 應(yīng)用。順序 IO 是指同時(shí)順序請(qǐng)求大量數(shù)據(jù),比如數(shù)據(jù)庫(kù)執(zhí)行大量的查詢、流媒體服務(wù)等,順序 IO 可以同時(shí)很快的移動(dòng)大量數(shù)據(jù)。可以這樣來(lái)評(píng)估 IOPS 的性能,用每秒讀寫(xiě) IO 字節(jié)數(shù)除以每秒讀寫(xiě) IOPS 數(shù),rkB/s 除以 r/s,wkB/s 除以 w/s. 下面顯示的是連續(xù)2秒的 IO 情況,可見(jiàn)每次 IO 寫(xiě)的數(shù)據(jù)是增加的(45060.00 / 99.00 = 455.15 KB per IO,54272.00 / 112.00 = 484.57 KB per IO)。相對(duì)隨機(jī) IO 而言,順序 IO 更應(yīng)該重視每次 IO 的吞吐能力(KB per IO):

$ iostat -kx 1

avg-cpu:? %user? %nice %system %iowait? %steal? %idle

? ? ? ? ? 0.00? ? 0.00? ? 2.50? 25.25? ? 0.00? 72.25

Device:? rrqm/s? wrqm/s? r/s? w/s? ? rkB/s? ? wkB/s avgrq-sz avgqu-sz? await? svctm? %util

sdb? ? ? 24.00 19995.00 29.00 99.00? 4228.00 45060.00? 770.12? ? 45.01? 539.65? 7.80? 99.80

avg-cpu:? %user? %nice %system %iowait? %steal? %idle

? ? ? ? ? 0.00? ? 0.00? ? 1.00? 30.67? ? 0.00? 68.33

Device:? rrqm/s? wrqm/s? r/s? w/s? ? rkB/s? ? wkB/s avgrq-sz avgqu-sz? await? svctm? %util

sdb? ? ? ? 3.00 12235.00? 3.00 112.00? 768.00 54272.00? 957.22? 144.85? 576.44? 8.70 100.10

隨機(jī) IO 是指隨機(jī)請(qǐng)求數(shù)據(jù),其 IO 速度不依賴于數(shù)據(jù)的大小和排列,依賴于磁盤(pán)的每秒能 IO 的次數(shù),比如 Web 服務(wù)、Mail 服務(wù)等每次請(qǐng)求的數(shù)據(jù)都很小,隨機(jī) IO 每秒同時(shí)會(huì)有更多的請(qǐng)求數(shù)產(chǎn)生,所以磁盤(pán)的每秒能 IO 多少次是關(guān)鍵。

$ iostat -kx 1

avg-cpu:? %user? %nice %system %iowait? %steal? %idle

? ? ? ? ? 1.75? ? 0.00? ? 0.75? ? 0.25? ? 0.00? 97.26

Device:? rrqm/s? wrqm/s? r/s? w/s? ? rkB/s? ? wkB/s avgrq-sz avgqu-sz? await? svctm? %util

sdb? ? ? ? 0.00? ? 52.00? 0.00 57.00? ? 0.00? 436.00? ? 15.30? ? 0.03? ? 0.54? 0.23? 1.30

avg-cpu:? %user? %nice %system %iowait? %steal? %idle

? ? ? ? ? 1.75? ? 0.00? ? 0.75? ? 0.25? ? 0.00? 97.24

Device:? rrqm/s? wrqm/s? r/s? w/s? ? rkB/s? ? wkB/s avgrq-sz avgqu-sz? await? svctm? %util

sdb? ? ? ? 0.00? ? 56.44? 0.00 66.34? ? 0.00? 491.09? ? 14.81? ? 0.04? ? 0.54? 0.19? 1.29

按照上面的公式得出:436.00 / 57.00 = 7.65 KB per IO,491.09 / 66.34 = 7.40 KB per IO. 與順序 IO 比較發(fā)現(xiàn),隨機(jī) IO 的 KB per IO 小到可以忽略不計(jì),可見(jiàn)對(duì)于隨機(jī) IO 而言重要的是每秒能 IOPS 的次數(shù),而不是每次 IO 的吞吐能力(KB per IO)。

SWAP

當(dāng)系統(tǒng)沒(méi)有足夠物理內(nèi)存來(lái)應(yīng)付所有請(qǐng)求的時(shí)候就會(huì)用到 swap 設(shè)備,swap 設(shè)備可以是一個(gè)文件,也可以是一個(gè)磁盤(pán)分區(qū)。不過(guò)要小心的是,使用 swap 的代價(jià)非常大。如果系統(tǒng)沒(méi)有物理內(nèi)存可用,就會(huì)頻繁 swapping,如果 swap 設(shè)備和程序正要訪問(wèn)的數(shù)據(jù)在同一個(gè)文件系統(tǒng)上,那會(huì)碰到嚴(yán)重的 IO 問(wèn)題,最終導(dǎo)致整個(gè)系統(tǒng)遲緩,甚至崩潰。swap 設(shè)備和內(nèi)存之間的 swapping 狀況是判斷 Linux 系統(tǒng)性能的重要參考,我們已經(jīng)有很多工具可以用來(lái)監(jiān)測(cè) swap 和 swapping 情況,比如:top、cat /proc/meminfo、vmstat 等:

$ cat /proc/meminfo

MemTotal:? ? ? 8182776 kB

MemFree:? ? ? 2125476 kB

Buffers:? ? ? ? 347952 kB

Cached:? ? ? ? 4892024 kB

SwapCached:? ? ? ? 112 kB

...

SwapTotal:? ? 4096564 kB

SwapFree:? ? ? 4096424 kB

...

$ 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

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



Linux 性能監(jiān)測(cè):Memory

2009年11月17日 | 標(biāo)簽:?linux,?monitoring,?performance?| 作者:vpsee

這里的講到的 “內(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ù)增加。

Linux 性能監(jiān)測(cè):介紹

Linux 性能監(jiān)測(cè):CPU

Linux 性能監(jiān)測(cè):IO

Linux 性能監(jiān)測(cè):Network

Linux 性能監(jiān)測(cè):工具

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 如何用十條命令在一分鐘內(nèi)檢查L(zhǎng)inux服務(wù)器性能 “ 如果你的Linux服務(wù)器突然負(fù)載暴增,報(bào)警短信快發(fā)爆你的手機(jī)...
    meng_philip123閱讀 689評(píng)論 0 19
  • linux的性能優(yōu)化:1、CPU,MEM2、DISK--RAID3、網(wǎng)絡(luò)相關(guān)的外設(shè),網(wǎng)卡 linux系統(tǒng)性能分析:...
    隨風(fēng)化作雨閱讀 780評(píng)論 0 0
  • 「筆誤」這本書(shū)也是偶然發(fā)現(xiàn),被它別具一格的封面和任性的書(shū)名所吸引,了解了這個(gè)大家每天要喝幾十杯咖啡才有靈感,那...
    Real_LyRic閱讀 251評(píng)論 0 0
  • 2017-09-16摘抄自W3school-jQuery - 添加元素希望幫助自己系統(tǒng)地打好基礎(chǔ),也能在做筆記的同...
    moralok閱讀 513評(píng)論 0 2
  • 在網(wǎng)上聽(tīng)了Jony J的《My city 南京》,覺(jué)得說(shuō)唱部分的詞真的好有感覺(jué),不過(guò)沒(méi)有太多南京的特指,只是訴說(shuō)出...
    燦燦_e560閱讀 493評(píng)論 1 5

友情鏈接更多精彩內(nèi)容