ASH (Active Session History)
aktif olan session bilgilerinin performans istatistiklerinin tutulduğu
rapordur. Mevcut session bilgileri v$session ve v$session_wait_history
eventlerinden gözlemlenebilir. Örneğin aşağıdaki sql veritabanında o an en
fazla gözlemlenen eventleri gösterir.
SELECT event, COUNT (*)
FROM
v$session_wait_history
GROUP BY event
ORDER BY 2 DESC
Ancak bu viewlar aktif
sessionlara ait performans bilgilerini gözlemlemek, sorun tespit etmek ve çözüm
geliştirmek için yeterli historic (geçmişe dönük) bilgiye sahip değildir.
Sessionlar hakkındaki historic performans dataları için ASH raporları
kullanılabilir. ASH aktif sessionlara ait saniyelik sample(örnek veri) elde
ederek istatistiksel yorum yapılabililinmesini sağlayan very koleksiyonudur. İşte bu yazımızda ASH raporlarını tanıtmaya
çalışacak, ASH raporları ile neler yapılır ve ASH raporları nasıl
yorumlanmalıdır anlatmaya çalışacağız.
Aktif Session Nedir?
ASH raporlarındaki aktif session
ile v$session.state ‘ACTIVE’ değeri karıştırılmamalıdır. ASH raporlarında çıkan
sessionlar Oracle RDBMS ‘e (Relational Database Management System) çağrı
yollayan sessionlardır. Bu sessionlar hakkında toplanan datalar;
·
Parse, Execute ve Fetch Operasyonları
·
I/O işleminin tamamlanması için meydana gelen
bekleme
·
Rac Sistemlerde remote instanceden mesaj yada
buffer beklemeleri
·
Cpu üzerindeki beklemeler
·
Tekrarlanan sesionlar için beklememe
·
Paralel işlemler
ASH Raporu Nasıl Elde Edilir?
Ash raporu Enterprise Manager
üzerinden yada $ORACLE_HOME/rdbms/admin/ashrpt.sql scripti ile elde edilebilir.
Tabi Ash raporlarını toad gibi third party tool’lar ile elde etmekte mümkündür.
ASH Verilerine Nasıl Ulaşılır?
Ash verilerine, yukarıdada
bahsettiğimiz gibi ash raporu oluşturarak, v$active_session_history wrh$_active_session_history
yada dba_hist_active_sess_history viewlarına sql sorgu ile ulaşılabilir.
Aşağaıdaki queryleri inceledikten sonra ASH raporu nasıl yorumlanır anlatmaya
çalışacağız.
Öncelikle
ASH viewlarındaki en çok kullanılan kolonların ne anlam ifade ettiğini
açıklayalım.
V$ACTIVE_SESSION_HISTORY;
Kolon
|
Veritipi
|
Açıklama
|
SAMPLE_ID
|
NUMBER
|
Sample id
|
SAMPLE_TIME
|
TIMESTAMP(3)
|
Sample alındığı zaman
|
SESSION_ID
|
NUMBER
|
V$SESSION.SID
|
SESSION_SERIAL#
|
NUMBER
|
V$SESSION.SERIAL#
|
SESSION_TYPE
|
VARCHAR2(10)
|
Session tipi:
|
USER_ID
|
NUMBER
|
Oracle user
identifier; maps to V$SESSION.USER#
|
SQL_ID
|
VARCHAR2(13)
|
Sample alındığı anda
session tarafından çaılıştırılan sql
|
SQL_CHILD_NUMBER
|
NUMBER
|
Sql child numarası
|
SQL_OPCODE
|
NUMBER
|
SQl cümle çalışırken
hangi operasyonda id? V$SESSION.COMMAND
|
SQL_PLAN_HASH_VALUE
|
NUMBER
|
SQl ‘ ait plan hash
değeri
|
QC_INSTANCE_ID
|
NUMBER
|
Paralel çalışan sqller
için hangi instanced çalıştığına dair bilgi. Eğer bu değer 0 ise tüm instance
ler anlamına gelir.
|
QC_SESSION_ID
|
NUMBER
|
Paralel çalışan sqller
için hangi instanced çalıştığına dair bilgi. Eğer bu değer 0 ise tüm instance
ler anlamına gelir.
|
QC_SESSION_SERIAL#
|
NUMBER
|
Paralel çalışan sqller
için session numarası. Eğer bu değer 0 ise tüm sessionlar anlamına gelir.
|
EVENT
|
VARCHAR2(64)
|
Eğer SESSION_STATE = WAITING, durumunda ise sessionun hangi event’I beklediğini
gösterir.
Eğer SESSION_STATE = ON CPU, ise bu kolon boş gelir.
|
P1TEXT
|
VARCHAR2(64)
|
Evente ait P1 değeri
text ifadesi.
|
P1
|
NUMBER
|
Evente ait P1 değeri
numeric ifade
|
P2TEXT
|
VARCHAR2(64)
|
Evente ait P2 değeri
text ifadesi.
|
P2
|
NUMBER
|
Evente ait P2 değeri
numeric ifade.
|
P3TEXT
|
VARCHAR2(64)
|
Evente ait P3 değeri
text ifadesi.
|
P3
|
NUMBER
|
Evente ait P3 değeri
numeric ifade.
|
WAIT_CLASS
|
VARCHAR2(64)
|
Beklenen event gurubu. V$SESSION.WAIT_CLASS.
|
WAIT_CLASS_ID
|
NUMBER
|
Beklenen event gurup
numarası V$SESSION.WAIT_CLASS_ID.
|
WAIT_TIME
|
NUMBER
|
Toplam Bekleme Zamanı.Eğer
CPU da bekleniyorsa 0 olarak gözükür. V$SESSION.WAIT_TIME.
|
SESSION_STATE
|
VARCHAR2(7)
|
Session durumu:
|
TIME_WAITED
|
NUMBER
|
Eğer SESSION_STATE = WAITING, durumunda ise eventi bekliyor demektir.
|
BLOCKING_SESSION_STATUS
|
VARCHAR2(11)
|
Bloke eden session
durumu:
|
BLOCKING_SESSION
|
NUMBER
|
Eğer session başka bir
session tarafında n tutuluyorsa ve tutan sessionda aynı instance üzerinde ise
bloke eden yani tutan session id sini verir. V$SESSION.BLOCKING_SESSION.
|
BLOCKING_SESSION_SERIAL#
|
NUMBER
|
Bloke eden session
serial number.
|
BLOCKING_INST_ID
|
NUMBER
|
Bloke eden session
instance numarası.
|
BLOCKING_HANGCHAIN_INFO
|
VARCHAR2(1)
|
Bloke eden session
hangmidir değilmidir bildirir. (Y) or not (N)
|
CURRENT_OBJ#
|
NUMBER
|
Eğer session waiting
durumunda ise hangi obje üzerinde
beklediğini gösterir. Ancak bu bazı event guruplar için var olan bir
değerdir.Örneğin uygulama yada I/O gibi guruplar. V$SESSION.ROW_WAIT_OBJ#.
|
CURRENT_FILE#
|
NUMBER
|
Eğer session waiting
durumunda ise hangi dosya üzerinde
beklediğini gösterir. Ancak bu bazı event guruplar için var olan bir
değerdir.Örneğin uygulama yada I/O gibi guruplar. V$SESSION.ROW_WAIT_FILE#.
|
CURRENT_BLOCK#
|
NUMBER
|
Eğer session waiting
durumunda ise hangi block üzerinde
beklediğini gösterir. Ancak bu bazı event guruplar için var olan bir
değerdir.Örneğin uygulama yada I/O gibi guruplar. V$SESSION.ROW_WAIT_BLOCK#.
|
CURRENT_ROW#
|
NUMBER
|
Eğer session waiting
durumunda ise hangi row üzerinde
beklediğini gösterir. Ancak bu bazı event guruplar için var olan bir
değerdir.Örneğin uygulama yada I/O gibi guruplar. V$SESSION.ROW_WAIT_ROW#.
|
CONSUMER_GROUP_ID
|
NUMBER
|
Consumer group
numarası
|
XID
|
RAW(8)
|
Sessiona ait Transaction
numarası
|
REMOTE_INSTANCE#
|
NUMBER
|
Session ‘ın beklediği blogun
hangi instance tarafından tutulduğunu gösterir.Bu kolon sadece cluster
eventler da geçerlidir.
|
TIME_MODEL
|
NUMBER
|
Time model bilgisi.
|
IN_PARSE
|
VARCHAR2(1)
|
Sample alındığında
session parse ediliyor? (Y) or not (N)
|
IN_HARD_PARSE
|
VARCHAR2(1)
|
Indicates whether the
session was hard parsing at the time of sampling (Y) or not (N)
|
IN_SQL_EXECUTION
|
VARCHAR2(1)
|
Sample alındığında
session harde parse ediliyor? (Y) or not (N)
|
IN_PLSQL_EXECUTION
|
VARCHAR2(1)
|
Session pl/sql mi
çalıştırıyor? (Y) or not (N)
|
IN_PLSQL_COMPILATION
|
VARCHAR2(1)
|
Session pl/sql compile
işlemimi yapıyor? (Y) or not (N)
|
IN_JAVA_EXECUTION
|
VARCHAR2(1)
|
Session javamı
çalıştırıyor? (Y) or not (N)
|
IN_BIND
|
VARCHAR2(1)
|
Session bid işlemimi
yapıyor? (Y) or not (N)
|
PROGRAM
|
VARCHAR2(48)
|
Sessiona ait işletim
sistemi program ismi
|
MODULE
|
VARCHAR2(48)
|
Sessiona’ a ait module
bilgisi DBMS_APPLICATION_INFO.SET_MODULE procedure
|
CLIENT_ID
|
VARCHAR2(64)
|
Client identifier of
the session; maps to V$SESSION.CLIENT_IDENTIFIER
|
MACHINE
|
VARCHAR2(64)
|
Client makina ismi
|
PORT
|
NUMBER
|
Client port numarası
|
PGA_ALLOCATED
|
NUMBER
|
Session tarafında
işgal edilen PGA alanı (bytes)
|
TEMP_SPACE_ALLOCATED
|
NUMBER
|
Session tarafında
işgal edilen TEMP alanı (bytes)
|
Aynı kolonlar
DBA_HIST_ACTIVE_SESS_HISTORY ve WRH$_ACTIVE_SESSION_HISTORY viewları içinde
kullanılabilir. Ancak v$active_session history de sadece active olan
sessionların bilgisi bulunur ve hersaniye snap alınır.Geçimişe yönelik bilgi
bulunmaz. WRH$_ACTIVE_SESSION_HISTORY ve DBA_HIST_ACTIVE_SESS_HISTORY viewları
ise 10 saniyede bir refresh edilir ve geçmişe yönelik bilgi tutabilirler. Bu
viewlar awr raporlarınında temeli niteliğindedir.
SELECT A.INST_ID,A.SAMPLE_ID,A.SAMPLE_TIME,(SELECT username FROM dba_users WHERE user_id = A.USER_ID) USERNAME,
A.SESSION_ID SID,A.SESSION_SERIAL# SERIAL#,s.status,
A.SQL_ID,A.SESSION_STATE,A.EVENT,A.TIME_WAITED,A.BLOCKING_SESSION,
A.BLOCKING_SESSION_STATUS,A.CURRENT_BLOCK#,A.CURRENT_FILE#,
D.OWNER Object_owner,D.OBJECT_NAME,D.OBJECT_TYPE
FROM GV$ACTIVE_SESSION_HISTORY a, dba_objects d,gv$session s
WHERE A.SESSION_TYPE = 'FOREGROUND' AND A.CURRENT_OBJ# = D.OBJECT_ID
and a.SESSION_ID=s.sid
-- and s.sid=100
--and s.status='ACTIVE'
--and username='ORCL'
--and
d.object_name='IDX_EMPLOYEE_PK'
--a.sql_id='7u6pfhkqnp641'
ORDER BY A.SAMPLE_TIME DESC
Bu sql aktif sessionların control
edilebilimesi için gayet iyidir ayrıca sid,USERNAME, sql id bazında ash
verilerine filtrede uygulanabilir. Aynı şekilde farklı versiyonunu da kullanmak
geçmişe dönük veriler istenirken faydalı olabilir.
SELECT A.SAMPLE_ID,A.SAMPLE_TIME,S.INST_ID,A.SESSION_ID SID,A.SESSION_SERIAL#,s.status,
(SELECT username FROM dba_users WHERE user_id = A.USER_ID) USERNAME, A.SQL_ID,A.XID,A.SESSION_STATE,A.EVENT,A.TIME_WAITED,A.BLOCKING_SESSION,
A.BLOCKING_SESSION_STATUS,A.CURRENT_BLOCK#,A.CURRENT_FILE#,
D.OWNER Object_owner,D.OBJECT_NAME,D.OBJECT_TYPE
FROM DBA_HIST_ACTIVE_SESS_HISTORY
a, dba_objects d,gv$session s
WHERE A.SESSION_TYPE = 'FOREGROUND' AND A.CURRENT_OBJ# = D.OBJECT_ID
and a.SESSION_ID=s.sid --and s.status='ACTIVE'
--and username='SSABATCH92'
--and
d.object_name='SEARCHSERVICES_SYNC_NSA'
--a.sql_id='7u6pfhkqnp641'
ORDER BY A.SAMPLE_TIME DESC
Bunlarla birlikte ash verilerine
istatistiksel olarak ulaşmakda mümkündür.aşağıdaki sqllere göz atabilirsiniz.
--Son 1 dakika içindeki en çok active
sqller
SELECT sql_id,
COUNT (*),
ROUND (COUNT (*) / SUM (COUNT (*)) OVER (), 2) pctload
FROM v$active_session_history
WHERE sample_time > SYSDATE - 1 / 24 / 60 AND session_type <> 'BACKGROUND'
GROUP BY sql_id
ORDER BY COUNT (*) DESC;
--Son 1 dakikaiçindeki en çok
active sqller
SELECT sql_id,
COUNT (*),
ROUND (COUNT (*) / SUM (COUNT (*)) OVER (), 2) pctload
FROM v$active_session_history
WHERE sample_time > SYSDATE - 1 / 24 / 60 AND session_type <> 'BACKGROUND'
GROUP BY sql_id
ORDER BY COUNT (*) DESC;
--Son 15 dakika içindeki en
önemli bekleme olaylarýnýn tespit edilmesi;
select event,
sum(wait_time + time_waited) total_wait_time
from v$active_session_history
where sample_time between (sysdate - (30/2880)) and sysdate
group by event order by total_wait_time desc;
--Son 15 dakika içinde hangi
kullanýcýlarýn en çok bekleme olayýna sebebiyet verdiðinini tespit edilmesi;
select s.sid, s.username,
sum(a.wait_time + a.time_waited) total_wait_time
from v$active_session_history a,
v$session s
where a.sample_time between sysdate - 30/2880 and sysdate
and a.session_id=s.sid
group by s.sid, s.username
order by total_wait_time desc;
--Son 15 dakika içinde en
fazla bekleme olayýna sebebiyet veren SQL komutlarýnýn tespit edilmesi;
select a.user_id,u.username,s.sql_text,
sum(a.wait_time + a.time_waited) total_wait_time
from v$active_session_history a,
v$sqlarea s, dba_users u
where a.sample_time between sysdate - 30/2880 and sysdate
and a.sql_id = s.sql_id
and a.user_id = u.user_id
group by a.user_id,s.sql_text, u.username;
--Hem cpu, hem IO hemde
beklemeleri sql id bazýnda veriyor.
select
ash.SQL_ID ,
sum(decode(ash.session_state,'ON CPU',1,0)) "CPU",
sum(decode(ash.session_state,'WAITING',1,0)) -
sum(decode(ash.session_state,'WAITING', decode(en.wait_class, 'User I/O',1,0),0)) "WAIT" ,
sum(decode(ash.session_state,'WAITING', decode(en.wait_class, 'User I/O',1,0),0)) "IO" ,
sum(decode(ash.session_state,'ON CPU',1,1)) "TOTAL"
from v$active_session_history ash,
v$event_name
en
where SQL_ID is not NULL and en.event#=ash.event#
group by sql_id
order by sum(decode(session_state,'ON CPU',1,1))
Şimdi bir Ash raporunda bakılması
öncelikle bölümler nerelerdir ve
performans tuning açısından bir ash raporu inceleyelim.Şekil 1 de ash raporunun
yapısı şematize edilmiştir.
![]() |
Şekil 1 : Ash Rapor yapısı |
![]() |
Şekil 2 : Ash Rapor Görünümü |
Şekil 2 de örnek bir ash rapor
bulunmaktadır. Linkler deki kısımlar ise ash raporda bulunabileecek bilgileri
içeririr. Şimdi bu kısımlarda ne şekilde bilgiler bulunur inceleyelim.
Top Events: Sesionlara ait en fazla bekleme olaylarını raporlar.Kullanıcı
eventleri , background eventler ve eventlere ait parametre değerleri bu bölümde
incelenebilir. Raporda ki en önemli ksısım denebilir.Eğer bu kısımda
beklenmedik bir wait event 1. Yada 2. Sırada görüntüleniyorsa tuning işlemine
bu wait event ten başlanması en doğru yöntemdir.
Load Profile: Session bazında yük dağılımını ulabileceğiniz
kısımdır.Bu kısımda Servis bazında veya sql tipi olarak en fazla yükse sebep
olan işlemleri gözlemleyebilir ve tuning işlemi için başlangıç noktası
belirleyebilirsiniz.
Top Sql, PL/SQL, Object,FileSession:En fazla yüse sahip sql PL/SQL
vs. işlemleri yada sessionları gözlemleyebileceğimiz kısımlardır.Örneğin top
session2s kısımında activity % değeri en yüksek olan session db ye en fazla yük
oluşturan yada db yi en fazla meşgul eden session dır denebilir. Aynı kıısmda
bu sessiona ait event bölümü nden ipucu alınarak bu session tune
edilebilir.Mesela bu kısımda faza activity gösteren session buffer busy wait
event ile karşımıza çıkıyorsa bu durumda bu session memoriden diske yazarken
dirty buffer bekliyor demektir.Böylece tune ederken ğere specific objeler bu
event e takılıyorsa obje parametreleri ile tuning yapılabilir.Yada Buffer cache
advisor ile memory durumu sorgulanabilir. Daha detaylı çözüm yöntemleri için buffer
busy wait event nedir ve nasıl tune edilir? adlı yazımıza göz
atabilirsiniz.
Activity Over Time:Ash raporu alınan zaman dilimi için belli
periyotlarda en fazla karşılaşılan 3 adet bekleme olayı hakkında bilgi sunulur.
Activity over time kısmında toplam ash zaman aralığı 10 eşit periyoda bölünür.Bu
periyotlarda slot count ve event count kısımları önemlidir.Slot count active
session sayısı ile lişkilidir. Event count ise eventin gözülme sıklığını
gözterir.Bu değerlerdeki ani yükselişler performans probleminin temel sebebi
olarak bilinir.
Bir sonraki performans
Troubleshooting yazımız ADDM reports da görüşmek üzere.Ayırdığınız vakit
karşılığında okuduklarınızın faydalı olmasını dileriz.
Özcan YILDIRIM
0 YORUM:
Yorum Gönder
"Sorularınız ve Eleştirileriniz Değerlidir"