1. 程式人生 > >效能測試監控——CPU

效能測試監控——CPU

效能測試監控——CPU

為了全面詳細的分析系統執行狀態,發現隱藏的效能瓶頸。效能測試期間,全面監視CPU執行狀態是很有必要的。

本文側重分析效能測試期間需要監控的CPU執行狀態指標,對比相關查詢命令的優劣,並給出最終的shell指令碼。

關於各指標的詳細含義,見附件。

一、  監控指標項及其理想值

1load average,平均每個邏輯核心不能高於0.7

         load average大於1,表示系統中存在處於等待狀態的任務,任務競爭CPU容易導致效能降低,時延增大,甚至進入惡性迴圈。在一個合理的load average下加壓,監測CPU使用率的變化情況,可以幫助發現I/O、記憶體、網路中的效能瓶頸。

2CPU總佔有率。總佔有率小於70%,其中以%usr為主,%sys%iowait不能太高。

3、各邏輯核心CPU佔有率持平。

4、執行相同任務的程序CPU佔有率持平。

5、程序狀態合理,僵死程序不能太多。

二、  資料收集

資料收集的重點與核心在於:

詳實而又不冗餘,不關注無關指標,以最少的數字反應關注的指標。

有的指標項,比如各邏輯核心的CPU佔有率持平,關注的是一組資料的分佈特點,而不關心資料的具體值。同時,當前系統性能的瓶頸主要在I/O。資料收集期間記錄全部資料的具體數值,即降低影響系統性能,又加大了後期資料處理的工作量。

故,資料收集之前,對我們所需要的資料的統計特徵進行分析。

1.
      load average

每隔1min5min15min取該段時間內的load average即可。一次取1個數據。

shell命令:uptime | awk -F: '{print $NF}'|awk -F, '{print $1}'

命令解釋:

uptime獲取load average

awk -F: '{print $NF}'提取1min5min15min load average的具體數值。

awk -F, '{print $1}'提取其中1個欄位。

2.      CPU總佔有率

每隔一段時間,取當前的%usr,%sys,%iowait,%idle取值。

shell

命令:mpstat|grep all

解釋:mpstat的輸出引數,無法自定義欄位。其中部分欄位是我們暫時不關注,但後續會關注。另外,剔除這些欄位涉及較多的管道和文字分析,較為複雜。同時,降低了指令碼的可移植性。

3.      各邏輯核心CPU佔有率持平

根據各邏輯核心的CPU佔有率計算:跨度((max-min/average),mdevsqrt(平方和的平均值-平均值的平方))

命令:

mpstat -P ALL|grep -v -i ALL|grep -o -e '[0-9][0-9]*\..*\.[0-9]*[0-9]$'|awk -v col=9 -f cal.awk

其中用到了指令碼 cal.awk

解釋:

mpstat -P ALL|grep -v -i ALL|grep -o -e '[0-9][0-9]*\..*\.[0-9]*[0-9]$' 提取各CPU的指標的資料。

col=9,列數。

cal.awk指令碼計算資料值的跨度和mdev

BEGIN {

        for(i=1;i<=col;i++){

                sum[i] = 0;

                squsum[i] = 0;

                max[i] = 0;

                min[i] = 1000000;

        }

}

{

        for(j=1;j<=col;j++) {

                tmp = $j

                sum[j] += tmp

                squsum[j] += tmp*tmp

                if(max[j]<tmp)

                        max[j] = tmp

                if(min[j]>tmp)

                        min[j] = tmp

        }

}

END {

        for(k=1;k<=col;k++) {

                ave = sum[k]/NR

                mdev = sqrt(squsum[k]/NR-ave*ave)

                printf("%.2f/%.2f/%.2f/%.2f  "), ave,max[k],min[k],mdev

        }

}

4.      執行相同任務的程序CPU佔有率持平

演算法同上。

命令:

# ps aux |grep nginx|grep -v grep|awk '{print $3}'|awk -v col=1 -f cal.awk

ave/max/min/mdev = 2.59/3.00/0.00/0.92

三、  指令碼化

定時(每分鐘)輸出cpu執行狀態資訊到指定檔案(cpu_yjk.log)。

為了方便後續用python進行資料分析,輸出格式統一如下:

1、每次輸出獨佔且只佔用一行。

2、資料項之間以“,”分隔。

3、涉及統計數字的資料項,以ave/max/min/mdev格式輸出計算結果

#!/bin/bash

sleepTime=60

logfile=cpu_yjk.log

if [ -f "$logfile" ];

then

        rm cpu_yjk.log

fi

exec 1>$logfile

processName="watchCpu.sh"

title="load"

coretitle=`mpstat | grep -o -e '%.*'`

#print title

printf "%s," `date +%Y-%m-%d_%H:%M:%S`

printf "%6s," $title

printf "%12s(ave/max/min/mdev)," $coretitle

printf "%12s(ave/max/min/mdev)," $processName

printf "\n"

while true

do

        load=`uptime | awk -F: '{print $NF}'|awk -F, '{print $1}'`

        corevalue=`mpstat -P ALL|grep -v -i ALL|grep -o -e '[0-9][0-9]*\..*\.[0-9]*[0-9]$'|awk -v col=9 -f cal.awk`

        processValue=`ps aux |grep $processName|grep -v grep|awk '{print $3}'|awk -v col=1 -f cal.awk`

        #print value

        printf "%s," `date +%Y-%m-%d_%H:%M:%S`

        printf "%6.2f," $load

        printf "%30s," $corevalue

        printf "%30s," $processValue

        printf "\n"

        sleep $sleepTime

done


附錄——指標項詳細分析

一、      load average

1.      指標項含義:

Load:簡單的說是程序佇列的長度(WikiPedia:the system Load is a measure of the amount of work that a compute system is doing)。

Load Average:一段時間(1分鐘、5分鐘、15分鐘)內平均Load。

即一段時間內正在使用和等待使用CPU的統計資訊(平均任務數)。

Unix系統,佇列長度主要看:正在執行的程序數、等待的程序數。

Linux系統,在Unix之上增加不可中斷的程序數。

2.      察看命令:

uptime load average後的三個數字依此是過去1min5min15min的平均負載。

w:同時顯示已登入的使用者。開啟2shell標籤頁,顯示兩個shell端。

cat /proc/loadavg

top:佔用資源較多,不適合寫入指令碼。

tload 畫圖形

procinfo ubuntu 12.04 需要單獨安裝。Suse系統預設沒有安裝。

3.      指標項取值:

單個CPU核心上的負載為1,表示表示系統沒有剩餘資源,同時恰好沒有等待資源。

但是,任何的異常都會導致出現排隊等待序列,進入惡性迴圈。

一般認為,單核的理想附負載值為0.7,也有0.5-0.6一說。

若多個CPU,則計算每個CPU邏輯核心的平均值。

多核處理器的理想負載值:0.7*邏輯CPU個數。

邏輯CPU個數檢視命令:grep 'model name' /proc/cpuinfo | wc -l

二、  CPU佔有率

1.      指標細分

CPU使用率從以下3個方面監控:

1、具體程序的CPU佔有率及其隨時間的變化規律(縱向對比)。

不能超過特定數值或百分比。

2、各CPU獨立核心CPU佔有率分配情況(橫向對比)。

橫向分配均勻。

2.      檢視CPU核心的執行情況

主要有sarmpstatvmstattop

其中,top消耗資源較多,不適合在效能期間持續執行。

mpstat可以檢視各個CPU核心的負載情況,可以設定重新整理時間和次數。比較適合。

sar

linux198:~ # sar 1 3

Linux 2.6.16.46-0.12-smp (linux198)       07/26/12

18:03:41          CPU     %user     %nice   %system   %iowait     %idle

18:03:42          all     14.76      0.00      4.09      0.00     81.14

18:03:43          all     13.95      0.00      1.99      0.25     83.81

18:03:44          all      9.31      0.00      5.58      1.36     83.75

Average:          all     12.67      0.00      3.89      0.54     82.90

mpstat

linux39:~ # mpstat -P ALL 3 4

Linux 2.6.16.46-0.12-smp (linux39)         07/26/12

15:35:37     CPU   %user   %nice  %sys  %iowait  %irq  %soft   %steal   %idle    intr/s

15:35:40     all    2.24    0.00    1.29    0.04    0.04    1.41    0.00   94.97   7645.70

15:35:40       0    0.33    0.00    0.33    0.00    0.00    0.00    0.00   99.34      0.00

15:35:40       1    1.66    0.00    1.32    0.00    0.00    0.99    0.00   96.36   1527.81

15:35:40       2    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.34      5.96

15:35:40       3    6.62    0.00    2.32    0.00    0.00    4.30    0.00   86.75   2905.63

15:35:40       4    0.33    0.00    0.66    0.00    0.00    0.00    0.00   98.68      0.00

15:35:40       5    0.66    0.00    0.33    0.66    0.00    0.33    0.00   97.68    109.27

15:35:40       6    8.28    0.00    5.63    0.00    0.00    5.96    0.00   80.46   2807.95

15:35:40       7    0.33    0.00    0.33    0.00    0.00    0.00    0.00   98.68    289.40

vmstat

linux198:~ # vmstat 1 3

procs  -----------memory---------- - --swap--      -----io----  -system-     -----cpu------

r  b   swpd   free       buff  cache    si  so bi   bo  in    cs    us  sy id  wa st

2  0  4499660 10534364  29408 1725604  0  1  12  14   1    3     23  5 72  0  0

3  0  4499660 10549164  29408 1715324  0  0  0   48  2847  12769 29  12 59  0  0

1  0  4499660 10549500  29408 1715324  0  0  0   0   2157  12800 16  3 81  0  0

  Procs

       r: The number of processes waiting for run time.load average

  CPU

       These are percentages of total CPU time.

       us: Time spent running non-kernel code. (user time, including nice time)

       sy: Time spent running kernel code. (system time)

       id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.

       wa: Time spent waiting for IO. Prior to Linux 2.5.41, shown as zero.

       st: Time spent in involuntary wait. Prior to Linux 2.6.11, shown as zero.

top

分析%usr %sys %wio的情況,

%usr是指CPU用於執行應用程式百分比,

%sys是指CPU應用執行系統程式(通常是作業系統的系統呼叫)的百分比,

%wio是指CPU在等待IO的百分比。

通常情況下,%sys%wio都不應該太高,否則就說明應用程式設計不合理,需要分析原因。

完成同樣功能的應用程式,其CPU佔用率應該大致相等,否則說明系統負荷分配不均勻。

對於多CPU的系統,各CPU的佔用率也應該大致相等,否則說明系統對CPU資源的使用不均衡,需要優化配置。

總的CPU平均佔用率不應該太高,如超過90%,否則說明可能系統性能已經受限於CPU資源。

3.      檢視程序的CPU執行情況

ps aux

USER  PID %CPU %MEM  VSZ   RSS TTY  STAT  START   TIME COMMAND

root     1  0.0  0.0       780    76  ?      S    Jul13   0:09 init [3]      

root     2  0.0  0.0       0      0   ?      S    Jul13   0:00 [migration/0]

root     3  0.0  0.0       0      0   ?      SN   Jul13   0:00 [ksoftirqd/0]

root     4  0.0  0.0       0      0   ?      S    Jul13   0:00 [migration/1]

root     5  0.0  0.0       0      0   ?      SN   Jul13   0:00 [ksoftirqd/1]

root     6  0.0  0.0       0      0   ?      S    Jul13   0:00 [migration/2]

root     7  0.0  0.0       0      0   ?      SN   Jul13   0:00 [ksoftirqd/2]

linux上程序有5種狀態:
1.
執行(正在執行或在執行佇列中等待
)
2.
中斷(休眠中, 受阻, 在等待某個條件的形成或接受到訊號
)
3.
不可中斷(收到訊號不喚醒和不可執行, 程序必須等待直到有中斷髮生
)
4.
僵死(程序已終止, 但程序描述符存在, 直到父程序呼叫wait4()系統呼叫後釋放
)
5.
停止(程序收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU訊號後停止執行執行
)

ps工具標識程序的5種狀態碼:
D
不可中斷
uninterruptible sleep (usually IO)
R
執行
runnable (on run queue)
S
中斷
sleeping
T
停止
traced or stopped
Z
僵死 a defunct ("zombie") process

: 其它狀態還包括W(無駐留頁), <(高優先順序程序), N(低優先順序程序), L(記憶體鎖頁).

4.      效能測試關注指標及檢視命令

效能測試期間,不能有大量僵死程序。

完成同樣功能的程序,CPU佔有率相近。

關鍵程序執行狀態正常,CPU佔有率正常。是否需要特定程序的實時CPU佔有率?個人認為不需要,因為,端到端場景中,往往需要多個程序之間協作,關心特定程序的佔有率意義不大,關心全部程序佔有率工作量太大且無明顯意義。只要保證程序狀態正常,CPU整體佔有率合適且各核心佔有率均衡即可。

所以,命令上選擇:mpstatps aux

三、  CPU資訊檢視

/proc/cpuinfo檢視cpu的引數資訊,效能測試時主要關心邏輯核心總數。

processor 條目包括這一邏輯處理器的唯一識別符號

physical id相同的是同一個物理CPU

core id相同的是同一個核的超執行緒。

siblings 條目列出了位於相同物理封裝中的邏輯處理器的數量。

1.      邏輯CPU總個數:

# cat /proc/cpuinfo | grep “processor” | wc -l

2.      物理CPU個數:

# cat /proc/cpuinfo | grep “physical id” | sort | uniq | wc -l

3.      每個物理CPUCore的個數:

# cat /proc/cpuinfo | grep “cpu cores” | wc -l

4.      是否為超執行緒

如果有兩個邏輯CPU具有相同的”core id”,那麼超執行緒是開啟的。

5.      每個物理CPU中邏輯CPU個數:

# cat /proc/cpuinfo | grep “siblings”

邏輯CPU個數:cat /proc/cpuinfo | grep "processor" | wc -l

物理CPU個數:cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l

“siblings”指的是一個物理CPU有幾個邏輯CPU

”cpu cores“指的是一個物理CPU有幾個核

不應該按照flags裡是否有 ht 標誌來判斷系統是否有超執行緒能力,而應該:

如果“siblings”“cpu cores”一致,則說明不支援超執行緒,或者超執行緒未開啟。

如果“siblings”“cpu cores”的兩倍,則說明支援超執行緒,並且超執行緒已開啟。

6.      檢視cpu型號

# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

2  Intel(R) Core(TM)2 Duo CPU     P8600  @ 2.40GHz

(看到有2個邏輯CPU, 也知道了CPU型號)

7.      檢視cpu執行模式

# getconf LONG_BIT

32

(說明當前CPU執行在32bit模式下, 但不代表CPU不支援64bit)

8.      檢視cpu是否支援64bit

# cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l

2

(結果大於0, 說明支援64bit計算. lm指long mode, 支援lm則是64bit)

9.      檢視cpu資訊概要

#lscpu

Architecture:           i686               #架構686
CPU(s):                  2                   #邏輯cpu顆數是2

Thread(s) per core:  1                #每個核心執行緒數是1

Core(s) per socket:  2                   #每個cpu插槽核數/每顆物理cpu核數是2

CPU socket(s):        1                    #cpu插槽數是1

Vendor ID:             GenuineIntel    #cpu廠商ID是GenuineIntel

CPU family:            6                     #cpu系列是6

Model:                   23                   #型號23

Stepping:               10                   #步進是10

CPU MHz:               800.000         #cpu主頻是800MHz

Virtualization:        VT-x                 #cpu支援的虛擬化技術VT-x

L1d cache:             32K                 #一級快取,具體為L1資料快取為32k

L1i cache:             32K                   # 一級快取,具體為L1指令快取為32K

L2 cache:              3072K              #二級快取3072K