工具 |
簡(jiǎn)單介紹 |
top |
查看進(jìn)程活動(dòng)狀態(tài)以及一些系統(tǒng)狀況 |
vmstat |
查看系統(tǒng)狀態(tài)、硬件和系統(tǒng)信息等 |
iostat |
查看CPU 負(fù)載,硬盤(pán)狀況 |
sar |
綜合工具,查看系統(tǒng)狀況 |
mpstat |
查看多處理器狀況 |
netstat |
查看網(wǎng)絡(luò)狀況 |
iptraf |
實(shí)時(shí)網(wǎng)絡(luò)狀況監(jiān)測(cè) |
tcpdump |
抓取網(wǎng)絡(luò)數(shù)據(jù)包,詳細(xì)分析 |
mpstat |
查看多處理器狀況 |
tcptrace |
數(shù)據(jù)包分析工具 |
netperf |
網(wǎng)絡(luò)帶寬工具 |
dstat |
綜合工具,綜合了 vmstat, iostat, ifstat, netstat 等多個(gè)信息 |
二. CPU
CPU 的占用主要取決于什么樣的資源正在 CPU 上面運(yùn)行,比如拷貝一個(gè)文件通常占用較少 CPU,因?yàn)榇蟛糠止ぷ魇怯?nbsp;DMA(Direct Memory Access)完成,只是在完成拷貝以后給一個(gè)中斷讓 CPU 知道拷貝已經(jīng)完成;科學(xué)計(jì)算通常占用較多的 CPU,大部分計(jì)算工作都需要在 CPU 上完成,內(nèi)存、硬盤(pán)等子系統(tǒng)只做暫時(shí)的數(shù)據(jù)存儲(chǔ)工作。要想監(jiān)測(cè)和理解 CPU 的性能需要知道一些的操作系統(tǒng)的基本知識(shí),比如:中斷、進(jìn)程調(diào)度、進(jìn)程上下文切換、可運(yùn)行隊(duì)列等。 這里用個(gè)例子來(lái)簡(jiǎn)單介紹一下這些概念和他們的關(guān)系,CPU每時(shí)每刻都有工作在做(進(jìn)程、線程)并且自己有一張工作清單(可運(yùn)行隊(duì)列),由老板(進(jìn)程調(diào)度)來(lái)決定他該干什么,他需要和老板溝通以便得到老板的想法并及時(shí)調(diào)整自己的工作(上下文切換),部分工作做完以后還需要及時(shí)向老板匯報(bào)(中斷),所以打工仔(CPU)除了做自己該做的工作以外,還有大量時(shí)間和精力花在溝通和匯報(bào)上。
CPU 也是一種硬件資源,和任何其他硬件設(shè)備一樣也需要驅(qū)動(dòng)和管理程序才能使用,我們可以把內(nèi)核的進(jìn)程調(diào)度看作是 CPU 的管理程序,用來(lái)管理和分配 CPU 資源,合理安排進(jìn)程搶占 CPU,并決定哪個(gè)進(jìn)程該使用 CPU、哪個(gè)進(jìn)程該等待。操作系統(tǒng)內(nèi)核里的進(jìn)程調(diào)度主要用來(lái)調(diào)度兩類(lèi)資源:進(jìn)程(或線程)和中斷,進(jìn)程調(diào)度給不同的資源分配了不同的優(yōu)先級(jí),優(yōu)先級(jí)最高的是硬件中斷,其次是內(nèi)核(系統(tǒng))進(jìn)程,最后是用戶(hù)進(jìn)程。每個(gè) CPU 都維護(hù)著一個(gè)可運(yùn)行隊(duì)列,用來(lái)存放那些可運(yùn)行的線程。線程要么在睡眠狀態(tài)(blocked 正在等待 IO)要么在可運(yùn)行狀態(tài),如果 CPU 當(dāng)前負(fù)載太高而新的請(qǐng)求不斷,就會(huì)出現(xiàn)進(jìn)程調(diào)度暫時(shí)應(yīng)付不過(guò)來(lái)的情況,這個(gè)時(shí)候就不得不把線程暫時(shí)放到可運(yùn)行隊(duì)列里。
可以從以下幾個(gè)方面監(jiān)控CPU的信息:
(1)中斷;
(2)上下文切換;
(3)可運(yùn)行隊(duì)列;
(4)CPU 利用率。
2.1 底線
通常我們期望我們的系統(tǒng)能到達(dá)以下目標(biāo):
(1)CPU 利用率,如果 CPU 有 100% 利用率,那么應(yīng)該到達(dá)這樣一個(gè)平衡:65%-70% User Time,30%-35% System Time,0%-5% Idle Time;
(2)上下文切換,上下文切換應(yīng)該和 CPU 利用率聯(lián)系起來(lái)看,如果能保持上面的 CPU 利用率平衡,大量的上下文切換是可以接受的;
(3)可運(yùn)行隊(duì)列,每個(gè)可運(yùn)行隊(duì)列不應(yīng)該有超過(guò)1-3個(gè)線程(每處理器),比如:雙處理器系統(tǒng)的可運(yùn)行隊(duì)列里不應(yīng)該超過(guò)6個(gè)線程。
2.2 vmstat
vmstat 是個(gè)查看系統(tǒng)整體性能的小工具,小巧、即使在很 heavy 的情況下也運(yùn)行良好,并且可以用時(shí)間間隔采集得到連續(xù)的性能數(shù)據(jù)。
$ 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
2 1 140 2787980 336304 3531996 0 0 0 128 1166 5033 3 3 70 25 0
0 1 140 2788296 336304 3531996 0 0 0 0 1194 5605 3 3 69 25 0
0 1 140 2788436 336304 3531996 0 0 0 0 1249 8036 5 4 67 25 0
0 1 140 2782688 336304 3531996 0 0 0 0 1333 7792 6 6 64 25 0
3 1 140 2779292 336304 3531992 0 0 0 28 1323 7087 4 5 67 25 0
參數(shù)介紹:
(1). r,可運(yùn)行隊(duì)列的線程數(shù),這些線程都是可運(yùn)行狀態(tài),只不過(guò) CPU 暫時(shí)不可用;
(2). b,被 blocked 的進(jìn)程數(shù),正在等待 IO 請(qǐng)求;
(3). in,被處理過(guò)的中斷數(shù)
(4). cs,系統(tǒng)上正在做上下文切換的數(shù)目
(5). us,用戶(hù)占用 CPU 的百分比
(6). sys,內(nèi)核和中斷占用 CPU 的百分比
(7). wa,所有可運(yùn)行的線程被 blocked 以后都在等待 IO,這時(shí)候 CPU 空閑的百分比
(8). id,CPU 完全空閑的百分比
舉兩個(gè)現(xiàn)實(shí)中的例子來(lái)實(shí)際分析一下:
$ 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
4 0 140 2915476 341288 3951700 0 0 0 0 1057 523 19 81 0 0 0
4 0 140 2915724 341296 3951700 0 0 0 0 1048 546 19 81 0 0 0
4 0 140 2915848 341296 3951700 0 0 0 0 1044 514 18 82 0 0 0
4 0 140 2915848 341296 3951700 0 0 0 24 1044 564 20 80 0 0 0
4 0 140 2915848 341296 3951700 0 0 0 0 1060 546 18 82 0 0 0
從上面的數(shù)據(jù)可以看出幾點(diǎn):
(1). interrupts(in)非常高,context switch(cs)比較低,說(shuō)明這個(gè) CPU 一直在不停的請(qǐng)求資源;
(2). user time(us)一直保持在 80% 以上,而且上下文切換較低(cs),說(shuō)明某個(gè)進(jìn)程可能一直霸占著 CPU;
(3). run queue(r)剛好在4個(gè)。
$ 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
14 0 140 2904316 341912 3952308 0 0 0 460 1106 9593 36 64 1 0 0
17 0 140 2903492 341912 3951780 0 0 0 0 1037 9614 35 65 1 0 0
20 0 140 2902016 341912 3952000 0 0 0 0 1046 9739 35 64 1 0 0
17 0 140 2903904 341912 3951888 0 0 0 76 1044 9879 37 63 0 0 0
16 0 140 2904580 341912 3952108 0 0 0 0 1055 9808 34 65 1 0 0
從上面的數(shù)據(jù)可以看出幾點(diǎn):
(1). context switch(cs)比 interrupts(in)要高得多,說(shuō)明內(nèi)核不得不來(lái)回切換進(jìn)程;
(2). 進(jìn)一步觀察發(fā)現(xiàn) system time(sy)很高而 user time(us)很低,而且加上高頻度的上下文切換(cs),說(shuō)明正在運(yùn)行的應(yīng)用程序調(diào)用了大量的系統(tǒng)調(diào)用(system call);
(3). run queue(r)在14個(gè)線程以上,按照這個(gè)測(cè)試機(jī)器的硬件配置(四核),應(yīng)該保持在12個(gè)以?xún)?nèi)。
我上午CPU 100%時(shí)的信息:
top - 11:49:08 up 50 days, 22:25, 6 users, load average: 59.79, 59.98, 60.50
Tasks: 200 total, 61 running, 139 sleeping, 0 stopped, 0 zombie
Cpu0 : 26.5%us, 73.5%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 25.0%us, 75.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1939780k total, 1744412k used, 195368k free, 95704k buffers
Swap: 4401800k total, 662836k used, 3738964k free, 811124k cached
[root@localhost ~]# vmstat 2 10
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
58 1 662836 195988 95428 810740 0 0 4 106 4 1 23 4 72 1 0
59 1 662836 195988 95448 810732 0 0 0 128 235 221 28 72 0 0 0
59 1 662836 195988 95448 810768 0 0 0 0 216 209 28 72 0 0 0
2.3 mpstat
mpstat 和 vmstat 類(lèi)似,不同的是 mpstat 可以輸出多個(gè)處理器的數(shù)據(jù)。
注意:需要安裝sysstat 包后才有這個(gè)命令,可以使用yum安裝:
#yum install sysstat
sysstat 包含iostat、mpstat、sar、命令。
[root@localhost gmail]# export LANG=en_US
[root@localhost gmail]# mpstat -P ALL
Linux 2.6.18-8.el5xen (localhost.localdomain) 02/21/2011
10:20:16 PM CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s
10:20:16 PM all 11.49 0.00 2.58 1.04 0.01 0.13 0.01 84.74 314.61
10:20:16 PM 0 15.73 0.00 2.56 0.55 0.02 0.23 0.01 80.89 241.09
10:20:16 PM 1 7.25 0.00 2.60 1.53 0.00 0.02 0.01 88.59 73.52
[root@localhost gmail]# mpstat -P ALL 1
Linux 2.6.18-8.el5xen (localhost.localdomain) 02/21/2011
10:20:18 PM CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s
10:20:19 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 136.63
10:20:19 PM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 86.14
10:20:19 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 50.50
10:20:19 PM CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s
10:20:20 PM all 0.00 0.00 0.00 0.47 0.00 0.00 0.00 99.53 105.00
10:20:20 PM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 79.00
10:20:20 PM 1 0.00 0.00 0.00 0.90 0.00 0.00 0.00 99.10 26.00
2.4 ps
查看某個(gè)程序、進(jìn)程占用了多少 CPU 資源:
[root@localhost gmail]# while :; do ps -eo pid,ni,pri,pcpu,psr,comm | grep 'oracle'; sleep 1; done
PID NI PRI %CPU PSR COMMAND
3668 0 24 0.0 0 oracle
3670 0 21 0.0 0 oracle
3672 0 24 0.0 0 oracle
3674 0 23 0.0 0 oracle
3676 0 24 0.0 1 oracle
3678 0 23 0.0 0 oracle
3680 0 21 0.0 1 oracle
3682 0 24 0.0 1 oracle
3684 0 24 0.0 0 oracle
3686 0 21 0.0 0 oracle
三. Memory
這里的講到的 “內(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ò)程稱(chēng)為頁(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)的。
在這里只介紹和性能監(jiān)測(cè)有關(guān)的兩個(gè)內(nèi)核進(jìn)程:kswapd 和 pdflush。
(1)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ě)到交換空間。
(2)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
3.1 vmstat
# 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
部分參數(shù)說(shuō)明:
(1). swpd,已使用的 SWAP 空間大小,KB 為單位;
(2). free,可用的物理內(nèi)存大小,KB 為單位;
(3). buff,物理內(nèi)存用來(lái)緩存讀寫(xiě)操作的 buffer 大小,KB 為單位;
(4). cache,物理內(nèi)存用來(lái)緩存進(jìn)程地址空間的 cache 大小,KB 為單位;
(5). si,數(shù)據(jù)從 SWAP 讀取到 RAM(swap in)的大小,KB 為單位;
(6). so,數(shù)據(jù)從 RAM 寫(xiě)到 SWAP(swap out)的大小,KB 為單位;
(7). bi,磁盤(pán)塊從文件系統(tǒng)或 SWAP 讀取到 RAM(blocks in)的大小,block 為單位;
(8). bo,磁盤(pán)塊從 RAM 寫(xiě)到文件系統(tǒng)或 SWAP(blocks out)的大小,block 為單位;
上面是一個(gè)頻繁讀寫(xiě)交換區(qū)的例子,可以觀察到以下幾點(diǎn):
(1). 物理可用內(nèi)存 free 基本沒(méi)什么顯著變化,swapd 逐步增加,說(shuō)明最小可用的內(nèi)存始終保持在 256MB(物理內(nèi)存大小) * 10% = 2.56MB 左右,當(dāng)臟頁(yè)達(dá)到10%的時(shí)候(vm.dirty_background_ratio = 10)就開(kāi)始大量使用 swap;
(2). buff 穩(wěn)步減少說(shuō)明系統(tǒng)知道內(nèi)存不夠了,kwapd 正在從 buff 那里借用部分內(nèi)存;
(3). kswapd 持續(xù)把臟頁(yè)面寫(xiě)到 swap 交換區(qū)(so),并且從 swapd 逐漸增加看出確實(shí)如此。根據(jù)上面講的 kswapd 掃描時(shí)檢查的三件事,如果頁(yè)面被修改了,但不是被文件系統(tǒng)修改的,把頁(yè)面寫(xiě)到 swap,所以這里 swapd 持續(xù)增加。
四. IO
磁盤(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 的。
4.1 內(nèi)存頁(yè)
在第三節(jié)Memory中提到了內(nèi)存和硬盤(pán)之間的 IO 是以頁(yè)為單位來(lái)進(jìn)行的,在 Linux 系統(tǒng)上1頁(yè)的大小為 4K。可以用以下命令查看系統(tǒng)默認(rèn)的頁(yè)面大?。?/p>
$ /usr/bin/time -v date
...
Page size (bytes): 4096
...
4.2 缺頁(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
...
4.3 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ū))呢。下面是一臺(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)。
4.4 頁(yè)面類(lèi)型
Linux 中內(nèi)存頁(yè)面有三種類(lèi)型:
(1). 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)存。
(2). 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)存。
(3). Anonymous pages,匿名頁(yè),那些屬于某個(gè)進(jìn)程但是又和任何文件無(wú)關(guān)聯(lián),不能被同步到硬盤(pán)上,內(nèi)存不足的時(shí)候由 kswapd 負(fù)責(zé)將它們寫(xiě)到交換分區(qū)并釋放內(nèi)存。
4.5 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)。
4.6 順序 IO 和 隨機(jī) IO
IO 可分為順序 IO 和 隨機(jī) IO 兩種,性能監(jiān)測(cè)前需要弄清楚系統(tǒng)偏向順序 IO 的應(yīng)用還是隨機(jī) IO 應(yīng)用。
(1)順序 IO 是指同時(shí)順序請(qǐng)求大量數(shù)據(jù),比如數(shù)據(jù)庫(kù)執(zhí)行大量的查詢(xún)、流媒體服務(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
(2)隨機(jī) IO 是指隨機(jī)請(qǐng)求數(shù)據(jù),其 IO 速度不依賴(lài)于數(shù)據(jù)的大小和排列,依賴(lài)于磁盤(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)。
4.7 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
五. network
網(wǎng)絡(luò)的監(jiān)測(cè)是所有 Linux 子系統(tǒng)里面最復(fù)雜的,有太多的因素在里面,比如:延遲、阻塞、沖突、丟包等,更糟的是與 Linux 主機(jī)相連的路由器、交換機(jī)、無(wú)線信號(hào)都會(huì)影響到整體網(wǎng)絡(luò)并且很難判斷是因?yàn)?nbsp;Linux 網(wǎng)絡(luò)子系統(tǒng)的問(wèn)題還是別的設(shè)備的問(wèn)題,增加了監(jiān)測(cè)和判斷的復(fù)雜度?,F(xiàn)在我們使用的所有網(wǎng)卡都稱(chēng)為自適應(yīng)網(wǎng)卡,意思是說(shuō)能根據(jù)網(wǎng)絡(luò)上的不同網(wǎng)絡(luò)設(shè)備導(dǎo)致的不同網(wǎng)絡(luò)速度和工作模式進(jìn)行自動(dòng)調(diào)整。我們可以通過(guò) ethtool 工具來(lái)查看網(wǎng)卡的配置和工作模式:
# /sbin/ethtool eth0
Settings for eth0:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full
Advertised auto-negotiation: Yes
Speed: 100Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 1
Transceiver: internal
Auto-negotiation: on
Supports Wake-on: g
Wake-on: g
Current message level: 0x000000ff (255)
Link detected: yes
上面給出的例子說(shuō)明網(wǎng)卡有 10baseT,100baseT 和 1000baseT 三種選擇,目前正自適應(yīng)為 100baseT(Speed: 100Mb/s)??梢酝ㄟ^(guò) ethtool 工具強(qiáng)制網(wǎng)卡工作在 1000baseT 下:
# /sbin/ethtool -s eth0 speed 1000 duplex full autoneg off
5.1 iptraf
兩臺(tái)主機(jī)之間有網(wǎng)線(或無(wú)線)、路由器、交換機(jī)等設(shè)備,測(cè)試兩臺(tái)主機(jī)之間的網(wǎng)絡(luò)性能的一個(gè)辦法就是在這兩個(gè)系統(tǒng)之間互發(fā)數(shù)據(jù)并統(tǒng)計(jì)結(jié)果,看看吞吐量、延遲、速率如何。iptraf 就是一個(gè)很好的查看本機(jī)網(wǎng)絡(luò)吞吐量的好工具,支持文字圖形界面,很直觀。下面圖片顯示在 100 mbps 速率的網(wǎng)絡(luò)下這個(gè) Linux 系統(tǒng)的發(fā)送傳輸率有點(diǎn)慢,Outgoing rates 只有 66 mbps.
# iptraf -d eth0
5.2 netperf
netperf 運(yùn)行在 client/server 模式下,比 iptraf 能更多樣化的測(cè)試終端的吞吐量。先在服務(wù)器端啟動(dòng) netserver:
# netserver
Starting netserver at port 12865
Starting netserver at hostname 0.0.0.0 port 12865 and family AF_UNSPEC
然后在客戶(hù)端測(cè)試服務(wù)器,執(zhí)行一次持續(xù)10秒的 TCP 測(cè)試:
# netperf -H 172.16.38.36 -l 10
TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 172.16.38.36 (172.16.38.36) port 0 AF_INET
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
87380 16384 16384 10.32 93.68
從以上輸出可以看出,網(wǎng)絡(luò)吞吐量在 94mbps 左右,對(duì)于 100mbps 的網(wǎng)絡(luò)來(lái)說(shuō)這個(gè)性能算的上很不錯(cuò)。上面的測(cè)試是在服務(wù)器和客戶(hù)端位于同一個(gè)局域網(wǎng),并且局域網(wǎng)是有線網(wǎng)的情況,你也可以試試不同結(jié)構(gòu)、不同速率的網(wǎng)絡(luò),比如:網(wǎng)絡(luò)之間中間多幾個(gè)路由器、客戶(hù)端在 wi-fi、VPN 等情況。
netperf 還可以通過(guò)建立一個(gè) TCP 連接并順序地發(fā)送數(shù)據(jù)包來(lái)測(cè)試每秒有多少 TCP 請(qǐng)求和響應(yīng)。下面的輸出顯示在 TCP requests 使用 2K 大小,responses 使用 32K 的情況下處理速率為每秒243:
# netperf -t TCP_RR -H 172.16.38.36 -l 10 -- -r 2048,32768
TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 172.16.38.36 (172.16.38.36) port 0 AF_INET
Local /Remote
Socket Size Request Resp. Elapsed Trans.
Send Recv Size Size Time Rate
bytes Bytes bytes bytes secs. per sec
16384 87380 2048 32768 10.00 243.03
16384 87380
5.3 iperf
iperf 和 netperf 運(yùn)行方式類(lèi)似,也是 server/client 模式,先在服務(wù)器端啟動(dòng) iperf:
# iperf -s -D
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
Running Iperf Server as a daemon
The Iperf daemon process ID : 5695
然后在客戶(hù)端對(duì)服務(wù)器進(jìn)行測(cè)試,客戶(hù)端先連接到服務(wù)器端(172.16.38.36),并在30秒內(nèi)每隔5秒對(duì)服務(wù)器和客戶(hù)端之間的網(wǎng)絡(luò)進(jìn)行一次帶寬測(cè)試和采樣:
# iperf -c 172.16.38.36 -t 30 -i 5
------------------------------------------------------------
Client connecting to 172.16.38.36, TCP port 5001
TCP window size: 16.0 KByte (default)
------------------------------------------------------------
[ 3] local 172.16.39.100 port 49515 connected with 172.16.38.36 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 5.0 sec 58.8 MBytes 98.6 Mbits/sec
[ ID] Interval Transfer Bandwidth
[ 3] 5.0-10.0 sec 55.0 MBytes 92.3 Mbits/sec
[ ID] Interval Transfer Bandwidth
[ 3] 10.0-15.0 sec 55.1 MBytes 92.4 Mbits/sec
[ ID] Interval Transfer Bandwidth
[ 3] 15.0-20.0 sec 55.9 MBytes 93.8 Mbits/sec
[ ID] Interval Transfer Bandwidth
[ 3] 20.0-25.0 sec 55.4 MBytes 92.9 Mbits/sec
[ ID] Interval Transfer Bandwidth
[ 3] 25.0-30.0 sec 55.3 MBytes 92.8 Mbits/sec
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-30.0 sec 335 MBytes 93.7 Mbits/sec
5.4 tcpdump 和 tcptrace
tcmdump 和 tcptrace 提供了一種更細(xì)致的分析方法,先用 tcpdump 按要求捕獲數(shù)據(jù)包把結(jié)果輸出到某一文件,然后再用 tcptrace 分析其文件格式。這個(gè)工具組合可以提供一些難以用其他工具發(fā)現(xiàn)的信息:
# /usr/sbin/tcpdump -w network.dmp
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
511942 packets captured
511942 packets received by filter
0 packets dropped by kernel
# tcptrace network.dmp
1 arg remaining, starting with 'network.dmp'
Ostermann's tcptrace -- version 6.6.7 -- Thu Nov 4, 2004
511677 packets seen, 511487 TCP packets traced
elapsed wallclock time: 0:00:00.510291, 1002714 pkts/sec analyzed
trace file elapsed time: 0:02:35.836372
TCP connection info:
1: zaber:54581 - boulder:111 (a2b) 6> 5 (complete)
2: zaber:833 - boulder:32774 (c2d) 6> 5 (complete)
3: zaber:pcanywherestat - 172.16.39.5:53086 (e2f) 2> 3
4: zaber:716 - boulder:2049 (g2h) 347> 257
5: 172.16.39.100:58029 - zaber:12865 (i2j) 7> 5 (complete)
6: 172.16.39.100:47592 - zaber:36814 (k2l) 255380> 255378 (reset)
7: breakpoint:45510 - zaber:7012 (m2n) 9> 5 (complete)
8: zaber:35813 - boulder:111 (o2p) 6> 5 (complete)
9: zaber:837 - boulder:32774 (q2r) 6> 5 (complete)
10: breakpoint:45511 - zaber:7012 (s2t) 9> 5 (complete)
11: zaber:59362 - boulder:111 (u2v) 6> 5 (complete)
12: zaber:841 - boulder:32774 (w2x) 6> 5 (complete)
13: breakpoint:45512 - zaber:7012 (y2z) 9> 5 (complete)
tcptrace 功能很強(qiáng)大,還可以通過(guò)過(guò)濾和布爾表達(dá)式來(lái)找出有問(wèn)題的連接,比如,找出轉(zhuǎn)播大于100 segments 的連接:
# tcptrace -f'rexmit_segs>100' network.dmp
如果發(fā)現(xiàn)連接 #10 有問(wèn)題,可以查看關(guān)于這個(gè)連接的其他信息:
# tcptrace -o10 network.dmp
下面的命令使用 tcptrace 的 slice 模式,程序自動(dòng)在當(dāng)前目錄創(chuàng)建了一個(gè) slice.dat 文件,這個(gè)文件包含了每隔15秒的轉(zhuǎn)播信息:
# tcptrace -xslice network.dmp
# cat slice.dat
date segs bytes rexsegs rexbytes new active
--------------- -------- -------- -------- -------- -------- --------
16:58:50.244708 85055 4513418 0 0 6 6
16:59:05.244708 110921 5882896 0 0 0 2
16:59:20.244708 126107 6697827 0 0 1 3
16:59:35.244708 151719 8043597 0 0 0 2
16:59:50.244708 37296 1980557 0 0 0 3
17:00:05.244708 67 8828 0 0 2 3
17:00:20.244708 149 22053 0 0 1 2
17:00:35.244708 30 4080 0 0 0 1
17:00:50.244708 39 5688 0 0 0 1
17:01:05.244708 67 8828 0 0 2 3
17:01:11.081080 37 4121 0 0 1 3
標(biāo)簽:龍巖 南陽(yáng) 淘寶邀評(píng) 北海 遼陽(yáng) 延邊 眉山 大興安嶺
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux 性能監(jiān)控分析》,本文關(guān)鍵詞 Linux,性能,監(jiān)控,分析,Linux,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。