主頁 > 知識庫 > Linux 性能監(jiān)控分析

Linux 性能監(jiān)控分析

熱門標簽:為什么地圖標注后不顯示 好操作的電話機器人 了不起的修仙模擬器地圖標注 400電話辦理 誠薦翰諾科技 電話機器人客戶對話 地圖標注機位 地圖標注路線軟件 大連遼寧電銷機器人 谷歌美發(fā)店地圖標注入駐
敲個命令都沒反應。 TOP命令顯示的是一些Oracle session占用CPU資源太多。 杯具的是在服務器上連sqlplus 都進不去了,命令都沒反應。 只好把服務器重啟了。 重啟之后再看了一下,是一個同事測試的SQL 有問題。 一條SQL 占用CPU 就30%。

       在研究這個問題的時候,也google到了一些Linux 下的監(jiān)控事項,整理如下。 

一.  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ù)據(jù),需要大量內(nèi)存和存儲,頻繁 IO 操作讀寫數(shù)據(jù),而對 CPU 的要求則較少,大部分時候 CPU 都在等待硬盤,比如,數(shù)據(jù)庫服務器、文件服務器等。

       (2)CPU 相關,CPU 相關的應用需要使用大量 CPU,比如高并發(fā)的 web/mail 服務器、圖像/視頻處理、科學計算等都可被視作 CPU 相關的應用。

看看實際中的例子,第1個是文件服務器拷貝一個大文件時表現(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

       上面兩個例子最明顯的差別就是 id 一欄,代表 CPU 的空閑率,拷貝文件時候 id 維持在 50% 左右,CPU 大量計算的時候 id 基本為 0。

1.2  底線

       事先建立一個底線,如果性能監(jiān)測得到的統(tǒng)計數(shù)據(jù)跨過這條線,我們就可以說這個系統(tǒng)性能差,如果數(shù)據(jù)能保持在線內(nèi)我們就說性能好。建立這樣底線需要知道一些理論、額外的負載測試和系統(tǒng)管理員多年的經(jīng)驗。如果自己沒有多年的經(jī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

查看網(wǎng)絡狀況

iptraf

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

tcpdump

抓取網(wǎng)絡數(shù)據(jù)包,詳細分析

mpstat

查看多處理器狀況

tcptrace

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

netperf

網(wǎng)絡帶寬工具

dstat

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

二. CPU

       CPU 的占用主要取決于什么樣的資源正在 CPU 上面運行,比如拷貝一個文件通常占用較少 CPU,因為大部分工作是由 DMA(Direct Memory Access)完成,只是在完成拷貝以后給一個中斷讓 CPU 知道拷貝已經(jīng)完成;科學計算通常占用較多的 CPU,大部分計算工作都需要在 CPU 上完成,內(nèi)存、硬盤等子系統(tǒng)只做暫時的數(shù)據(jù)存儲工作。要想監(jiān)測和理解 CPU 的性能需要知道一些的操作系統(tǒng)的基本知識,比如:中斷、進程調(diào)度、進程上下文切換、可運行隊列等。    這里用個例子來簡單介紹一下這些概念和他們的關系,CPU每時每刻都有工作在做(進程、線程)并且自己有一張工作清單(可運行隊列),由老板(進程調(diào)度)來決定他該干什么,他需要和老板溝通以便得到老板的想法并及時調(diào)整自己的工作(上下文切換),部分工作做完以后還需要及時向老板匯報(中斷),所以打工仔(CPU)除了做自己該做的工作以外,還有大量時間和精力花在溝通和匯報上。

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

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

(1)中斷;

(2)上下文切換;

(3)可運行隊列;

(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)可運行隊列,每個可運行隊列不應該有超過1-3個線程(每處理器),比如:雙處理器系統(tǒng)的可運行隊列里不應該超過6個線程。

2.2  vmstat

       vmstat 是個查看系統(tǒng)整體性能的小工具,小巧、即使在很 heavy 的情況下也運行良好,并且可以用時間間隔采集得到連續(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,可運行隊列的線程數(shù),這些線程都是可運行狀態(tài),只不過 CPU 暫時不可用;

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

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

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

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

(6).      sys,內(nèi)核和中斷占用 CPU 的百分比

(7).      wa,所有可運行的線程被 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),說明某個進程可能一直霸占著 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)核不得不來回切換進程;

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

(3).      run queue(r)在14個線程以上,按照這個測試機器的硬件配置(四核),應該保持在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

查看某個程序、進程占用了多少 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)存空間,好處是我們擁有的內(nèi)存 ”變多了“,可以運行更多、更大的程序,壞處是把部分硬盤當內(nèi)存用整體性能受到影響,硬盤讀寫速度要比內(nèi)存慢幾個數(shù)量級,并且 RAM 和 SWAP之間的交換增加了系統(tǒng)的負擔。

       在操作系統(tǒng)里,虛擬內(nèi)存被分成頁,在 x86 系統(tǒng)上每個頁大小是 4KB。 Linux 內(nèi)核讀寫虛擬內(nèi)存是以 “頁” 為單位操作的,把內(nèi)存轉移到硬盤交換空間(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)測有關的兩個內(nèi)核進程:kswapd 和 pdflush。

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

       掃描的時候檢查3件事:

       1)如果頁面沒有修改,把頁放到可用內(nèi)存列表里;

       2)如果頁面被文件系統(tǒng)修改,把頁面內(nèi)容寫到磁盤上;

       3)如果頁面被修改了,但不是被文件系統(tǒng)修改的,把頁面寫到交換空間。

       (2)pdflush daemon 用來同步文件相關的內(nèi)存頁面,把內(nèi)存頁面及時同步到硬盤上。比如打開一個文件,文件被導入到內(nèi)存里,對文件做了修改后并保存后,內(nèi)核并不馬上保存文件到硬盤,由 pdflush 決定什么時候把相應頁面寫入硬盤,這由一個內(nèi)核參數(shù) vm.dirty_background_ratio 來控制,比如下面的參數(shù)顯示臟頁面(dirty pages)達到所有內(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)存用來緩存進程地址空間的 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 左右,當臟頁達到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 掃描時檢查的三件事,如果頁面被修改了,但不是被文件系統(tǒng)修改的,把頁面寫到 swap,所以這里 swapd 持續(xù)增加。

四. IO

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

4.1 內(nèi)存頁

在第三節(jié)Memory中提到了內(nèi)存和硬盤之間的 IO 是以頁為單位來進行的,在 Linux 系統(tǒng)上1頁的大小為 4K??梢杂靡韵旅畈榭聪到y(tǒng)默認的頁面大?。?/p>

$ /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)存被擴大了一樣。事實上這個過程對程序是完全透明的,程序完全不用理會自己哪一部分、什么時候被交換進內(nèi)存,一切都有內(nèi)核的虛擬內(nèi)存管理來完成。當程序啟動的時候,Linux 內(nèi)核首先檢查 CPU 的緩存和物理內(nèi)存,如果數(shù)據(jù)已經(jīng)在內(nèi)存里就忽略,如果數(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ū)起到了預讀硬盤的作用,內(nèi)核先在物理內(nèi)存里尋找缺頁,沒有的話產(chǎn)生次缺頁中斷從內(nèi)存緩存里找,如果還沒有發(fā)現(xiàn)的話就從硬盤讀取。很顯然,把多余的內(nèi)存拿出來做成內(nèi)存緩存區(qū)提高了訪問速度,這里還有一個命中率的問題,運氣好的話如果每次缺頁都能從內(nèi)存緩存區(qū)讀取的話將會極大提高性能。要提高命中率的一個簡單方法就是增大內(nèi)存緩存區(qū)面積,緩存區(qū)越大預存的頁面就越多,命中率也會越高。

       下面的 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 才開始釋放一些不用的頁。我們運行 Linux 一段時間后會發(fā)現(xiàn)雖然系統(tǒng)上運行的程序不多,但是可用內(nèi)存總是很少,這樣給大家造成了 Linux 對內(nèi)存管理很低效的假象,事實上 Linux 把那些暫時不用的物理內(nèi)存高效的利用起來做預存(內(nèi)存緩存區(qū))呢。下面是一臺 Sun 服務器上的物理內(nèi)存和文件緩存區(qū)的情況:

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

       這臺服務器總共有 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)文件、可執(zhí)行文件、庫文件等。當內(nèi)核需要它們的時候把它們讀到內(nèi)存中,當內(nèi)存不足的時候,內(nèi)核就釋放它們到空閑列表,當程序再次需要它們的時候需要通過缺頁中斷再次讀到內(nèi)存。

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

(3).      Anonymous pages,匿名頁,那些屬于某個進程但是又和任何文件無關聯(lián),不能被同步到硬盤上,內(nèi)存不足的時候由 kswapd 負責將它們寫到交換分區(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 的應用還是隨機 IO 應用。

       (1)順序 IO 是指同時順序請求大量數(shù)據(jù),比如數(shù)據(jù)庫執(zhí)行大量的查詢、流媒體服務等,順序 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 更應該重視每次 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 服務、Mail 服務等每次請求的數(shù)據(jù)都很小,隨機 IO 每秒同時會有更多的請求數(shù)產(chǎn)生,所以磁盤的每秒能 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)沒有足夠物理內(nèi)存來應付所有請求的時候就會用到 swap 設備,swap 設備可以是一個文件,也可以是一個磁盤分區(qū)。不過要小心的是,使用 swap 的代價非常大。如果系統(tǒng)沒有物理內(nèi)存可用,就會頻繁 swapping,如果 swap 設備和程序正要訪問的數(shù)據(jù)在同一個文件系統(tǒng)上,那會碰到嚴重的 IO 問題,最終導致整個系統(tǒng)遲緩,甚至崩潰。swap 設備和內(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)絡的監(jiān)測是所有 Linux 子系統(tǒng)里面最復雜的,有太多的因素在里面,比如:延遲、阻塞、沖突、丟包等,更糟的是與 Linux 主機相連的路由器、交換機、無線信號都會影響到整體網(wǎng)絡并且很難判斷是因為 Linux 網(wǎng)絡子系統(tǒng)的問題還是別的設備的問題,增加了監(jiān)測和判斷的復雜度。現(xiàn)在我們使用的所有網(wǎng)卡都稱為自適應網(wǎng)卡,意思是說能根據(jù)網(wǎng)絡上的不同網(wǎng)絡設備導致的不同網(wǎng)絡速度和工作模式進行自動調(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 三種選擇,目前正自適應為 100baseT(Speed: 100Mb/s)??梢酝ㄟ^ ethtool 工具強制網(wǎng)卡工作在 1000baseT 下:

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

5.1  iptraf

       兩臺主機之間有網(wǎng)線(或無線)、路由器、交換機等設備,測試兩臺主機之間的網(wǎng)絡性能的一個辦法就是在這兩個系統(tǒng)之間互發(fā)數(shù)據(jù)并統(tǒng)計結果,看看吞吐量、延遲、速率如何。iptraf 就是一個很好的查看本機網(wǎng)絡吞吐量的好工具,支持文字圖形界面,很直觀。下面圖片顯示在 100 mbps 速率的網(wǎng)絡下這個 Linux 系統(tǒng)的發(fā)送傳輸率有點慢,Outgoing rates 只有 66 mbps.

# iptraf -d eth0

5.2  netperf

       netperf 運行在 client/server 模式下,比 iptraf 能更多樣化的測試終端的吞吐量。先在服務器端啟動 netserver:

# netserver
Starting netserver at port 12865
Starting netserver at hostname 0.0.0.0 port 12865 and family AF_UNSPEC

然后在客戶端測試服務器,執(zhí)行一次持續(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)絡吞吐量在 94mbps 左右,對于 100mbps 的網(wǎng)絡來說這個性能算的上很不錯。上面的測試是在服務器和客戶端位于同一個局域網(wǎng),并且局域網(wǎng)是有線網(wǎng)的情況,你也可以試試不同結構、不同速率的網(wǎng)絡,比如:網(wǎng)絡之間中間多幾個路由器、客戶端在 wi-fi、VPN 等情況。

       netperf 還可以通過建立一個 TCP 連接并順序地發(fā)送數(shù)據(jù)包來測試每秒有多少 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 運行方式類似,也是 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

       然后在客戶端對服務器進行測試,客戶端先連接到服務器端(172.16.38.36),并在30秒內(nèi)每隔5秒對服務器和客戶端之間的網(wǎng)絡進行一次帶寬測試和采樣:

# 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ù)據(jù)包把結果輸出到某一文件,然后再用 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

標簽:龍巖 南陽 淘寶邀評 北海 遼陽 延邊 眉山 大興安嶺

巨人網(wǎng)絡通訊聲明:本文標題《Linux 性能監(jiān)控分析》,本文關鍵詞  Linux,性能,監(jiān)控,分析,Linux,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Linux 性能監(jiān)控分析》相關的同類信息!
  • 本頁收集關于Linux 性能監(jiān)控分析的相關信息資訊供網(wǎng)民參考!
  • 推薦文章