Pages

12 Mayıs 2011 Perşembe

Oracle proseslerinin bellek kullanımının izlenmesi

Oracle prosesleri tarafından kullanılan belleği anlamak için öncelikle Linux ps komutu ile işletim sistemi seviyesinde proses bazında bellek kullanım listesini alıp, ardından Oracle içerisinden aynı proseslerin arkaplanda kullanıldığına bakmamız gerekmektedir. Kısaca, smon Oracle arkaplan prosesine ps komutu ile bakalım ve ardından SQL*Plus üzerinden aynı prosesin programlar içerisinde görelim.

# ps -afe | grep ora_smon
oracle    2944     1  0 07:02 ?        00:00:01 ora_smon_aysun
root      3181  3148  1 07:28 Pts/2    00:00:02 grep ora_smon    


SQL> SELECT spid,program,background
       FROM v$process
      WHERE spid = 2944;


SPID  PROGRAM                                  BACKGROUND
----- ---------------------------------------- ----------
2944  oracle@linux2.localdomain(SMON)          1

Bu iki sorgu sonucunda anahtar nokta, UNIX proses ID ve Oracle SPID değerlerinin aynı olmasıdır. Bu benzersiz değer kullanılarak, Oracle üzerinden Linux/UNIX’e veya Linux/UNIX üzerinden Oracle’a doğru prosesler araştırılabilir. Bir Oracle instance başladığında veya bir uygulama Oracle veritabanını kullandığında, ilişkili Oracle prosesleri tahsis edilmekte ve bellek tüketmektedir. Bu bellek kullanımına farklı yollardan bakılabilmektedir.

V$PROCESS görünümünde toplam bellek kullanımını raporlayan ilave bazı kolonlar bulunmaktadır. V$PROCESS görünümü, proses için kontrol bilgisi ve veriyi içeren özel bellek bölgesi olan “PGA belleği” üzerinde raporlama yapan kolon setlerine sahiptir. Aşağıdaki sorguyu kullanarak, üstteki SQL örneği sonucu bulunan smon arkaplan prosesine bakabilir ve ne kadar PGA bellek tahsis edildiğini görebilmekteyiz. Sonuçların daha anlaşılır olması için sonuçları byte değerinden MB değerine dönüştürüyorum.

SQL> SELECT spid, program,
            ROUND(pga_max_mem/1024/1024,2)      maks,
            ROUND(pga_alloc_mem/1024/1024,2)    pga_tahsisi,
            ROUND(pga_used_mem/1024/1024,2)     kullanilan,
            ROUND(pga_freeable_mem/1024/1024,2) bosta
       FROM V$PROCESS
      WHERE spid = 2944;


SPID  PROGRAM                         MAKS    PGA_TAHSISI KULLANILAN BOSTA
----- -------------------             ------- ----------  ----------------
-----
2944  oracle@linux2.localdomain (SMON) 1,98    1,98        .91       .81

Farklı kategorilerdekki proseslerin kullandığı bellek hakkında fikir sahibi olabilmek için V$PROCESS_MEMORY tablosuna sorgu çekilebilir. Bu tablo her bir Oracle prosesi için dinamik PGA bellek kullanımı göstermektedir ve eğer kullanılıyorsa Java, PL/SQL, OLAP ve SQL alanları içinde bilgileri içermektedir. Proseslerin dinamik PGA bellek kullanımını izlemek ve anlamak için anahtar noktalar şunlar olmaktadır;

  • Category(Kategori) – Geçerli kategoriler; "SQL", "PL/SQL", "OLAP" ve "JAVA".
  • Allocated(Tahsis edilen) Bir kategori için prosese tahsis edilen belleğin byte değeri
  • Used(Kullanılan) – Bir kategori için prosesin kullandığı belleğin byte değeri
  • Max_allocated(Maksimum tahsis edilen) – Bir kategori için o ana kadar tahsis edilen maksimum belleğin byte değeri
  • Freeable(Boşta) - Bellek prosese tahsis edilmiştir ancak spesifik bir kategoriye ait olduğunu göstermektedir. Bu bellek işletim sistemine geri verilmek üzere uygun durumdadır ve max_allocated değeri yoktur.
  • Other(Diğer) - Varsayılan kategoriler dışındaki proseslere tahsis edilen belleği gösterir.
Yani, detaylı olarak smon arkaplan proseslerinin bellek kullanımını izlemek için aşağıdaki sorgu çalıştırılır. Sonuçların daha anlaşılır olması için sonuçları byte değerinden MB değerine dönüştürüyorum.

SQL> SELECT p.program,
            p.spid,
            pm.category,
            ROUND(pm.allocated/1024/1024,2) ALLOCATED,
            ROUND(pm.used/1024/1024,2) USED,
            ROUND(pm.max_allocated/1024/1024,2) MAX_ALLOCATED
       FROM V$PROCESS p, V$PROCESS_MEMORY pm
      WHERE p.pid = pm.pid
        AND p.spid = 2944;

PROGRAM                          SPID  CATEGORY   ALLOCATED  USED    MAX_ALLOCATED
-----------------                ----- ---------  ---------  -------   -------------
oracle@linux2.localdomain (SMON) 2944  SQL         0,18      0,08     0.57
oracle@linux2.localdomain (SMON) 2944  PL/SQL      0         0         0
oracle@linux2.localdomain (SMON) 2944  Freeable    0,38      0
oracle@linux2.localdomain (SMON) 2944  Other       1,43      1,43

Bu noktada ayrıca UNIX/Linux işletim sisteminden bellek tahsisine bakılabilir. Proses ID (veya proses ID’lerin) değerinden pmap komutu ilgili proses için bellek kullanımı hakkında rapor vermektedir. Üstte elde edilen 2944 numaralı smon prosesi için aşağıdaki komut çalıştırıldığında alınan çıktıda, eşleşilen(mapped) parça ve aldığı bellek detaylı olarak listelenmektedir. Listenin sonunda eşleşilen bellek kullanım toplamı yer almaktadır. Proseslerin bellek kullanım raporlamasında kullanılan diğer Unix yardımcı programlarının aksine, pmap komutu ile alınan çıktıda özel ve paylaşımlı bellekler ayrı gösterilmektedir ve ayrı olarak işlenmektedir.

# pmap -d 2944

2944:   ora_smon_aysun

Address   Kbytes Mode  Offset           Device    Mapping
00110000       4 rwx-- 0000000000110000 000:00000   [ anon ]
00111000     648 r-x-- 0000000000000000 0fd:00000 libhasgen11.so
001b3000       4 rwx-- 00000000000a1000 0fd:00000 libhasgen11.so
001b4000      12 rwx-- 00000000001b4000 000:00000   [ anon ]
001b7000      32 r-x-- 0000000000000000 0fd:00000 libocrutl11.so
001bf000       4 rwx-- 0000000000007000 0fd:00000 libocrutl11.so
001c0000       4 rwx-- 00000000001c0000 000:00000   [ anon ]
001c1000       4 r-x-- 0000000000000000 0fd:00000 libaio.so.1.0.1
001c2000       4 rwx-- 0000000000000000 0fd:00000 libaio.so.1.0.1
001c3000      76 rwx-- 00000000001c3000 000:00000   [ anon ]
001e2000    1552 r-x-- 0000000000000000 0fd:00000 libnnz11.so
00366000     148 rwx-- 0000000000184000 0fd:00000 libnnz11.so
0038b000       4 rwx-- 000000000038b000 000:00000   [ anon ]
0038c000     468 r-x-- 0000000000000000 0fd:00000 libocr11.so
00401000       4 rwx-- 0000000000074000 0fd:00000 libocr11.so
...
48fc7000       8 rwx-- 0000000048fc7000 000:00000   [ anon ]
4922b000      28 r-x-- 0000000000000000 0fd:00000 librt-2.5.so
49232000       4 r-x-- 0000000000006000 0fd:00000 librt-2.5.so
49233000       4 rwx-- 0000000000007000 0fd:00000 librt-2.5.so
bfdd4000      96 rwx-- 00000000bfdd4000 000:00000   [ stack ]
...
38400000    4096 rwxs- 0000000000000000 000:00013 ora-aysun_491532_97
38800000    4096 rwxs- 0000000000000000 000:00013 ora-aysun_491532_98
38c00000    4096 rwxs- 0000000000000000 000:00013 ora-aysun_491532_99
39000000    4096 rwxs- 0000000000000000 000:00013 ora-aysun_491532_100
39400000    4096 rwxs- 0000000000000000 000:00013 ora-aysun_491532_101
bf801000    4096 rwxs- 00000000bf801000 000:00000   [ stack ]

mapped: 547504K    writeable/private: 5360K    shared: 417796K

Bellek kullanımı hakkında bilgiye ayrıca /proc dizininden de erişilebilir. İlgili proses için alt dizini bulup bu dizin içinden bakılabilir. Baktığımız smon prosesi için yapının listelenmiş hali aşağıda yer almaktadır.

# ls -l /proc/2944

total 0

dr-xr-xr-x 2 oracle oinstall 0 11 May 13:01 attr
-r-------- 1 oracle oinstall 0 11 May 13:01 auxv
-r--r--r-- 1 oracle oinstall 0 11 May 11:57 cmdline
-r--r--r-- 1 oracle oinstall 0 11 May 13:01 cpuset
lrwxrwxrwx 1 oracle oinstall 0 11 May 13:01 cwd ->/u01/app/oracle/product/11.1.0/db_1/dbs
-r-------- 1 oracle oinstall 0 11 May 13:01 environ
lrwxrwxrwx 1 oracle oinstall 0 11 May 13:01 exe ->/u01/app/oracle/product/11.1.0/db_1/bin/oracle
dr-x------ 2 oracle oinstall 0 11 May 13:01 fd
-rw-r--r-- 1 oracle oinstall 0 11 May 13:01 loginuid
-r-------- 1 oracle oinstall 0 11 May 11:54 maps
-rw------- 1 oracle oinstall 0 11 May 13:01 mem
-r--r--r-- 1 oracle oinstall 0 11 May 13:01 mounts
-r-------- 1 oracle oinstall 0 11 May 13:01 mountstats
-rw-r--r-- 1 oracle oinstall 0 11 May 13:01 oom_adj
-r--r--r-- 1 oracle oinstall 0 11 May 13:01 oom_score
lrwxrwxrwx 1 oracle oinstall 0 11 May 13:01 root -> /
-r--r--r-- 1 oracle oinstall 0 11 May 13:01 schedstat
-r-------- 1 oracle oinstall 0 11 May 13:01 smaps
-r--r--r-- 1 oracle oinstall 0 11 May 11:54 stat
-r--r--r-- 1 oracle oinstall 0 11 May 13:01 statm
-r--r--r-- 1 oracle oinstall 0 11 May 11:57 status
dr-xr-xr-x 3 oracle oinstall 0 11 May 13:01 task
-r--r--r-- 1 oracle oinstall 0 11 May 13:01 wchan

V$PROCESS  ve V$PROCESS_MEMORY görünümleri, pman aracı ve/veya  /proc dizini ile birlikte kullanılarak, bir Oracle prosesine atanan bellek tahsisi ve kullanımı en iyi şekilde izlenebilmektedir. Bir proses için o anda tahsis edilen normal belleği tespit etmek, gelecekte oluşabilecek muhtemel bellek problemlerinde performans kıyaslaması için yardımcı olacaktır.  Bu araçlar ile belirli aralıklarla bellek kullanımını izlemek ve o anki verilerini not etmekte fayda vardır. Bu şekilde gelecekte muhtemel bir problem olduğunda Oracle prosesleri bazında nerede aşırı bellek tüketimi olduğunu anlamak kolaylaşacak ve sorun tespitinde gereksiz zaman kaybının önüne geçilecektir. Ayrıca bellek sızıntıları(memory leaks) ve kontrolden çıkmış proseslerde kolayca tespit edilebilecektir. Bununda ötesinde, hem işletim sistemi katmanında hemde veritabanı katmanında  bir proses için o an bellek tüketimine bakıp, genel bellek tahsisi ile kıyaslama yapılabilmekte ve gelecekte yeni kullanıcıların veya yeni uygulamaların eklenmesi ile, sisteme ne kadar ilave bellek tahsisi gerekeceğini kestirmekte kolaylaşacaktır. pman hakkında daha detaylı bilgiye buradan erişebilirsiniz.

0 yorum:

Yorum Gönder