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