Pages

6 Eylül 2011 Salı

Sistem ve oturum istatistiklerinden delta değerlerin izlenmesi

Oracle üzerindeki bazı görünümler sistem çapında ve oturum seviyesinde istatistiksel bilgileri göstermektedir. Bu görünümler genellikle veritabanının en son online olmasından itibaren birikmiş değerleri göstermektedir. Analiz için istatistiklere bir değer katmak için belirlenen zaman süreleri içinde iki örneklemenin bu istatistiğe dahil olması olması gerekmektedir. İşte bu başlangıç ve bitiş değerleri arasındaki farklılıklar sıklıkla “delta” değerleri olarak bilinmektedir. “Delta” değerler bir bekleme olayının kesin olarak anlaşılması ve pek çok durumda bu kronik sorunların üstesinden gelmekte oldukça ufuk açıcı bilgiler sunmaktadır.

Sistem çapında istatistikleri gösteren yaygın erişilen görünümler, V$SYSSTAT görünümü ile oturum seviyesi bilgileri içeren V$SESSTAT görünümleridir. V$SESS_IO gibi görünümler, öncelikle mantıksal ve fiziksel blok okumaları ve blok değişimlerini içeren V$SESSTAT içinde bulunan istatistiklerin alt kümesini göstermektedir. V$SYSSTAT görünümü içindeki istatistikler genellikle aşağıdaki listeden bir veya iki alt kategoriye veya sınıfa bölünmektedir. user (1), redo (2),enqueue (4), cache (8), OS (16), RAC (32), SQL (64) ve debug (128). Eğer bir sınıf birçok alt sınıfa bölünürse CLASS kolonuna atanan değer, her bir sınıf tipi ile ilişkili değerlerin toplamı olmaktadır. Tamamlanma(elapsed) süresini işaret eden istatistik (DB time, parse time cpu, parse time elapsed, redo synch time, redo write time, v.b) centisaniye olarak belirtilir.

Belirlenen iki STATSPACK snapshotu arasındaki bekleme olaylarının delta farklılıklarıda STATS$SNAPSHOT ve STATS$SYSTEM_EVENT görünümleri birleştirilerek aşağıdaki sorgu ile tespit edilebilir;

SELECT s1.snap_time,
w1.event,
s1.snap_id,
ROUND((w1.time_waited_micro/1000000/total_waits),4) "Ort_bekleme_saniye",
LAG(ROUND((w1.time_waited_micro/1000000/total_waits),4))
OVER (ORDER BY ROUND((w1.time_waited_micro/1000000/total_waits),4)) önceki_deger,
ROUND((w1.time_waited_micro/1000000/total_waits),4) - LAG(ROUND((w1.time_waited_micro/1000000/total_waits),4))
OVER (ORDER BY ROUND((w1.time_waited_micro/1000000/total_waits),4)) delta_deger
FROM stats$snapshot s1,
stats$system_event w1
WHERE s1.snap_id BETWEEN &snapshot_baslangic AND &snapshot_bitis
AND s1.snap_id = w1.snap_id
ORDER BY 1

AWR raporundan ise yukardaki sorgudaki gibi bekleme olaylarının delta değişimlerini almak için aşağıdaki sorgu kullanılabilir;

SELECT begin_interval_time, new.stat_name, (new.value-old.value) “Difference”
FROM dba_hist_sys_time_model old, dba_hist_sys_time_model new,dba_hist_snapshot ss
WHERE new.stat_name=old.stat_name
AND new.snap_id=ss.snap_id
AND old.snap_id=ss.snap_id-1
AND new.stat_name like ‘%&stat_name%’
ORDER BY begin_interval_time; 

Oracle 10.1 sürümü ile tanıtılan V$SYS_TIME_MODEL görünümü ve onun oturum seviyesindeki görünümü V$SESS_TIME_MODEL görünümü, sırasıyla sert çözümleme(hard parsing), sekuens bakımı,PL/SQL çalıştırma gibi görevler için kullanılan sistem ve oturum seviyesindeki CPU zamanını ve süre toplamını göstermektedir. Tamamlanma süresini elde etmek için işaret edilen süre 1000000 değerine bölünmelidir.Tam olarak anlaşılmak için bu görünümler içindeki istatistikler aşağıdakine benzer ağaç yapısında yeniden düzenlenmelidir.

SQL> SELECT VALUE, STAT_NAME
     FROM V$SYS_TIME_MODEL;

VALUE           STAT_NAME
-------------- -----------------------------------------
284,815,279     background elapsed time
34,678,994      background cpu time
12,702,393,076  DB time
7,800,938,927   DB CPU
674,299         connection management call elapsed time
97,139          sequence load elapsed time
12,757,866,016 sql execute elapsed time
595,228,023     parse time elapsed
582,948,813     hard parse elapsed time
1,248,232       hard parse (sharing criteria) elapsed time
45,602          hard parse (bind mismatch) elapsed time
521,883,138     failed parse elapsed time
0               failed parse (out of shared memory) elapsed time
11,037,668,116 PL/SQL execution elapsed time
0 inbound       PL/SQL rpc elapsed time
5,633,722       PL/SQL compilation elapsed time
0               Java execution elapsed time

Yukarda örnekte, tamamlanma süresinin yaklaşık %4 üne denk gelen ve 595 saniyelik “parse time elapsed” süresinin yaklaşık 522 saniyesi çözümleme hatası(“hard parse elapsed time”) içindedir.

V$OSSTAT  görünümü işletim sisteni perspektifinden sunucunun en son boot olmasından itibaren sunucu CPU aktivitesini göstermektedir. AVG_  önekli  istatistikler sunucudaki toplam CPU sayısına bölünerek istatistikleri göstermektedir. LOAD, OS_CPU_WAIT_TIME, NICE_TIME ve  IOWAIT_TIME gibi bazı istatistikler tüm platformlarda görüntülenmeyebilir. Oracle 10.1 itibariyle _TIME sonekleri _TICKS şeklindedir. Unutmayınki aşağıdaki istatistikler yoğun 1 saatlik aktiviteyi içeren zaman dilimi için doğru düzgün kısıtlama içermez. Aşağıdaki örnekte, ortalama olarak sunucu genelde boşta gözükmektedir, sadece RSRC_MGR_CPU_WAIT_TIME istatistiği belirli bir periyot içinde CPU zamanı için önemli bir yoğunluk olduğunu göstermektedir:

SQL> SELECT VALUE, STAT_NAME
     FROM V$OSSTAT;

VALUE           STAT_NAME
-------------   ----------------------
8               NUM_CPUS
74,407,427      IDLE_TIME
2,245,241       BUSY_TIME
1,908,037       USER_TIME
339,400         SYS_TIME
9,298,148       AVG_IDLE_TIME
277,841         AVG_BUSY_TIME
235,767         AVG_USER_TIME
39,641          AVG_SYS_TIME
14,087          RSRC_MGR_CPU_WAIT_TIME
12,874,489,856 PHYSICAL_MEMORY_BYTES

Oracle içindeki çeşitli görünümler, Enterprise lisansı olmadan ve Diagnostic Pack için ek lisans olmadan erişilemez. İlave lisans maliyeti içeren bu görünümlerin pek çoğu
DBA_HIST_ or DBA_ADVISOR_ önekiyle başlayan ve DBA_HIST_ACTIVE_SESS_HISTORY,  DBA_HIST_SYSSTAT, DBA_HIST_SYSTEM_EVENT,  DBA_HIST_SQLSTAT, DBA_HIST_SYS_TIME_MODEL, DBA_ADVISOR_FINDINGS, DBA_ADVISOR_RATIONALE ve DBA_ADVISOR_RECOMMENDATIONS gibi görünümlerdir.

Yukardaki görünümlerden delta değişimleri noktasında BA_HIST_SQLSTAT görünümünden istatistiki bilgiler aşağıda yer almaktadır. Bu sorguda en fazla BUFFER_GETS delta değişim olayına sebebiyet veren 5 SQL ID yer almaktadır.

select sql_id, BUFFER_GETS_DELTA
from (
  select sql_id, BUFFER_GETS_DELTA,
    dense_rank() over (order by BUFFER_GETS_DELTA desc) delta
  from DBA_HIST_SQLSTAT
) x
where delta <= 5;

Bunun yanında AWR geçmiş tablolarından performans kıyaslaması almak için, aşağıdaki sorgu 2 farklı gün içinde çalıştırılarak bu iki gün içinde top 10 bekleme olayında meydana gelen delta değişimleri tespit edilerek odaklanılması gereken noktalar kolayca tespit edilebilmektedir.

select * from
(select event, waits “Waits”, time “Wait Time (s)”, pct*100 “Percent of Total”, waitclass “Wait Class”
from (select e.event_name event, e.total_waits – nvl(b.total_waits,0) waits,
(e.time_waited_micro – nvl(b.time_waited_micro,0))/1000000 time
, (e.time_waited_micro – nvl(b.time_waited_micro,0))/(select sum(e1.time_waited_micro – nvl(b1.time_waited_micro,0))
from dba_hist_system_event b1 , dba_hist_system_event e1
where b1.snap_id(+) = b.snap_id and e1.snap_id = e.snap_id and b1.dbid(+) = b.dbid
and e1.dbid = e.dbid and b1.instance_number(+) = b.instance_number
and e1.instance_number = e.instance_number
and b1.event_id(+) = e1.event_id
and e1.total_waits > nvl(b1.total_waits,0)
and e1.wait_class <> ‘Idle’
) pct
, e.wait_class waitclass
from
dba_hist_system_event b ,
dba_hist_system_event e
where b.snap_id(+) = &snapshot_baslangic
and e.snap_id = &snapshot_bitis
and b.event_id(+) = e.event_id
and e.total_waits > nvl(b.total_waits,0)
and e.wait_class <> ‘Idle’
order by waits desc
)
where rownum < 11);

İstatistikler tek başına oturumun CPU bolluğu içinde olmasına rağmen neden beklenenden yavaş olduğunu belirleyecek root sebep analizleri ile ilgili yeterli bilgi sağlamayabilir, ancak pek çok sorunun önceden tespitinde oldukça faydalı performans izleme metodudur. Zaman modelli istatistikler nerde zaman harcandığı noktasında oldukça faydalı göstergeler sağlarken, zaman bazlı olmayan istatistikler bu istatistikler için içerik sağlamaktadır. 

0 yorum:

Yorum Gönder