oracle數據庫的CPU/IO信息採集

  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’

  );

  最近將這些統計指標作進了監控系統,看看效果怎麼樣

相關文章
相關標籤/搜索