CPU時間采集
從10G開始,oracle引入了時間模型,我們可以從oracle的角度來看CPU的使用程度 oracle培訓
先說說幾個概念
db time:oracle數據庫消耗的時間,這個范圍比較大,包括了CPU使用,等待IO子系統返回,網絡處理等
db cpu:指oracle單純消耗CPU,做CPU運算的時間,關于IO,網絡的等待都不在這個范圍內,用它來統計真實CPU的消耗比較準確
CPU TIME:這個是我取的名字,表示CPU能給你提供的最大時間,比如你有4個cpu/core,那么1小時內,CPU TIME就是4X60分鐘
我通過一個測試腳本來看看oracle里面關于CPU時間的統計
#killcpu.sh
#!/bin/sh
export ORACLE_SID=innodb
export ORACLE_HOME=/opt/oracle/products/11.2.0
$ORACLE_HOME/bin/sqlplus /nolog <<_kof_
connect iops/iops@innodb
declare v_count pls_integer := 0;
begin
for x in 1..400000000 loop
for d in 1..400000000 loop
for c in 1..400000000 loop
v_count :=mod(c, mod(x,d));
end loop;
end loop;
end loop;
end;
/
_kof_
測試機器是Intel(R) Xeon(R) CPU E7530的4C6核 CPU,虛擬出來總共是48個core
killcpu采用24并發,48并發,60并發做測試,每個10分鐘,通過statspack收集信息,按照上面的公式,我們的cpu time=10min*60 * 48core=28800秒
最終結果如下(時間單位都是秒):
并發數 db time db cpu cpu time top顯示CPU占用率 LOAD
24 14066 14064 28800 50 24
48 27984 27401 28800 100 48
60 34556 27179 28800 100 57
從結果可以看出:
24并發,oracle使用了24個core,整體的CPU占用率在50%,load在24,非常準確,此時db time基本和db cpu一致,因為你干的所有事情,都是在CPU上
48并發,oracle使用了48個core,CPU使用率達到100%,oracle在多cpu環境下對資源的利用確實很高,此時db time,db cpu,cpu time一致了,CPU在滿負荷運轉
60并發,這個時候會發現,db cpu沒變,因為CPU已經耗盡,沒得漲了,db time現在已經遠大于cpu time和db cpu,這說明我們有一部分的程序根本搶不到CPU,進入了
等待,load也超過了core數量,達到57
通過db cpu/db time,我們可以看出這個數據庫是否是CPU使用很重的應用,比如大量的運算,latch爭用等,
如果是一個IO很重的應用,會發現db cpu站的比例會很小
IO負載統計
IO表現在兩個方面,IOPS和吞吐量,我們OLTP系統,一般比較關心IOPS,及每個IO的響應時間,
以前針對IOPS統計,我們一直是按照statspack的physical reads+physical writes來統計,這個是很不準確的
按照文檔的解釋:
physical reads:Total number of data blocks read from disk
這個是按照block讀取的數量來統計的,oracle的IO種類有很多,如果是scatter read或者parallel read,一個IO會讀取多塊的,
這樣計算IOPS會偏大,重新調整后,發現統計出來的曲線和從存儲段觀察的比較吻合
9I:
–IOPS&MBPS
select sum(iops) as iops,sum(mbps) as mbps
from (
select sum(phyrds + phywrts) as IOPS,
sum(phyblkrd + phyblkwrt) as MBPS
from (select a.phyrds,a.phywrts,a.phyblkrd * b.block_size / 1024 / 1024 as phyblkrd,a.phyblkwrt * b.BLOCK_SIZE / 1024 / 1024 as phyblkwrt
from v$filestat a,v$datafile b
where a.file# = b.file#)
union all
select sum(decode(name,’redo writes’,value,’0′)) as IOPS,
sum(decode(name,’redo size’,value,’0′)) / 1024 / 1024 as MBPS
from v$sysstat where name in( ‘redo writes’,'redo size’));
10G/11G
–IOPS&MBPS
select sum(decode(name,’physical read IO requests’,value,’physical write IO requests’,value,0)) as iops,
sum(decode(name,’physical read bytes’,value,’physical write bytes’,value,0)) / 1024 / 1024 as mbps
from v$sysstat
where name in (’physical read IO requests’,'physical write IO requests’,
‘physical read bytes’,'physical read total bytes’,
‘physical write bytes’,'physical write total bytes’,'physical read total IO requests’,'physical write total IO requests’
);
最近將這些統計指標做進了監控系統,看看效果怎么樣