AIX 5.3主機效能評估

小小黃-812發表於2013-12-20
1、vmstat
使用vmstat來進行效能評估,該命令可獲得關於系統各種資源之間的相關效能的簡要資訊。當然我們也主要用它來看CPU的一個負載情況。
下面是我們呼叫vmstat命令的一個輸出結果:
$vmstat 1 2
System configuration: lcpu=16 mem=23552MB
kthr memory page faults cpu
----- ----------- ------------------------ ----------------- -----------
r b avm fre re pi po fr sr cy in sy cs us sy id wa
0 0 3091988 2741152 0 0 0 0 0 0 1849 26129 4907 8 1 88 3
0 0 3091989 2741151 0 0 0 0 0 0 2527 32013 6561 15 2 77 6
對上面的命令解釋如下:
Kthr段顯示內容
? r列表示可執行的核心執行緒平均數目,包括正在執行的執行緒和等待 CPU 的執行緒。如果這個數字大於 CPU 的數目,則表明有執行緒需要等待CPU。
? b列表示處在非中斷睡眠狀態的程式數。包括正在等待檔案系統 I/O 的執行緒,或由於記憶體裝入控制而被掛起的執行緒。
Memory段顯示內容
? avm列表示活動虛擬記憶體的頁面數,每頁一般4KB
? fre空閒的頁面數,每頁一般4KB
Page段顯示內容
? re –該列無效
? pi 從磁碟交換到記憶體的交換頁(調頁空間)數量,4KB/頁。調頁空間是駐留在硬碟上的虛擬記憶體的一部分。當記憶體使用過量時,會將溢位的工作組頁面儲存到調頁空間中(竊取頁)。當程式訪問一個竊取頁時,就產生了一個缺頁故障,而這一頁頁必須從調頁空間中讀入到記憶體中。
? po 從記憶體交換到磁碟的交換頁數量,4KB/頁。如果竊取的工作也在調頁空間中不存在或者已經作了修改,則寫入調頁空間中。如果不被再次訪問,它會留在排程空間中直到程式終止或者放棄空間。
? fr 根據頁面替換演算法每秒釋放的頁數。當VMM頁面替換例程掃描頁面幀表(Page Frame Table,PFT)時,它會根據一些條件選取需要竊取的頁面以補充空閒列表。該條件中包含工作頁面和計算頁面,釋放的頁面中,計算頁面不產生I/O,工作頁面如果資料沒有發生修改,也不需要寫回磁碟,也不會產生I/O。
? sr 根據頁面替換演算法每秒所檢查的頁數。sr值比fr值高的越多,說明替換演算法要查詢可以替換的頁面就越困難。
? cy 每秒頁面替換程式碼掃描了PFT多少次。因為增加空閒列表達到maxfree值,不一定需要完全掃描PFT表,而所有vmstat輸出都為整數,所以通常cy列值為0。
Faults段顯示內容(其實這段內容不需太多關注)
? in 在該時間間隔中觀測到的每秒裝置中斷數。
? sy 在該時間間隔中觀測到的每秒系統呼叫次數。
? cs 在該時間間隔中觀測到的每秒鐘上下文切換次數。
Cpu段顯示內容
? us 列顯示了使用者模式所消耗的 CPU 時間。
? sy 列詳細顯示了 CPU 在系統模式所消耗的 CPU 時間。
? id 列顯示了沒有未決本地磁碟 I/O 時 CPU 空閒或等待時間的百分比。
? wa 列詳細顯示了有未決本地磁碟 I/O 時 CPU 空閒的時間百分比。wa 的值如果超過 25%,就表明磁碟子系統可能沒有被正確平衡,或者這也可能是磁碟工作負荷很重的結果。
如果在一個單使用者系統中,us + sy時間不超過 90%,我們就不認為系統的CPU是受限制的。
如果在一個多使用者系統中,us + sy時間超過 80%, 我們就認為系統的CPU是受限的。其中的程式將要花時間在執行佇列中等待。響應時間和吞吐量會受損害。
檢查cpu,我們主要關注報告中的4個cpu列和2個kthr(核心執行緒)列。
在上面的示例中,我們可以觀察到以下幾個主要的資訊:
CPU IDLE比較高,比較空閒;r列為0,表明執行緒不存在等待;
WA值不高,說明I/O壓力不大;
free值比較大,pi,po為0,表明記憶體非常富裕。空閒較多。

2、sar
第二個常用的是 sar命令,但是sar會增加系統的開銷。當然有些情況下,我們使用sar比較方便。
sar的輸出結果與前面的基本類似,這裡不再作詳細的介紹,關於命令的語法,也不再作詳細的介紹,我們常用的命令格式:
#sar 1 3

AIX jsdxh_db02 3 5 00C2C1EB4C00 10/24/07

System configuration: lcpu=16

17:52:26 %usr %sys %wio %idle physc
17:52:27 19 7 0 75 8.00
17:52:28 19 6 0 75 8.01
17:52:29 19 7 0 75 8.02

Average 19 7 0 75 8.01

在這裡,sar命令輸出的是一個整體的cpu使用情況的一個統計,統計分專案的內容也比較直觀,通過名字就可以理解涵義。這裡有一點比較方便的就是,在最後一行有一個彙總的average行,作為上述統計的一個平均。另外,補充說明一點的就是,一般來說,第一行統計資訊包含了sar命令本身啟動的cpu消耗,所以往往是偏高的,所以導致average值也往往是偏高一點的。當然,這不會對結果產生多大影響。
當我們有多個cpu的時候,而程式採用的是單執行緒,有時候會出現一種情況,我們檢查發現,cpu總體的使用率不高,但是程式響應卻比較慢。這裡有可能就是單執行緒只使用了一個cpu,導致這個cpu100%佔用,處理不過來,而其他的cpu卻閒置。這時可以對cpu分開查詢,統計每個cpu的使用情況。
#sar -P ALL 1 2

AIX jsdxh_db02 3 5 00C2C1EB4C00 10/24/07

System configuration: lcpu=16

18:03:30 cpu %usr %sys %wio %idle physc
18:03:31 0 0 69 0 31 0.00
1 50 50 0 0 1.00
2 0 0 0 100 0.52
3 0 0 0 100 0.48
4 0 1 0 99 0.54
5 0 0 0 100 0.46
6 0 0 0 100 0.53
7 0 0 0 100 0.47
8 0 0 0 100 0.53
9 0 0 0 100 0.47
10 0 2 0 98 0.54
11 0 0 0 100 0.46
12 11 58 0 31 0.00
13 100 0 0 0 1.00
14 0 0 0 100 0.53
15 0 0 0 100 0.47
- 19 7 0 75 8.01
18:03:32 0 0 71 0 29 0.00
1 50 50 0 0 1.00
2 0 0 0 100 0.52
3 0 0 0 100 0.48
4 0 1 0 99 0.54
5 0 0 0 100 0.47
6 0 0 0 100 0.52
7 0 0 0 100 0.47
8 0 0 0 100 0.53
9 0 0 0 100 0.47
10 0 2 0 98 0.54
11 0 0 0 100 0.46
12 39 41 0 20 0.00
13 100 0 0 0 1.00
14 0 0 0 100 0.52
15 0 0 0 100 0.47
- 19 7 0 75 7.98

Average 0 0 70 0 30 0.00
1 50 50 0 0 1.00
2 0 0 0 100 0.52
3 0 0 0 100 0.48
4 0 1 0 99 0.54
5 0 0 0 100 0.46
6 0 0 0 100 0.53
7 0 0 0 100 0.47
8 0 0 0 100 0.53
9 0 0 0 100 0.47
10 0 2 0 98 0.54
11 0 0 0 100 0.46
12 28 48 0 24 0.00
13 100 0 0 0 1.00
14 0 0 0 100 0.52
15 0 0 0 100 0.47
- 19 7 0 75 8.00

上面是分cpu統計的情況,結果應該也比較直觀吧。
Sar還有其他一些比較特殊的使用方法,比如:
如果希望多個取樣和多個報告,可為 sar 命令指定一個輸出檔案,這樣就方便多了。將 sar 命令的標準輸出資料定向到 /dev/null,並將 sar 命令作為後臺程式執行。具體的命令格式為:
sar -A -o /temp/sar_result.log 5 300 > /dev/null &
關於sar其他的一些使用方法,這裡不再詳述。

3、iostat
第三個可以用來使用的命令是iostat.
$ iostat -t 2 4
tty: tin tout avg-cpu: % user % sys % idle % iowait
0.0 0.0 0.0 0.1 99.8 0.1
0.0 81.0 0.0 0.1 99.9 0.0
0.0 40.5 0.0 0.0 100.0 0.0
0.0 40.5 0.0 0.1 99.1 0.8
TTY 的兩列資訊(tin 和 tou)顯示了由所有 TTY 裝置讀寫的字元數
CPU 統計資訊列(% user、% sys、% idle 和 % iowait)提供了 CPU 的使用情況。
注意:第一份報告為系統啟動以來的一個累積值。


4、tprof
使用tprof命令用於統計每個程式的CPU使用情況
# tprof -x sleep 30
該命令的輸出結果可檢視 __prof.all檔案。
此命令執行30秒鐘,在當前目錄下建立一個名為_prof.all 的檔案。30秒鐘內, CPU被排程次數約為3000次。__prof.all 檔案中的欄位Total 為此程式排程到的CPU次數。如果程式所對應的 Total字 段的值為1500,即表示該程式在3000次 CPU排程中佔用了1500次,或理解為使用了一半的CPU時間。tprof的輸出準確地顯示出哪個程式在使用CPU 時間。
在我下面的這一份示例中,可以看到,大部分的cpu時間都是被wait所佔用的。這裡的wait實際上是idle程式,可以表明這個系統是一個完全空閒的系統。
$ more __prof.all
Process PID TID Total Kernel User Shared Other
======= === === ===== ====== ==== ====== =====
wait 40970 40971 2998 2998 0 0 0
wait 32776 32777 2994 2994 0 0 0
wait 24582 24583 2985 2985 0 0 0
wait 16388 16389 2980 2980 0 0 0
syncd 221254 155707 31 31 0 0 0
caiUxOs 524540 2294015 3 0 0 3 0
netm 73746 73747 1 1 0 0 0
hats_nim 1671242 1220665 1 0 0 1 0
snmpd64 598258 1245291 1 1 0 0 0
rpc.lockd 639212 1728679 1 1 0 0 0
tprof 704622 2277437 1 0 0 1 0
trclogio 360524 2408625 1 1 0 0 0
trace 1523820 2523145 1 0 0 1 0
clinfo 1958102 2760945 1 1 0 0 0
sh 1572938 2285709 1 1 0 0 0
======= === === ===== ====== ==== ====== =====
Total 12000 11994 0 6 0


Process FREQ Total Kernel User Shared Other
======= === ===== ====== ==== ====== =====
wait 4 11957 11957 0 0 0
syncd 1 31 31 0 0 0
caiUxOs 1 3 0 0 3 0
netm 1 1 1 0 0 0
hats_nim 1 1 0 0 1 0
snmpd64 1 1 1 0 0 0
rpc.lockd 1 1 1 0 0 0
tprof 1 1 0 0 1 0
trclogio 1 1 1 0 0 0
trace 1 1 0 0 1 0
clinfo 1 1 1 0 0 0
sh 1 1 1 0 0 0
======= === ===== ====== ==== ====== =====
Total 15 12000 11994 0 6 0

在這裡,對wait程式作一點補充說明。
在AIX 5L下,你用ps aux會發現有一些root的wait程式
#ps aux |head -20
USER PID %CPU %MEM SZ RSS TTY STAT STIME TIME COMMAND
oracle 266354 5.7 0.0 50136 27524 - A 15:40:35 0:32 oracleora92 (LOC
root 17214 3.1 0.0 40 40 - A Jul 04 24793:53 wait
root 16946 3.1 0.0 40 40 - A Jul 04 24633:59 wait
root 16678 3.1 0.0 40 40 - A Jul 04 24600:21 wait
root 53274 3.1 0.0 40 40 - A Jul 04 24397:54 wait
root 286 3.1 0.0 40 40 - A Jul 04 24371:55 wait
root 8196 3.0 0.0 40 40 - A Jul 04 24312:40 wait
root 822 3.0 0.0 40 40 - A Jul 04 24303:36 wait
root 554 3.0 0.0 40 40 - A Jul 04 24261:50 wait
root 20776 2.7 0.0 40 40 - A Jul 04 21502:46 wait
root 57372 2.7 0.0 40 40 - A Jul 04 21439:31 wait
root 49176 2.7 0.0 40 40 - A Jul 04 21423:47 wait
root 21044 2.7 0.0 40 40 - A Jul 04 21398:24 wait
root 12848 2.7 0.0 40 40 - A Jul 04 21357:07 wait
root 21312 2.7 0.0 40 40 - A Jul 04 21324:26 wait
root 12580 2.7 0.0 40 40 - A Jul 04 21293:06 wait
root 13116 2.7 0.0 40 40 - A Jul 04 21195:47 wait
oracle 344612 0.3 0.0 57588 34976 - A Jul 04 2663:08 ora_j000_ora92
oracle 430408 0.3 0.0 55908 33296 - A Jul 04 2220:57 ora_j001_ora92

wait就是CPU空閒的時候執行的空閒程式,AIX4上叫kproc。所以這個程式佔用越大,表示機器越空閒。Wait程式的數量是由機器上的邏輯CPU的個數決定的,有幾個邏輯CPU,就有幾個wait程式.


5、ps
這個命令使用本身也比較複雜,在這裡只介紹如何檢視cpu佔用最高的程式。使用舉例如下:
#ps aux | head -25
USER PID %CPU %MEM SZ RSS TTY STAT STIME TIME COMMAND
root 17214 3.1 0.0 40 40 - A Jul 04 25578:42 wait
root 16946 3.1 0.0 40 40 - A Jul 04 25415:54 wait
root 16678 3.1 0.0 40 40 - A Jul 04 25377:03 wait
root 53274 3.1 0.0 40 40 - A Jul 04 25170:12 wait
root 286 3.1 0.0 40 40 - A Jul 04 25144:00 wait
root 8196 3.0 0.0 40 40 - A Jul 04 25082:32 wait
root 822 3.0 0.0 40 40 - A Jul 04 25072:25 wait
root 554 3.0 0.0 40 40 - A Jul 04 25034:14 wait
root 20776 2.7 0.0 40 40 - A Jul 04 22181:27 wait
root 57372 2.7 0.0 40 40 - A Jul 04 22118:00 wait
root 49176 2.7 0.0 40 40 - A Jul 04 22102:02 wait
root 21044 2.7 0.0 40 40 - A Jul 04 22077:18 wait
root 12848 2.7 0.0 40 40 - A Jul 04 22036:44 wait
root 21312 2.7 0.0 40 40 - A Jul 04 21998:53 wait
root 12580 2.7 0.0 40 40 - A Jul 04 21967:17 wait
root 13116 2.7 0.0 40 40 - A Jul 04 21865:51 wait
oracle 344612 0.3 0.0 56372 33852 - A Jul 04 2707:30 ora_j000_ora92
oracle 430408 0.3 0.0 55916 33396 - A Jul 04 2266:20 ora_j001_ora92
oracle 365092 0.2 0.0 56184 33664 - A Jul 04 1765:58 ora_j002_ora92
oracle 442430 0.2 0.0 56092 33572 - A Jul 04 1426:40 ora_j003_ora92
oracle 385606 0.1 0.0 55984 33464 - A Jul 05 1159:17 ora_j004_ora92
oracle 413856 0.1 0.0 50520 28000 - A Jul 23 543:31 oracleora92 (LOC
oracle 143668 0.1 0.0 50528 28008 - A Jul 13 833:21 oracleora92 (LOC
oracle 369230 0.1 0.0 56600 34080 - A Jul 05 806:36 ora_j005_ora92

在這個輸出結果中,排在前面的是16個root使用者的wait程式,這其實是CPU空閒的時候執行的空閒程式,之前已作說明。
所以CPU最高的幾個程式其實是下面的ORACLE使用者的ora_j00*程式,這是ORACLE的job程式。在這裡,這些程式的開銷很小。如果ORACLE的程式開銷比較大,我們可以用如下的方法來查詢具體的程式在幹什麼事情,例如我們要查詢程式ora_j000_ora92,PID=344612,可以使用下面的方法:
$su – oracle
SQL>sqlplus “/as sysdba”
SQL>oradebug setospid 344612
SQL>oradebug event 10046 trace name context forever, level 8
SQL>oradebug tracefile_name –這個命令我們獲得輸出檔案的絕對路徑和檔名
SQL>oradebug event 10046 trace name context off
$tkprof /opt/oracle/app/oracle/admin/ora92/bdump/ora92_j000_344612.trc tracepid.txt
$more tracepid.txt
在tracepid.txt中,我們就可以看到這個程式中具體執行的語句、過程等,以及所有的SQL的cpu消耗、物理讀、邏輯讀、執行計劃等資訊。

另外,我們也可以執行下面的語句檢視程式具體執行的SQL語句的文字:
SELECT /*+ ORDERED */ sql_text FROM v$sqltext a
WHERE (a.hash_value, a.address) IN (
SELECT DECODE (sql_hash_value,0, prev_hash_value,sql_hash_value),
DECODE (sql_hash_value,0, prev_sql_addr, sql_address)
FROM v$session b
WHERE b.paddr = (SELECT addr
FROM v$process c
WHERE c.spid = '&pid'))
ORDER BY piece ASC

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29144194/viewspace-1063907/,如需轉載,請註明出處,否則將追究法律責任。

相關文章