linux下性能监控工具
一.??Linux?性能監(jiān)控的概述
???????系統(tǒng)由若干子系統(tǒng)構成,通常改動一個子系統(tǒng)有可能影響到另外一個子系統(tǒng)。甚至會導致整個系統(tǒng)不穩(wěn)定、崩潰。
所以說優(yōu)化、監(jiān)測、測試一般是連在一起的,并且是一個循環(huán)并且長期的過程,通常監(jiān)測的子系統(tǒng)有下面這些:
(1).??????CPU
(2).??????Memory
(3).??????IO
(4).??????Network
???????這些子系統(tǒng)互相依賴,了解這些子系統(tǒng)的特性,監(jiān)測這些子系統(tǒng)的性能參數(shù)以及及時發(fā)現(xiàn)可能會出現(xiàn)的瓶頸對系統(tǒng)優(yōu)化非常有幫助。
1.1??應用類型
???????不同的系統(tǒng)用途也不同。要找到性能瓶頸須要知道系統(tǒng)跑的是什么應用、有些什么特點。比方?web server?對系統(tǒng)的要求肯定和?file server?不一樣,所以分清不同系統(tǒng)的應用類型非常重要,通常應用能夠分為兩種類型:
???????(1)IO?相關。IO?相關的應用通經常使用來處理大量數(shù)據,須要大量內存和存儲,頻繁?IO?操作讀寫數(shù)據,而對?CPU?的要求則較少,大部分時候?CPU?都在等待硬盤。比方,數(shù)據庫server、文件server等。
???????(2)CPU?相關。CPU?相關的應用須要使用大量?CPU,比方高并發(fā)的?web/mail?server、圖像/視頻處理、科學計算等都可被視作?CPU?相關的應用。
看看實際中的樣例。第1個是文件server拷貝一個大文件時表現(xiàn)出來的特征:
$ 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? 4??? 140 1962724 335516 4852308? 0??? 0?? 388 65024 1442? 563? 0? 2 47 52? 0 0? 4??? 140 1961816 335516 4853868? 0??? 0?? 768 65536 1434? 522? 0? 1 50 48? 0 0? 4??? 140 1960788 335516 4855300? 0??? 0?? 768 48640 1412? 573? 0? 1 50 49? 0 0? 4??? 140 1958528 335516 4857280? 0??? 0? 1024 65536 1415 ?521? 0? 1 41 57? 0 0? 5??? 140 1957488 335516 4858884? 0??? 0?? 768 81412 1504? 609? 0? 2 50 49? 0 ?第2個是?CPU?做大量計算時表現(xiàn)出來的特征:
$ 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 3625096 334256 3266584? 0??? 0???? 0??? 16 1054? 470 100 0? 0? 0? 0 4? 0??? 140 3625220 334264 3266576? 0??? 0???? 0??? 12 1037? 448 100 0? 0? 0? 0 4? 0??? 140 3624468 334264 3266580? 0??? 0???? 0?? 148 1160? 632 100 0? 0 ?0? 0 4? 0??? 140 3624468 334264 3266580? 0??? 0???? 0???? 0 1078? 527 100 0? 0? 0? 0 4? 0??? 140 3624712 334264 3266580? 0??? 0???? 0??? 80 1053? 501 100 0? 0? 0? 0???????上面兩個樣例最明顯的區(qū)別就是?id?一欄,代表?CPU?的空暇率,復制文件時候?id?維持在?50%?左右。CPU?大量計算的時候?id?基本為?0。
1.2??底線
???????事先建立一個底線,假設性能監(jiān)測得到的統(tǒng)計數(shù)據跨過這條線,我們就能夠說這個系統(tǒng)性能差,假設數(shù)據能保持在線內我們就說性能好。建立這樣底線須要知道一些理論、額外的負載測試和系統(tǒng)管理員多年的經驗。假設自己沒有多年的經驗,有一個簡單劃底線的辦法就是:把這個底線建立在自己對系統(tǒng)的期望上。自己期望這個系統(tǒng)有個什么樣的性能,這是一個底線,假設沒有達到這個要求就是性能差。
1.3??監(jiān)測工具
| 工具 | 簡介 |
| top | 查看進程活動狀態(tài)以及一些系統(tǒng)狀況 |
| vmstat | 查看系統(tǒng)狀態(tài)、硬件和系統(tǒng)信息等 |
| iostat | 查看CPU?負載,硬盤狀況 |
| sar | 綜合工具。查看系統(tǒng)狀況 |
| mpstat | 查看多處理器狀況 |
| netstat | 查看網絡狀況 |
| iptraf | 實時網絡狀況監(jiān)測 |
| tcpdump | 抓取網絡數(shù)據包,具體分析 |
| mpstat | 查看多處理器狀況 |
| tcptrace | 數(shù)據包分析工具 |
| netperf | 網絡帶寬工具 |
| dstat | 綜合工具,綜合了?vmstat, iostat, ifstat, netstat?等多個信息 |
二. CPU
???????CPU?的占用主要取決于什么樣的資源正在?CPU?上面執(zhí)行。比方拷貝一個文件通常占用較少?CPU。由于大部分工作是由?DMA(Direct Memory Access)完畢,僅僅是在完畢拷貝以后給一個中斷讓?CPU?知道拷貝已經完畢;科學計算通常占用較多的?CPU。大部分計算工作都須要在?CPU?上完畢,內存、硬盤等子系統(tǒng)僅僅做臨時的數(shù)據存儲工作。要想監(jiān)測和理解?CPU?的性能須要知道一些的操作系統(tǒng)的基本知識,比方:中斷、進程調度、進程上下文切換、可執(zhí)行隊列等。
????這里用個樣例來簡介一下這些概念和他們的關系。CPU每時每刻都有工作在做(進程、線程)而且自己有一張工作清單(可執(zhí)行隊列)。由老板(進程調度)來決定他該干什么,他須要和老板溝通以便得到老板的想法并及時調整自己的工作(上下文切換)。部分工作做完以后還須要及時向老板匯報(中斷),所以打工仔(CPU)除了做自己該做的工作以外。還有大量時間和精力花在溝通和匯報上。
???????CPU?也是一種硬件資源。和不論什么其它硬件設備一樣也須要驅動和管理程序才干使用。我們能夠把內核的進程調度看作是?CPU?的管理程序,用來管理和分配?CPU?資源,合理安排進程搶占?CPU。并決定哪個進程該使用?CPU、哪個進程該等待。操作系統(tǒng)內核里的進程調度主要用來調度兩類資源:進程(或線程)和中斷,進程調度給不同的資源分配了不同的優(yōu)先級,優(yōu)先級最高的是硬件中斷,其次是內核(系統(tǒng))進程。最后是用戶進程。每一個?CPU?都維護著一個可執(zhí)行隊列。用來存放那些可執(zhí)行的線程。線程要么在睡眠狀態(tài)(blocked?正在等待?IO)要么在可執(zhí)行狀態(tài),假設?CPU?當前負載太高而新的請求不斷,就會出現(xiàn)進程調度臨時應付只是來的情況,這個時候就不得不把線程臨時放到可執(zhí)行隊列里。
能夠從下面幾個方面監(jiān)控CPU的信息:
(1)中斷;
(2)上下文切換。
(3)可執(zhí)行隊列。
(4)CPU?利用率。
2.1?底線
通常我們期望我們的系統(tǒng)能到達下面目標:
???????(1)CPU?利用率。假設?CPU?有?100%?利用率。那么應該到達這樣一個平衡:65%-70%?User Time,30%-35%?System Time。0%-5%?Idle Time;
???????(2)上下文切換,上下文切換應該和?CPU?利用率聯(lián)系起來看,假設能保持上面的?CPU?利用率平衡,大量的上下文切換是能夠接受的;
???????(3)可執(zhí)行隊列。每一個可執(zhí)行隊列不應該有超過1-3個線程(每處理器),比方:雙處理器系統(tǒng)的可執(zhí)行隊列里不應該超過6個線程。
2.2??vmstat
???????vmstat?是個查看系統(tǒng)總體性能的小工具,小巧、即使在非常?heavy?的情況下也執(zhí)行良好,而且能夠用時間間隔採集得到連續(xù)的性能數(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 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。可執(zhí)行隊列的線程數(shù)。這些線程都是可執(zhí)行狀態(tài),僅僅只是?CPU?臨時不可用;
(2).??????b,被?blocked?的進程數(shù)。正在等待?IO?請求;
(3).??????in,被處理過的中斷數(shù)
(4).??????cs,系統(tǒng)上正在做上下文切換的數(shù)目
(5).??????us,用戶占用?CPU?的百分比
(6).??????sys,內核和中斷占用?CPU?的百分比
(7).??????wa。全部可執(zhí)行的線程被?blocked?以后都在等待?IO,這時候?CPU?空暇的百分比
(8).??????id,CPU?全然空暇的百分比
舉兩個現(xiàn)實中的樣例來實際分析一下:
$ 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ù)據能夠看出幾點:
(1).??????interrupts(in)很高。context switch(cs)比較低。說明這個?CPU?一直在不停的請求資源;
(2).??????user time(us)一直保持在?80%?以上,并且上下文切換較低(cs)。說明某個進程可能一直霸占著?CPU;
(3).??????run queue(r)剛好在4個。
$ 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ù)據能夠看出幾點:
(1).??????context switch(cs)比?interrupts(in)要高得多。說明內核不得不來回切換進程;
(2).??????進一步觀察發(fā)現(xiàn)?system time(sy)非常高而?user time(us)非常低,并且加上高頻度的上下文切換(cs),說明正在執(zhí)行的應用程序調用了大量的系統(tǒng)調用(system call);
(3).??????run queue(r)在14個線程以上,依照這個測試機器的硬件配置(四核),應該保持在12個以內。
我上午CPU 100%時的信息:
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?類似,不同的是?mpstat?能夠輸出多個處理器的數(shù)據。
注意:須要安裝sysstat?包后才有這個命令,能夠使用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
查看某個程序、進程占用了多少?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
???????這里的講到的?“內存”?包含物理內存和虛擬內存。虛擬內存(Virtual Memory)把計算機的內存空間擴展到硬盤,物理內存(RAM)和硬盤的一部分空間(SWAP)組合在一起作為虛擬內存為計算機提供了一個連貫的虛擬內存空間,優(yōu)點是我們擁有的內存?”變多了“,能夠執(zhí)行很多其它、更大的程序,壞處是把部分硬盤當內存用總體性能受到影響。硬盤讀寫速度要比內存慢幾個數(shù)量級。而且?RAM?和?SWAP之間的交換添加了系統(tǒng)的負擔。
???????在操作系統(tǒng)里,虛擬內存被分成頁,在?x86?系統(tǒng)上每一個頁大小是?4KB。?Linux?內核讀寫虛擬內存是以?“頁”?為單位操作的,把內存轉移到硬盤交換空間(SWAP)和從交換空間讀取到內存的時候都是按頁來讀寫的。內存和?SWAP?的這樣的交換過程稱為頁面交換(Paging),值得注意的是?paging?和?swapping?是兩個全然不同的概念,國內非常多參考書把這兩個概念混為一談,swapping?也翻譯成交換,在操作系統(tǒng)里是指把某程序全然交換到硬盤以騰出內存給新程序使用,和?paging?僅僅交換程序的部分(頁面)是兩個不同的概念。純粹的?swapping?在現(xiàn)代操作系統(tǒng)中已經非常難看到了,由于把整個程序交換到硬盤的辦法既耗時又費力并且不是必需,現(xiàn)代操作系統(tǒng)基本都是?paging?或者?paging/swapping?混合,swapping?最初是在?Unix system V?上實現(xiàn)的。
在這里僅僅介紹和性能監(jiān)測有關的兩個內核進程:kswapd?和?pdflush。
???????(1)kswapd daemon?用來檢查?pages_high?和?pages_low,假設可用內存少于?pages_low,kswapd?就開始掃描并試圖釋放?32個頁面。而且反復掃描釋放的過程直到可用內存大于?pages_high?為止。
???????掃描的時候檢查3件事:
???????1)假設頁面沒有改動,把頁放到可用內存列表里。
???????2)假設頁面被文件系統(tǒng)改動,把頁面內容寫到磁盤上;
???????3)假設頁面被改動了。但不是被文件系統(tǒng)改動的。把頁面寫到交換空間。
???????(2)pdflush daemon?用來同步文件相關的內存頁面。把內存頁面及時同步到硬盤上。比方打開一個文件。文件被導入到內存里。對文件做了改動后并保存后,內核并不立即保存文件到硬盤,由?pdflush?決定什么時候把對應頁面寫入硬盤,這由一個內核參數(shù)?vm.dirty_background_ratio?來控制,比方以下的參數(shù)顯示臟頁面(dirty pages)達到全部內存頁面10%的時候開始寫入硬盤。
# /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ù)說明:(1).??????swpd,已使用的?SWAP?空間大小,KB?為單位;
(2).??????free,可用的物理內存大小,KB?為單位;
(3).??????buff,物理內存用來緩存讀寫操作的?buffer?大小,KB?為單位。
(4).??????cache,物理內存用來緩存進程地址空間的?cache?大小,KB?為單位;
(5).??????si,數(shù)據從?SWAP?讀取到?RAM(swap in)的大小。KB?為單位。
(6).??????so。數(shù)據從?RAM?寫到?SWAP(swap out)的大小,KB?為單位;
(7).??????bi,磁盤塊從文件系統(tǒng)或?SWAP?讀取到?RAM(blocks in)的大小。block?為單位;
(8).??????bo。磁盤塊從?RAM?寫到文件系統(tǒng)或?SWAP(blocks out)的大小,block?為單位;
上面是一個頻繁讀寫交換區(qū)的樣例,能夠觀察到下面幾點:
(1).??????物理可用內存?free?基本沒什么顯著變化。swapd?逐步添加,說明最小可用的內存始終保持在?256MB(物理內存大小) * 10%?= 2.56MB?左右,當臟頁達到10%的時候(vm.dirty_background_ratio?=?10)就開始大量使用?swap。
(2).??????buff?穩(wěn)步降低說明系統(tǒng)知道內存不夠了。kwapd?正在從?buff?那里借用部分內存。
(3).??????kswapd?持續(xù)把臟頁面寫到?swap?交換區(qū)(so),而且從?swapd?逐漸添加看出確實如此。依據上面講的?kswapd?掃描時檢查的三件事,假設頁面被改動了。但不是被文件系統(tǒng)改動的。把頁面寫到?swap。所以這里?swapd?持續(xù)添加。
四. IO
???????磁盤一般是計算機最慢的子系統(tǒng),也是最easy出現(xiàn)性能瓶頸的地方,由于磁盤離?CPU?距離最遠并且?CPU?訪問磁盤要涉及到機械操作。比方轉軸、尋軌等。訪問硬盤和訪問內存之間的速度區(qū)別是以數(shù)量級來計算的,就像1天和1分鐘的區(qū)別一樣。
要監(jiān)測?IO?性能。有必要了解一下基本原理和?Linux?是怎樣處理硬盤和內存之間的?IO?的。
4.1?內存頁
在第三節(jié)Memory中提到了內存和硬盤之間的?IO?是以頁為單位來進行的。在?Linux?系統(tǒng)上1頁的大小為?4K。
能夠用下面命令查看系統(tǒng)默認的頁面大小:
$ /usr/bin/time -v date
???????...
???????Page size (bytes): 4096
???????...
4.2?缺頁中斷
???????Linux?利用虛擬內存極大的擴展了程序地址空間,使得原來物理內存不能容下的程序也能夠通過內存和硬盤之間的不斷交換(把臨時不用的內存頁交換到硬盤,把須要的內存頁從硬盤讀到內存)來贏得很多其它的內存,看起來就像物理內存被擴大了一樣。其實這個過程對程序是全然透明的,程序全然不用理會自己哪一部分、什么時候被交換進內存,一切都有內核的虛擬內存管理來完畢。當程序啟動的時候,Linux?內核首先檢查?CPU?的緩存和物理內存,假設數(shù)據已經在內存里就忽略,假設數(shù)據不在內存里就引起一個缺頁中斷(Page Fault),然后從硬盤讀取缺頁。并把缺頁緩存到物理內存里。缺頁中斷可分為主缺頁中斷(Major Page Fault)和次缺頁中斷(Minor Page Fault),要從磁盤讀取數(shù)據而產生的中斷是主缺頁中斷;數(shù)據已經被讀入內存并被緩存起來,從內存緩存區(qū)中而不是直接從硬盤中讀取數(shù)據而產生的中斷是次缺頁中斷。
???????上面的內存緩存區(qū)起到了預讀硬盤的作用,內核先在物理內存里尋找缺頁,沒有的話產生次缺頁中斷從內存緩存里找,假設還沒有發(fā)現(xiàn)的話就從硬盤讀取。
非常顯然,把多余的內存拿出來做成內存緩存區(qū)提高了訪問速度。這里另一個命中率的問題,運氣好的話假設每次缺頁都能從內存緩存區(qū)讀取的話將會極大提高性能。要提高命中率的一個簡單方法就是增大內存緩存區(qū)面積。緩存區(qū)越大預存的頁面就越多。命中率也會越高。
???????以下的?time?命令能夠用來查看某程序第一次啟動的時候產生了多少主缺頁中斷和次缺頁中斷:
$ /usr/bin/time -v date ??????? ... ??????? Major (requiring I/O) page faults: 1 ??????? Minor (reclaiming a frame) page faults: 260 ??????? ... ?4.3??File Buffer Cache
???????從上面的內存緩存區(qū)(也叫文件緩存區(qū)?File Buffer Cache)讀取頁比從硬盤讀取頁要快得多,所以?Linux?內核希望能盡可能產生次缺頁中斷(從文件緩存區(qū)讀),而且能盡可能避免主缺頁中斷(從硬盤讀),這樣隨著次缺頁中斷的增多,文件緩存區(qū)也逐步增大,直到系統(tǒng)僅僅有少量可用物理內存的時候?Linux?才開始釋放一些不用的頁。我們執(zhí)行?Linux?一段時間后會發(fā)現(xiàn)盡管系統(tǒng)上執(zhí)行的程序不多,可是可用內存總是非常少,這樣給大家造成了?Linux?對內存管理非常低效的假象。其實?Linux?把那些臨時不用的物理內存高效的利用起來做預存(內存緩存區(qū))呢。以下是一臺?Sun?server上的物理內存和文件緩存區(qū)的情況:
$ cat /proc/meminfo MemTotal:??? ??8182776 kB MemFree:?????? 3053808 kB Buffers:??????? 342704 kB Cached:??????? 3972748 kB???????這臺server總共同擁有?8GB?物理內存(MemTotal),3GB?左右可用內存(MemFree),343MB?左右用來做磁盤緩存(Buffers),4GB?左右用來做文件緩存區(qū)(Cached)。可見?Linux?真的用了非常多物理內存做?Cache。并且這個緩存區(qū)還能夠不斷增長。
4.4?頁面類型
Linux?中內存頁面有三種類型:
(1).??????Read pages,僅僅讀頁(或代碼頁),那些通過主缺頁中斷從硬盤讀取的頁面。包含不能改動的靜態(tài)文件、可運行文件、庫文件等。當內核須要它們的時候把它們讀到內存中,當內存不足的時候。內核就釋放它們到空暇列表,當程序再次須要它們的時候須要通過缺頁中斷再次讀到內存。
(2).??????Dirty pages。臟頁,指那些在內存中被改動過的數(shù)據頁,比方文本文件等。這些文件由?pdflush?負責同步到硬盤,內存不足的時候由?kswapd?和?pdflush?把數(shù)據寫回硬盤并釋放內存。
(3).??????Anonymous pages,匿名頁,那些屬于某個進程可是又和不論什么文件無關聯(lián),不能被同步到硬盤上,內存不足的時候由?kswapd?負責將它們寫到交換分區(qū)并釋放內存。
4.5??IO’s Per Second(IOPS)
???????每次磁盤?IO?請求都須要一定的時間,和訪問內存比起來這個等待時間簡直難以忍受。
在一臺?2001?年的典型?1GHz PC?上,磁盤隨機訪問一個?word?須要?8,000,000 nanosec = 8 millisec。順序訪問一個?word?須要?200 nanosec;而從內存訪問一個?word?僅僅須要?10 nanosec.(數(shù)據來自:Teach Yourself Programming in Ten Years)這個硬盤能夠提供?125?次?IOPS(1000 ms / 8 ms)。
4.6??順序?IO?和?隨機?IO
???????IO?可分為順序?IO?和?隨機?IO?兩種。性能監(jiān)測前須要弄清楚系統(tǒng)偏向順序?IO?的應用還是隨機?IO?應用。
???????(1)順序?IO?是指同一時候順序請求大量數(shù)據。比方數(shù)據庫運行大量的查詢、流媒體服務等,順序?IO?能夠同一時候非常快的移動大量數(shù)據。能夠這樣來評估?IOPS?的性能,用每秒讀寫?IO?字節(jié)數(shù)除以每秒讀寫?IOPS?數(shù),rkB/s?除以?r/s。wkB/s?除以?w/s.?以下顯示的是連續(xù)2秒的?IO?情況。可見每次?IO?寫的數(shù)據是添加的(45060.00 / 99.00 = 455.15 KB per IO。54272.00 / 112.00 = 484.57 KB per IO)。
???????相對隨機?IO?而言,順序?IO?更應該重視每次?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)隨機?IO?是指隨機請求數(shù)據,其?IO?速度不依賴于數(shù)據的大小和排列,依賴于磁盤的每秒能?IO?的次數(shù)。比方?Web?服務、Mail?服務等每次請求的數(shù)據都非常小,隨機?IO?每秒同一時候會有很多其它的請求數(shù)產生,所以磁盤的每秒能?IO?多少次是關鍵。
$ 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)。隨機?IO?的?KB per IO?小到能夠忽略不計,可見對于隨機?IO?而言重要的是每秒能?IOPS?的次數(shù),而不是每次?IO?的吞吐能力(KB per IO)。
4.7 SWAP
???????當系統(tǒng)沒有足夠物理內存來應付全部請求的時候就會用到?swap?設備,swap?設備能夠是一個文件。也能夠是一個磁盤分區(qū)。只是要小心的是。使用?swap?的代價非常大。假設系統(tǒng)沒有物理內存可用,就會頻繁?swapping。假設?swap?設備和程序正要訪問的數(shù)據在同一個文件系統(tǒng)上,那會碰到嚴重的?IO?問題,終于導致整個系統(tǒng)遲緩。甚至崩潰。
swap?設備和內存之間的?swapping?狀況是推斷?Linux?系統(tǒng)性能的重要參考,我們已經有非常多工具能夠用來監(jiān)測?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
???????網絡的監(jiān)測是全部?Linux?子系統(tǒng)里面最復雜的,有太多的因素在里面,比方:延遲、堵塞、沖突、丟包等,更糟的是與?Linux?主機相連的路由器、交換機、無線信號都會影響到總體網絡而且非常難推斷是由于?Linux?網絡子系統(tǒng)的問題還是別的設備的問題。添加了監(jiān)測和推斷的復雜度。
如今我們使用的全部網卡都稱為自適應網卡,意思是說能依據網絡上的不同網絡設備導致的不同網絡速度和工作模式進行自己主動調整。我們能夠通過?ethtool?工具來查看網卡的配置和工作模式:
# /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???????上面給出的樣例說明網卡有?10baseT。100baseT?和?1000baseT?三種選擇,眼下正自適應為?100baseT(Speed: 100Mb/s)。能夠通過?ethtool?工具強制網卡工作在?1000baseT?下:
# /sbin/ethtool -s eth0 speed 1000 duplex full autoneg off ?5.1??iptraf
???????兩臺主機之間有網線(或無線)、路由器、交換機等設備。測試兩臺主機之間的網絡性能的一個辦法就是在這兩個系統(tǒng)之間互發(fā)數(shù)據并統(tǒng)計結果,看看吞吐量、延遲、速率怎樣。
iptraf?就是一個非常好的查看本機網絡吞吐量的好工具。支持文字圖形界面,非常直觀。以下圖片顯示在?100 mbps?速率的網絡下這個?Linux?系統(tǒng)的發(fā)送傳輸率有點慢,Outgoing rates?僅僅有?66 mbps.
# iptraf -d eth05.2??netperf
???????netperf?執(zhí)行在?client/server?模式下,比?iptraf?能很多其它樣化的測試終端的吞吐量。先在服務器端啟動?netserver:
# netserver Starting netserver at port 12865 Starting netserver at hostname 0.0.0.0 port 12865 and family AF_UNSPEC然后在client測試server。運行一次持續(xù)10秒的?TCP?測試:
# 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???????從以上輸出能夠看出,網絡吞吐量在?94mbps?左右,對于?100mbps?的網絡來說這個性能算的上非常不錯。以上測試是在server和client位于同一個局域網,而且局域網是有線網的情況,你也能夠試試不同結構、不同速率的網絡,比方:網絡之間中間多幾個路由器、client在?wi-fi、VPN?等情況。
???????netperf?還能夠通過建立一個?TCP?連接并順序地發(fā)送數(shù)據包來測試每秒有多少?TCP?請求和響應。以下的輸出顯示在?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?執(zhí)行方式類似,也是?server/client?模式,先在服務器端啟動?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???????然后在client對server進行測試,client先連接到server端(172.16.38.36),并在30秒內每隔5秒對server和client之間的網絡進行一次帶寬測試和採樣:
# 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?提供了一種更仔細的分析方法。先用?tcpdump?按要求捕獲數(shù)據包把結果輸出到某一文件,然后再用?tcptrace?分析其文件格式。
這個工具組合能夠提供一些難以用其它工具發(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?功能非常強大,還能夠通過過濾和布爾表達式來找出有問題的連接,比方,找出轉播大于100 segments?的連接:
# tcptrace -f'rexmit_segs>100' network.dmp假設發(fā)現(xiàn)連接?#10?有問題,能夠查看關于這個連接的其它信息:
# tcptrace -o10 network.dmp以下的命令使用?tcptrace?的?slice?模式。程序自己主動在當前文件夾創(chuàng)建了一個?slice.dat?文件,這個文件包括了每隔15秒的轉播信息:
# 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總結
以上是生活随笔為你收集整理的linux下性能监控工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]Java加密算法
- 下一篇: Android开发各类常见错误解决方案