Pages

10 Haziran 2011 Cuma

Sistem aktivite raporu(SAR) ile CPU kullanımını izleme

UNIX ve Linux sunucularda sar komutunu –u parametresi ile kullanarak CPU kullanımını izleyebiliriz. sar komutu ne kadar CPU kaynağının çıkmaza girdiğini veya kullanıldığını ile ilgili hızlı bir snapshot çeker. Sisteminiz yavaşladığı zaman bu komutu çalıştırarak pekçok darboğazın kaynağını gözlemleyebilirsiniz.

sar –u <nümerik_değer1> <nümerik_değer2>
nümerik_değer1: sar okumaları arasındaki saniye değeri
nümerik_değer2: sar komutunun kaç sefer çalıştırılacağını belirten değer

$ sar -u 10 5
Linux 2.4.21-37.0.0.1.4.ELhugemem (ap6188rt)    01/06/2011
10:48:24 PM      CPU    %user     %nice   %system   %iowait   %idle
10:48:34 PM       all       22.07      0.00     14.36         0.03         63.54
10:48:44 PM       all       16.70      0.00     13.93         0.17         69.20
10:48:54 PM       all        8.80       0.00       8.15         0.25         82.80
10:49:04 PM       all        2.52       0.00       3.55         0.00         93.92
10:49:14 PM       all        2.05       0.00       4.00         0.00         93.95
Average:             all       10.43      0.00       8.80         0.09         80.69


%user: Kullanıcı modunda çalışan CPU yüzdesi
%system: Sistem modunda çalışan CPU yüzdesi. Eğer 15 in üzerindeyse swapping, paging veya yedekleme gibi sebeplerden kaynaklanabilir.
%iowait: Blok I/O için bekleyen bir proses için çalışan CPU yüzdesi
%idle: Boşta bekleyen CPU yüzdesi
%nice: İlgili prosesin CPU çalışma önceliği. 0-5 arası yüksek öncelikli, 15-20 arası ise düşük önceliklidir.

Bunun yanında yüksek CPU tüketen prosesleri kontrol edebilirsiniz. ps –eaf komutu kullanılarak en çok hangi proseslerin en fazla CPU kaynağını tükettiğini gözlemleyebiliriz. Alttaki örnek en fazla CPU tüketen 9 CPU kullanıcısını listeler

$ ps –e –o pcpu,pid,user,args | sort –k 3 –r | tail

%CPU             PID     USER                         COMMAND
0.3                   1337    oracle             oraclePRD
0.3                   4888    oracle             oraclePRD (LOCAL=NO)
0.4                   3          root                 fsflush
0.4                   1333    psoft                PSRUN PTPUPRCS
0.4                   3532    root                 ./pmon
0.4                   4932    oracle              oraclePRD (LOCAL=NO)
0.4                   4941    oracle             oraclePRD (LOCAL=NO)
2.6                   4943    oracle              oraclePRD (LOCAL=NO)
16.3                 4699    oracle              oraclePRD

Aynı zamanda alttaki sorguyu çalıştırarak yüksek CPU tüketen Oracle kullanıcıları kontrol edilebilir.

SELECT n.username, s.sid, s.value
FROM v$sesstat s,v$statname t, v$session n
WHERE s.statistic# = t.statistic#
AND n.sid = s.sid
AND t.name=’CPU used by this session’
ORDER BY s.value desc;

USERNAME                              SID      VALUE

1093                                        194184
1092                                          77446
1088                                          67564
1089                                          43054
1090                                         19192
1072                                          15009
APPS                                          832       1777
APPS                                          998       1190
APPS                                         822        577
APPS                                          900        508
APPS                                         823        477

Oturum seviyesindeki CPU kullanımını gözlemlemek için;

SQL> select * from v$sesstat
2  where statistic# = 12
3  order by value desc;
      
 SID     STATISTIC#    VALUE

1093         12               194184
1092         12               77475
1088         12               67579
1089         12               43062
1090         12               19194
1072         12               15010
832           12               1785
998           12               1197
822           12               577

Bunun yanında toplam CPU kullanımı ayrıştırabilirsiniz. Temel olarak CPU zamanı alttaki formülden hesaplanabilir.

Toplam CPU zamanı = Ayrışmış CPU kullanımı + tekrarlanan CPU kullanımı + diğer CPU kullanımları

SELECT name,value FROM V$SYSSTAT
WHERE NAME IN
(‘CPU used by this session’,‘recursive cpu usage’,‘parse time cpu’);

NAME                                      VALUE
recursive cpu usage                 6276669
CPU used by this session        8806491
parse time cpu                         482645

En iyi performansı yakalamak için ayrışmış CPU kullanımı ve tekrarlanan CPU kullanımı toplamı oturum tarafından kullanılan CPU miktarından önemli oranda daha az olmalıdır. Yukardaki örnekte ayrışmış CPU kullanımı ve tekrarlanan CPU kullanımı toplamı neredeyse oturum tarafından kullanılan CPU oranına eşit. Bu noktada tekrarlan CPU oranını azaltarak bir takım iyileştirmelere yapılması gerekmekte. Ayrıştırma(parsing) için kullanılan CPU yüzdesini bulmak için alttaki sorgu kullanılabilir.

select (a.value / b.value)*100 “% CPU for parsing”
from V$SYSSTAT a, V$SYSSTAT b
where a.name = ‘parse time cpu’
and b.name = ‘CPU used by this session’;

% CPU for parsing

5.48300146

Ayrıştırmalı(parsing) CPU kullanım zamanını azaltmak
Eğer ayrıştırma CPU zamanı toplam CPU kullanımında başlıca bir parçaysa alttaki adımları izleyerek bu oran azaltılabilir.

  • Bağlaç değişkenleri kullanın ve hard kodlanmış kelime değerlerini kodunuzdan kaldırın.
  • Paylaşımlı havuz için gereğinden fazla bellek tahsis edilmediğinden emin olun.
  • Eğer yeni bir SQL cümlesinin library bellek içinde eksiksiz kopyası varsa, Oracle bu cümleyi bulmak için tüm belleği tarar. Eğer gereksiz cümleler bellekte çokça yer alıyorsa sonuç olarak bu yeni SQl cümlesinin kullanıcıya dönüş süresi uzar ve ayrıştırma(parsing) süresi uzar.
  • Eğer mandal(latch) içerik library bellek içinde yer alırsa bu ayrıştırma(parse) süresini önemli oranda arttırır. Latch içeriği azaltma tavsiyeleri “bekleme olayları” adı altında blogumda “Performance Tuning” kategorisi altında yer almaktadır. Bu makaleyi okumanızı tavsiye ederim.

Tekrarlanan CPU kullanım yüzdesi bulmak
select (a.value / b.value)*100 “% recursive cpu usage”
from V$SYSSTAT a, V$SYSSTAT b
where a.name = ‘recursive cpu usage’
and b.name = ‘CPU used by this session’;

Recursive CPU usage(%)
71.421139

Yukardaki örnekteki sonuç gerçekten tam anlamıyla facia. Bazı durumlarda kullanıcı tarafından bir SQL cümlesi yürütüldüğünde Oracle sunucusu ilave cümlelerde yayınlar. Bu cümlelere tekrarlanan çağrılar veya tekrarlanan SQl cümleleri denir. Örneğin, bir tabloya bir satır ekleme çalıştığımızda ve bu satır için gerekli alan bulunamadıysa, disctionary yönetimli  tablespace kullanıldığında Oracle sunucusu dinamik olarak boş alan tahsis etmek için tekrarlan çağrı yapar.

Tekrarlan çağrılar, dictionary bellek içinde uygun olmayan dictionary bilgisinde, veritabanı tetikleyicileri çalıştığında, DDL komutu çalıştığında, PL/SQL blok içinden SQL çalıştığında ve referential bütünlük kısıtlayıcıları zorlaması sonucunda meydana gelir.

Eğer tekrarlanan CPU kullanım yüzdesi toplam CPU kullanımı içinde önemli oranda yer  tutmaktaysa paylaşımlı bellek havuzu tahsisi yeterli değildir. Ancak, PL/SQL tabanlı uygulamalar her zaman önemli oranda tekrarlanan CPU kullanımına sebep olur.Bu oranı düşürmek için paylaşımlı havuzun büyüklüğünün doğru şekilde ayarlandığından emin olun. Bununla birlikte, CURSOR_SHARING değerinin EXACT, SIMILAR veya FORCE değerlerinden olmasını sağlayın. SESSION_CACHED_CURSORS parametresinin değerinide 500 üzerinde tutmanız tavsiye edilir. Bu parametreler ile ilgili detaylara performance tuning kategorisi altındaki blog yazılarımdan bakabilirsiniz.

0 yorum:

Yorum Gönder