日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

linux下性能监控工具

發(fā)布時間:2025/7/14 68 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux下性能监控工具 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一.??Linux?性能監(jiān)控的概述

???????系統(tǒng)由若干子系統(tǒng)構(gòu)成,通常改動一個子系統(tǒng)有可能影響到另外一個子系統(tǒng)。甚至?xí)?dǎo)致整個系統(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??應(yīng)用類型

???????不同的系統(tǒng)用途也不同。要找到性能瓶頸須要知道系統(tǒng)跑的是什么應(yīng)用、有些什么特點。比方?web server?對系統(tǒng)的要求肯定和?file server?不一樣,所以分清不同系統(tǒng)的應(yīng)用類型非常重要,通常應(yīng)用能夠分為兩種類型:

???????(1)IO?相關(guān)。IO?相關(guān)的應(yīng)用通經(jīng)常使用來處理大量數(shù)據(jù),須要大量內(nèi)存和存儲,頻繁?IO?操作讀寫數(shù)據(jù),而對?CPU?的要求則較少,大部分時候?CPU?都在等待硬盤。比方,數(shù)據(jù)庫server、文件server等。

???????(2)CPU?相關(guān)。CPU?相關(guān)的應(yīng)用須要使用大量?CPU,比方高并發(fā)的?web/mail?server、圖像/視頻處理、科學(xué)計算等都可被視作?CPU?相關(guān)的應(yīng)用。

看看實際中的樣例。第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?的空暇率,復(fù)制文件時候?id?維持在?50%?左右。CPU?大量計算的時候?id?基本為?0。

1.2??底線

???????事先建立一個底線,假設(shè)性能監(jiān)測得到的統(tǒng)計數(shù)據(jù)跨過這條線,我們就能夠說這個系統(tǒng)性能差,假設(shè)數(shù)據(jù)能保持在線內(nèi)我們就說性能好。建立這樣底線須要知道一些理論、額外的負(fù)載測試和系統(tǒng)管理員多年的經(jīng)驗。假設(shè)自己沒有多年的經(jīng)驗,有一個簡單劃底線的辦法就是:把這個底線建立在自己對系統(tǒng)的期望上。自己期望這個系統(tǒng)有個什么樣的性能,這是一個底線,假設(shè)沒有達(dá)到這個要求就是性能差。

1.3??監(jiān)測工具

工具

簡介

top

查看進(jìn)程活動狀態(tài)以及一些系統(tǒng)狀況

vmstat

查看系統(tǒng)狀態(tài)、硬件和系統(tǒng)信息等

iostat

查看CPU?負(fù)載,硬盤狀況

sar

綜合工具。查看系統(tǒng)狀況

mpstat

查看多處理器狀況

netstat

查看網(wǎng)絡(luò)狀況

iptraf

實時網(wǎng)絡(luò)狀況監(jiān)測

tcpdump

抓取網(wǎng)絡(luò)數(shù)據(jù)包,具體分析

mpstat

查看多處理器狀況

tcptrace

數(shù)據(jù)包分析工具

netperf

網(wǎng)絡(luò)帶寬工具

dstat

綜合工具,綜合了?vmstat, iostat, ifstat, netstat?等多個信息

二. CPU

???????CPU?的占用主要取決于什么樣的資源正在?CPU?上面執(zhí)行。比方拷貝一個文件通常占用較少?CPU。由于大部分工作是由?DMA(Direct Memory Access)完畢,僅僅是在完畢拷貝以后給一個中斷讓?CPU?知道拷貝已經(jīng)完畢;科學(xué)計算通常占用較多的?CPU。大部分計算工作都須要在?CPU?上完畢,內(nèi)存、硬盤等子系統(tǒng)僅僅做臨時的數(shù)據(jù)存儲工作。要想監(jiān)測和理解?CPU?的性能須要知道一些的操作系統(tǒng)的基本知識,比方:中斷、進(jìn)程調(diào)度、進(jìn)程上下文切換、可執(zhí)行隊列等。

????這里用個樣例來簡介一下這些概念和他們的關(guān)系。CPU每時每刻都有工作在做(進(jìn)程、線程)而且自己有一張工作清單(可執(zhí)行隊列)。由老板(進(jìn)程調(diào)度)來決定他該干什么,他須要和老板溝通以便得到老板的想法并及時調(diào)整自己的工作(上下文切換)。部分工作做完以后還須要及時向老板匯報(中斷),所以打工仔(CPU)除了做自己該做的工作以外。還有大量時間和精力花在溝通和匯報上。

???????CPU?也是一種硬件資源。和不論什么其它硬件設(shè)備一樣也須要驅(qū)動和管理程序才干使用。我們能夠把內(nèi)核的進(jìn)程調(diào)度看作是?CPU?的管理程序,用來管理和分配?CPU?資源,合理安排進(jìn)程搶占?CPU。并決定哪個進(jìn)程該使用?CPU、哪個進(jìn)程該等待。操作系統(tǒng)內(nèi)核里的進(jìn)程調(diào)度主要用來調(diào)度兩類資源:進(jìn)程(或線程)和中斷,進(jìn)程調(diào)度給不同的資源分配了不同的優(yōu)先級,優(yōu)先級最高的是硬件中斷,其次是內(nèi)核(系統(tǒng))進(jìn)程。最后是用戶進(jìn)程。每一個?CPU?都維護(hù)著一個可執(zhí)行隊列。用來存放那些可執(zhí)行的線程。線程要么在睡眠狀態(tài)(blocked?正在等待?IO)要么在可執(zhí)行狀態(tài),假設(shè)?CPU?當(dāng)前負(fù)載太高而新的請求不斷,就會出現(xiàn)進(jìn)程調(diào)度臨時應(yīng)付只是來的情況,這個時候就不得不把線程臨時放到可執(zhí)行隊列里。

能夠從下面幾個方面監(jiān)控CPU的信息:

(1)中斷;

(2)上下文切換。

(3)可執(zhí)行隊列。

(4)CPU?利用率。

2.1?底線

通常我們期望我們的系統(tǒng)能到達(dá)下面目標(biāo):

???????(1)CPU?利用率。假設(shè)?CPU?有?100%?利用率。那么應(yīng)該到達(dá)這樣一個平衡:65%-70%?User Time,30%-35%?System Time。0%-5%?Idle Time;

???????(2)上下文切換,上下文切換應(yīng)該和?CPU?利用率聯(lián)系起來看,假設(shè)能保持上面的?CPU?利用率平衡,大量的上下文切換是能夠接受的;

???????(3)可執(zhí)行隊列。每一個可執(zhí)行隊列不應(yīng)該有超過1-3個線程(每處理器),比方:雙處理器系統(tǒng)的可執(zhí)行隊列里不應(yīng)該超過6個線程。

2.2??vmstat

???????vmstat?是個查看系統(tǒng)總體性能的小工具,小巧、即使在非常?heavy?的情況下也執(zhí)行良好,而且能夠用時間間隔採集得到連續(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。可執(zhí)行隊列的線程數(shù)。這些線程都是可執(zhí)行狀態(tài),僅僅只是?CPU?臨時不可用;

(2).??????b,被?blocked?的進(jìn)程數(shù)。正在等待?IO?請求;

(3).??????in,被處理過的中斷數(shù)

(4).??????cs,系統(tǒng)上正在做上下文切換的數(shù)目

(5).??????us,用戶占用?CPU?的百分比

(6).??????sys,內(nèi)核和中斷占用?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ù)據(jù)能夠看出幾點:

(1).??????interrupts(in)很高。context switch(cs)比較低。說明這個?CPU?一直在不停的請求資源;

(2).??????user time(us)一直保持在?80%?以上,并且上下文切換較低(cs)。說明某個進(jìn)程可能一直霸占著?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ù)據(jù)能夠看出幾點:

(1).??????context switch(cs)比?interrupts(in)要高得多。說明內(nèi)核不得不來回切換進(jìn)程;

(2).??????進(jìn)一步觀察發(fā)現(xiàn)?system time(sy)非常高而?user time(us)非常低,并且加上高頻度的上下文切換(cs),說明正在執(zhí)行的應(yīng)用程序調(diào)用了大量的系統(tǒng)調(diào)用(system call);

(3).??????run queue(r)在14個線程以上,依照這個測試機器的硬件配置(四核),應(yīng)該保持在12個以內(nèi)。

我上午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ù)據(jù)。

注意:須要安裝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

查看某個程序、進(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)把計算機的內(nèi)存空間擴展到硬盤,物理內(nèi)存(RAM)和硬盤的一部分空間(SWAP)組合在一起作為虛擬內(nèi)存為計算機提供了一個連貫的虛擬內(nèi)存空間,優(yōu)點是我們擁有的內(nèi)存?”變多了“,能夠執(zhí)行很多其它、更大的程序,壞處是把部分硬盤當(dāng)內(nèi)存用總體性能受到影響。硬盤讀寫速度要比內(nèi)存慢幾個數(shù)量級。而且?RAM?和?SWAP之間的交換添加了系統(tǒng)的負(fù)擔(dān)。

???????在操作系統(tǒng)里,虛擬內(nèi)存被分成頁,在?x86?系統(tǒng)上每一個頁大小是?4KB。?Linux?內(nèi)核讀寫虛擬內(nèi)存是以?“頁”?為單位操作的,把內(nèi)存轉(zhuǎn)移到硬盤交換空間(SWAP)和從交換空間讀取到內(nèi)存的時候都是按頁來讀寫的。內(nèi)存和?SWAP?的這樣的交換過程稱為頁面交換(Paging),值得注意的是?paging?和?swapping?是兩個全然不同的概念,國內(nèi)非常多參考書把這兩個概念混為一談,swapping?也翻譯成交換,在操作系統(tǒng)里是指把某程序全然交換到硬盤以騰出內(nèi)存給新程序使用,和?paging?僅僅交換程序的部分(頁面)是兩個不同的概念。純粹的?swapping?在現(xiàn)代操作系統(tǒng)中已經(jīng)非常難看到了,由于把整個程序交換到硬盤的辦法既耗時又費力并且不是必需,現(xiàn)代操作系統(tǒng)基本都是?paging?或者?paging/swapping?混合,swapping?最初是在?Unix system V?上實現(xiàn)的。

在這里僅僅介紹和性能監(jiān)測有關(guān)的兩個內(nèi)核進(jìn)程:kswapd?和?pdflush。

???????(1)kswapd daemon?用來檢查?pages_high?和?pages_low,假設(shè)可用內(nèi)存少于?pages_low,kswapd?就開始掃描并試圖釋放?32個頁面。而且反復(fù)掃描釋放的過程直到可用內(nèi)存大于?pages_high?為止。

???????掃描的時候檢查3件事:

???????1)假設(shè)頁面沒有改動,把頁放到可用內(nèi)存列表里。

???????2)假設(shè)頁面被文件系統(tǒng)改動,把頁面內(nèi)容寫到磁盤上;

???????3)假設(shè)頁面被改動了。但不是被文件系統(tǒng)改動的。把頁面寫到交換空間。

???????(2)pdflush daemon?用來同步文件相關(guān)的內(nèi)存頁面。把內(nèi)存頁面及時同步到硬盤上。比方打開一個文件。文件被導(dǎo)入到內(nèi)存里。對文件做了改動后并保存后,內(nèi)核并不立即保存文件到硬盤,由?pdflush?決定什么時候把對應(yīng)頁面寫入硬盤,這由一個內(nèi)核參數(shù)?vm.dirty_background_ratio?來控制,比方以下的參數(shù)顯示臟頁面(dirty pages)達(dá)到全部內(nèi)存頁面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,可用的物理內(nèi)存大小,KB?為單位;

(3).??????buff,物理內(nèi)存用來緩存讀寫操作的?buffer?大小,KB?為單位。

(4).??????cache,物理內(nèi)存用來緩存進(jìn)程地址空間的?cache?大小,KB?為單位;

(5).??????si,數(shù)據(jù)從?SWAP?讀取到?RAM(swap in)的大小。KB?為單位。

(6).??????so。數(shù)據(jù)從?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).??????物理可用內(nèi)存?free?基本沒什么顯著變化。swapd?逐步添加,說明最小可用的內(nèi)存始終保持在?256MB(物理內(nèi)存大小) * 10%?= 2.56MB?左右,當(dāng)臟頁達(dá)到10%的時候(vm.dirty_background_ratio?=?10)就開始大量使用?swap。

(2).??????buff?穩(wěn)步降低說明系統(tǒng)知道內(nèi)存不夠了。kwapd?正在從?buff?那里借用部分內(nèi)存。

(3).??????kswapd?持續(xù)把臟頁面寫到?swap?交換區(qū)(so),而且從?swapd?逐漸添加看出確實如此。依據(jù)上面講的?kswapd?掃描時檢查的三件事,假設(shè)頁面被改動了。但不是被文件系統(tǒng)改動的。把頁面寫到?swap。所以這里?swapd?持續(xù)添加。

四. IO

???????磁盤一般是計算機最慢的子系統(tǒng),也是最easy出現(xiàn)性能瓶頸的地方,由于磁盤離?CPU?距離最遠(yuǎn)并且?CPU?訪問磁盤要涉及到機械操作。比方轉(zhuǎn)軸、尋軌等。訪問硬盤和訪問內(nèi)存之間的速度區(qū)別是以數(shù)量級來計算的,就像1天和1分鐘的區(qū)別一樣。

要監(jiān)測?IO?性能。有必要了解一下基本原理和?Linux?是怎樣處理硬盤和內(nèi)存之間的?IO?的。

4.1?內(nèi)存頁

在第三節(jié)Memory中提到了內(nèi)存和硬盤之間的?IO?是以頁為單位來進(jìn)行的。在?Linux?系統(tǒng)上1頁的大小為?4K。

能夠用下面命令查看系統(tǒng)默認(rèn)的頁面大小:

$ /usr/bin/time -v date

???????...

???????Page size (bytes): 4096

???????...

4.2?缺頁中斷

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

???????上面的內(nèi)存緩存區(qū)起到了預(yù)讀硬盤的作用,內(nèi)核先在物理內(nèi)存里尋找缺頁,沒有的話產(chǎn)生次缺頁中斷從內(nèi)存緩存里找,假設(shè)還沒有發(fā)現(xiàn)的話就從硬盤讀取。

非常顯然,把多余的內(nèi)存拿出來做成內(nèi)存緩存區(qū)提高了訪問速度。這里另一個命中率的問題,運氣好的話假設(shè)每次缺頁都能從內(nèi)存緩存區(qū)讀取的話將會極大提高性能。要提高命中率的一個簡單方法就是增大內(nèi)存緩存區(qū)面積。緩存區(qū)越大預(yù)存的頁面就越多。命中率也會越高。

???????以下的?time?命令能夠用來查看某程序第一次啟動的時候產(chǎn)生了多少主缺頁中斷和次缺頁中斷:

$ /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)讀取頁比從硬盤讀取頁要快得多,所以?Linux?內(nèi)核希望能盡可能產(chǎn)生次缺頁中斷(從文件緩存區(qū)讀),而且能盡可能避免主缺頁中斷(從硬盤讀),這樣隨著次缺頁中斷的增多,文件緩存區(qū)也逐步增大,直到系統(tǒng)僅僅有少量可用物理內(nèi)存的時候?Linux?才開始釋放一些不用的頁。我們執(zhí)行?Linux?一段時間后會發(fā)現(xiàn)盡管系統(tǒng)上執(zhí)行的程序不多,可是可用內(nèi)存總是非常少,這樣給大家造成了?Linux?對內(nèi)存管理非常低效的假象。其實?Linux?把那些臨時不用的物理內(nèi)存高效的利用起來做預(yù)存(內(nèi)存緩存區(qū))呢。以下是一臺?Sun?server上的物理內(nèi)存和文件緩存區(qū)的情況:

$ cat /proc/meminfo MemTotal:??? ??8182776 kB MemFree:?????? 3053808 kB Buffers:??????? 342704 kB Cached:??????? 3972748 kB

???????這臺server總共同擁有?8GB?物理內(nèi)存(MemTotal),3GB?左右可用內(nèi)存(MemFree),343MB?左右用來做磁盤緩存(Buffers),4GB?左右用來做文件緩存區(qū)(Cached)。可見?Linux?真的用了非常多物理內(nèi)存做?Cache。并且這個緩存區(qū)還能夠不斷增長。

4.4?頁面類型

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

(1).??????Read pages,僅僅讀頁(或代碼頁),那些通過主缺頁中斷從硬盤讀取的頁面。包含不能改動的靜態(tài)文件、可運行文件、庫文件等。當(dāng)內(nèi)核須要它們的時候把它們讀到內(nèi)存中,當(dāng)內(nèi)存不足的時候。內(nèi)核就釋放它們到空暇列表,當(dāng)程序再次須要它們的時候須要通過缺頁中斷再次讀到內(nèi)存。

(2).??????Dirty pages。臟頁,指那些在內(nèi)存中被改動過的數(shù)據(jù)頁,比方文本文件等。這些文件由?pdflush?負(fù)責(zé)同步到硬盤,內(nèi)存不足的時候由?kswapd?和?pdflush?把數(shù)據(jù)寫回硬盤并釋放內(nèi)存。

(3).??????Anonymous pages,匿名頁,那些屬于某個進(jìn)程可是又和不論什么文件無關(guān)聯(lián),不能被同步到硬盤上,內(nèi)存不足的時候由?kswapd?負(fù)責(zé)將它們寫到交換分區(qū)并釋放內(nèi)存。

4.5??IO’s Per Second(IOPS)

???????每次磁盤?IO?請求都須要一定的時間,和訪問內(nèi)存比起來這個等待時間簡直難以忍受。

在一臺?2001?年的典型?1GHz PC?上,磁盤隨機訪問一個?word?須要?8,000,000 nanosec = 8 millisec。順序訪問一個?word?須要?200 nanosec;而從內(nèi)存訪問一個?word?僅僅須要?10 nanosec.(數(shù)據(jù)來自:Teach Yourself Programming in Ten Years)這個硬盤能夠提供?125?次?IOPS(1000 ms / 8 ms)。

4.6??順序?IO?和?隨機?IO

???????IO?可分為順序?IO?和?隨機?IO?兩種。性能監(jiān)測前須要弄清楚系統(tǒng)偏向順序?IO?的應(yīng)用還是隨機?IO?應(yīng)用。

???????(1)順序?IO?是指同一時候順序請求大量數(shù)據(jù)。比方數(shù)據(jù)庫運行大量的查詢、流媒體服務(wù)等,順序?IO?能夠同一時候非常快的移動大量數(shù)據(jù)。能夠這樣來評估?IOPS?的性能,用每秒讀寫?IO?字節(jié)數(shù)除以每秒讀寫?IOPS?數(shù),rkB/s?除以?r/s。wkB/s?除以?w/s.?以下顯示的是連續(xù)2秒的?IO?情況。可見每次?IO?寫的數(shù)據(jù)是添加的(45060.00 / 99.00 = 455.15 KB per IO。54272.00 / 112.00 = 484.57 KB per IO)。

???????相對隨機?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)隨機?IO?是指隨機請求數(shù)據(jù),其?IO?速度不依賴于數(shù)據(jù)的大小和排列,依賴于磁盤的每秒能?IO?的次數(shù)。比方?Web?服務(wù)、Mail?服務(wù)等每次請求的數(shù)據(jù)都非常小,隨機?IO?每秒同一時候會有很多其它的請求數(shù)產(chǎ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)。隨機?IO?的?KB per IO?小到能夠忽略不計,可見對于隨機?IO?而言重要的是每秒能?IOPS?的次數(shù),而不是每次?IO?的吞吐能力(KB per IO)。

4.7 SWAP

???????當(dāng)系統(tǒng)沒有足夠物理內(nèi)存來應(yīng)付全部請求的時候就會用到?swap?設(shè)備,swap?設(shè)備能夠是一個文件。也能夠是一個磁盤分區(qū)。只是要小心的是。使用?swap?的代價非常大。假設(shè)系統(tǒng)沒有物理內(nèi)存可用,就會頻繁?swapping。假設(shè)?swap?設(shè)備和程序正要訪問的數(shù)據(jù)在同一個文件系統(tǒng)上,那會碰到嚴(yán)重的?IO?問題,終于導(dǎo)致整個系統(tǒng)遲緩。甚至崩潰。

swap?設(shè)備和內(nèi)存之間的?swapping?狀況是推斷?Linux?系統(tǒng)性能的重要參考,我們已經(jī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

???????網(wǎng)絡(luò)的監(jiān)測是全部?Linux?子系統(tǒng)里面最復(fù)雜的,有太多的因素在里面,比方:延遲、堵塞、沖突、丟包等,更糟的是與?Linux?主機相連的路由器、交換機、無線信號都會影響到總體網(wǎng)絡(luò)而且非常難推斷是由于?Linux?網(wǎng)絡(luò)子系統(tǒng)的問題還是別的設(shè)備的問題。添加了監(jiān)測和推斷的復(fù)雜度。

如今我們使用的全部網(wǎng)卡都稱為自適應(yīng)網(wǎng)卡,意思是說能依據(jù)網(wǎng)絡(luò)上的不同網(wǎng)絡(luò)設(shè)備導(dǎo)致的不同網(wǎng)絡(luò)速度和工作模式進(jìn)行自己主動調(diào)整。我們能夠通過?ethtool?工具來查看網(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

???????上面給出的樣例說明網(wǎng)卡有?10baseT。100baseT?和?1000baseT?三種選擇,眼下正自適應(yīng)為?100baseT(Speed: 100Mb/s)。能夠通過?ethtool?工具強制網(wǎng)卡工作在?1000baseT?下:

# /sbin/ethtool -s eth0 speed 1000 duplex full autoneg off ?

5.1??iptraf

???????兩臺主機之間有網(wǎng)線(或無線)、路由器、交換機等設(shè)備。測試兩臺主機之間的網(wǎng)絡(luò)性能的一個辦法就是在這兩個系統(tǒng)之間互發(fā)數(shù)據(jù)并統(tǒng)計結(jié)果,看看吞吐量、延遲、速率怎樣。

iptraf?就是一個非常好的查看本機網(wǎng)絡(luò)吞吐量的好工具。支持文字圖形界面,非常直觀。以下圖片顯示在?100 mbps?速率的網(wǎng)絡(luò)下這個?Linux?系統(tǒng)的發(fā)送傳輸率有點慢,Outgoing rates?僅僅有?66 mbps.

# iptraf -d eth0

5.2??netperf

???????netperf?執(zhí)行在?client/server?模式下,比?iptraf?能很多其它樣化的測試終端的吞吐量。先在服務(wù)器端啟動?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

???????從以上輸出能夠看出,網(wǎng)絡(luò)吞吐量在?94mbps?左右,對于?100mbps?的網(wǎng)絡(luò)來說這個性能算的上非常不錯。以上測試是在server和client位于同一個局域網(wǎng),而且局域網(wǎng)是有線網(wǎng)的情況,你也能夠試試不同結(jié)構(gòu)、不同速率的網(wǎng)絡(luò),比方:網(wǎng)絡(luò)之間中間多幾個路由器、client在?wi-fi、VPN?等情況。

???????netperf?還能夠通過建立一個?TCP?連接并順序地發(fā)送數(shù)據(jù)包來測試每秒有多少?TCP?請求和響應(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?執(zhí)行方式類似,也是?server/client?模式,先在服務(wù)器端啟動?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進(jìn)行測試,client先連接到server端(172.16.38.36),并在30秒內(nèi)每隔5秒對server和client之間的網(wǎng)絡(luò)進(jìn)行一次帶寬測試和採樣:

# 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?分析其文件格式。

這個工具組合能夠提供一些難以用其它工具發(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?功能非常強大,還能夠通過過濾和布爾表達(dá)式來找出有問題的連接,比方,找出轉(zhuǎn)播大于100 segments?的連接:

# tcptrace -f'rexmit_segs>100' network.dmp

假設(shè)發(fā)現(xiàn)連接?#10?有問題,能夠查看關(guān)于這個連接的其它信息:

# tcptrace -o10 network.dmp

以下的命令使用?tcptrace?的?slice?模式。程序自己主動在當(dāng)前文件夾創(chuàng)建了一個?slice.dat?文件,這個文件包括了每隔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

總結(jié)

以上是生活随笔為你收集整理的linux下性能监控工具的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。