CPU時間採集 git
從10G開始,oracle引入了時間模型,咱們能夠從oracle的角度來看CPU的使用程度 oracle培訓 sql
先說說幾個概念 數據庫
db time:oracle數據庫消耗的時間,這個範圍比較大,包括了CPU使用,等待IO子系統返回,網絡處理等 網絡
db cpu:指oracle單純消耗CPU,作CPU運算的時間,關於IO,網絡的等待都不在這個範圍內,用它來統計真實CPU的消耗比較準確 併發
CPU TIME:這個是我取的名字,表示CPU能給你提供的最大時間,好比你有4個cpu/core,那麼1小時內,CPU TIME就是4X60分鐘 oracle
我經過一個測試腳原本看看oracle裏面關於CPU時間的統計 oop
#killcpu.sh 測試
#!/bin/sh spa
export ORACLE_SID=innodb code
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’
);
最近將這些統計指標作進了監控系統,看看效果怎麼樣