效能測試監控——CPU
效能測試監控——CPU
為了全面詳細的分析系統執行狀態,發現隱藏的效能瓶頸。效能測試期間,全面監視CPU執行狀態是很有必要的。
本文側重分析效能測試期間需要監控的CPU執行狀態指標,對比相關查詢命令的優劣,並給出最終的shell指令碼。
關於各指標的詳細含義,見附件。
一、 監控指標項及其理想值
1、load average,平均每個邏輯核心不能高於0.7。
load average大於1,表示系統中存在處於等待狀態的任務,任務競爭CPU容易導致效能降低,時延增大,甚至進入惡性迴圈。在一個合理的load average下加壓,監測CPU使用率的變化情況,可以幫助發現I/O、記憶體、網路中的效能瓶頸。
2、CPU總佔有率。總佔有率小於70%,其中以%usr為主,%sys和%iowait不能太高。
3、各邏輯核心CPU佔有率持平。
4、執行相同任務的程序CPU佔有率持平。
5、程序狀態合理,僵死程序不能太多。
二、 資料收集
資料收集的重點與核心在於:
詳實而又不冗餘,不關注無關指標,以最少的數字反應關注的指標。
有的指標項,比如各邏輯核心的CPU佔有率持平,關注的是一組資料的分佈特點,而不關心資料的具體值。同時,當前系統性能的瓶頸主要在I/O。資料收集期間記錄全部資料的具體數值,即降低影響系統性能,又加大了後期資料處理的工作量。
故,資料收集之前,對我們所需要的資料的統計特徵進行分析。
1.
load average
每隔1min,5min或15min取該段時間內的load average即可。一次取1個數據。
shell命令:uptime | awk -F: '{print $NF}'|awk -F, '{print $1}'
命令解釋:
uptime獲取load average。
awk -F: '{print $NF}'提取1min,5min或15min 內load average的具體數值。
awk -F, '{print $1}'提取其中1個欄位。
2. CPU總佔有率
每隔一段時間,取當前的%usr,%sys,%iowait,%idle取值。
shell
解釋:mpstat的輸出引數,無法自定義欄位。其中部分欄位是我們暫時不關注,但後續會關注。另外,剔除這些欄位涉及較多的管道和文字分析,較為複雜。同時,降低了指令碼的可移植性。
3. 各邏輯核心CPU佔有率持平
根據各邏輯核心的CPU佔有率計算:跨度((max-min)/average),mdev(sqrt(平方和的平均值-平均值的平方))
命令:
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後的三個數字依此是過去1min,5min,15min的平均負載。
w:同時顯示已登入的使用者。開啟2個shell標籤頁,顯示兩個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核心的執行情況
主要有sar,mpstat,vmstat,top。
其中,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整體佔有率合適且各核心佔有率均衡即可。
所以,命令上選擇:mpstat和ps 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. 每個物理CPU中Core的個數:
# 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