Oracle 9i itibariyle “kuyruğa ekleme (enqueue)” bekleme olayı parametrelerinin isimleri mod, ID1 ve ID2 dir. Oracle 10g itibariyle ise ilk parametre aynı kalmasına rağmen ikinci ve üçüncü parametreler temsil ettikleri kuyruğa ekleme işlemi için özel bilgileri vermektedir. Kuyruğa ekleme, bekleme olayına bağlı olarak yönetim, uygulama, konfigürasyon,uyumluluk ve diğer bekleme sınıfları altında toplanır. Kuyruğa ekleme bekleme olaylarının üstesiden gelirken aşağıdaki önemli noktaları göz önünde bulundurmanız gerekmektedir.
- Kuyruğa eklemeler, veritabanı nesnelerine uygulanan kilitlerdir.
- Kuyruğa eklemeler hareketlidir, uygulama tarafından başlatılır.
- Oracle oturumu belirli bir kuyruğa ekleme işlemi elde etmek için bekler. Kuyruğa ekleme ismi ve modu, P1 parametresi içinde kayıtlıdır. İlgili işlem için harekete geçme, rekabet olan kuyruk bekleme tipine bağlıdır.
- Oracle 10g itibariyle tüm kuyruğa eklemeler bağımsız bekleme olayı olarak listelenmektedir.
Kuyruğa ekleme, kullanıldığı ortama bağlı olarak değişik anlamlar taşır. Fiil olarak kullanıldığında, bir kuyruğa kilit yerleştirme hareketi olarak ifade edilir. Sıfat olarak kullanıldığında ise TX kuyruğa eklemesi gibi özel bir kilit olayını ifade eder.
Kuyruğa eklemeler, şema nesneleri, arkaplan görevleri ve redo mesaj dizileri(threads) gibi pekçok paylaşımlı kaynağa erişimi yöneten sofistike kilitleme mekanizmasıdır. Oracle, kuyruğa eklemeyi iki amaç için kullanmaktadır. Birincisi, kilit modları uyumlu olmadığında bir çok eşzamanlı oturumun aynı kaynağı paylaşmasını önlemek için kuyruğa eklemeler devreye girer. İkincisi, oturumların kilit modları uyumlu olduğunda aynı kaynağı paylaşmasına izin vermek için kullanılır. Bir oturum, bir nesnenin tümü veya bir kısmı için kilit talep ettiğinde ve talep edilen kilit modu başka bir oturum tarafından tutulan mod ile uyumlu olmadığında, talep eden oturum bu kilit isteğini kuyruğa sokar(yani kuyruğa ekleme) ve işlem sırasına göre hizmete girmesini bekler. Bu olay, “kuyruğa ekleme beklemesi” olarak adlandırılır. Kuyruğa ekleme beklemeleri tampon(buffer) beklemeleri dışındaki çeşitlli lokal kilitler için olan beklemelerdir.
Kuyruğa ekleme kaynağı nedir?
Kuyruğa ekleme kaynağı, kuyruğa ekleme kilidince etkilenen veritabanı kaynağıdır. Oracle, kuyruğa ekleme kaynaklarını X$KSQRS(kernel servisi kuyruğa ekleme kaynağı) veya V$RESOURCE görünümleri üzerinden görülebilen dahili dizin yapısını kullanarak yönetir.
select * from v$resource;
ADDR TY ID1 ID2
---------------- --- ------- -------
C000000047BE4D40 TX 4980825 115058
C00000003FEB4A58 TM 6112 0
C00000004262E758 WL 1 25603
C00000004AD99538 TX 327726 202076
C00000004A5C6CE8 TM 507 0
C00000003FB7C4F8 TX 5898241 23053
C00000004BB3A968 DX 28 0
. . .
Yukardaki sonuca göre kuyruğa ekleme kaynağı yapısı kilit tipi ve iki adet nümerik tanımlayıcadan oluşmaktadır. Kilit tipi, TX, TM, TS, MR, RT gibi iki karakterli kodla gösterilir.ID1 ve ID2 nümerik tanımlıyacıların kilit tipine bağlı olarak farklı anlamları vardır. Aşağıdaki tabloda bunlarla ilgili çeşitli örnekler vardır. Oracle 10g itibariyle, tüm kuyruğa eklemeler bağımsız bekleme olayları olduğundan, ID1 ve ID2 değerlerinin ne anlama geldiğini V$EVENT_NAME görünümü içindeki belirli bekleme olaylarının PARAMETER2 and PARAMETER3 değerlerinden bulunabilir.
*** Bu yazıda yer alan 3 tabloyu blogger'a kopyaladığımda yazıyı kaydetme aşamasında sorun yaşadım, bu sebeple 3 tablonun snapshotunu çekip resim formatında yazıya ekledim. Okunmasında zorluk yaşanıyorsa, resimlerin üzerine sağ tıklayıp "ayrı pencerede aç" seçeneği ile başka bir browser penceresinde orijinal büyüklüğünde açıp inceleyebilirsiniz ***
*** Bu yazıda yer alan 3 tabloyu blogger'a kopyaladığımda yazıyı kaydetme aşamasında sorun yaşadım, bu sebeple 3 tablonun snapshotunu çekip resim formatında yazıya ekledim. Okunmasında zorluk yaşanıyorsa, resimlerin üzerine sağ tıklayıp "ayrı pencerede aç" seçeneği ile başka bir browser penceresinde orijinal büyüklüğünde açıp inceleyebilirsiniz ***
Kilit yöneticisi tarafından aynı anda kilitlenebilecek maksimum sayıdaki kuyruğa ekleme kaynakları, ENQUEUE_RESOURCES parametresi tarafından kontrol edilmektedir. Varsayılan değer çoğu zaman yeterli olmaktadır, ancak uygulamanın paralel DML işlemlerini kullandığı zamanlarda bu değeri artırmak durumunda kalabilirsiniz. Paralel DML işlemleri seri DML işlemlerinden daha fazla kilit kullanmaktadır. Kuyruğa ekleme talep ederken başarısız olan prosesler, ORA-00052: "maximum number of enqueue resources exceeded" hata mesajını alacaktır. V$RESOURCE_LIMIT görünümü, mevcut kullanım ve ne kadar LIMIT_VALUE değeri üstünde yüksek highwater (MAX_UTILIZATION) oluşmaktadır gibi önemli kullanım bilgilerini vermektedir.
select *
from v$resource_limit
where resource_name in (’enqueue_resources’,’enqueue_locks’,
’dml_locks’,’processes’,’sessions’);
from v$resource_limit
where resource_name in (’enqueue_resources’,’enqueue_locks’,
’dml_locks’,’processes’,’sessions’);
RESOURCE_NAME CURRENT_UTIL MAX_UTIL INITIAL_AL LIMIT_VALU
------------- ------------ -------- ---------- -----------
processes 438 643 2000 2000
sessions 443 664 2205 2205
enqueue_locks 402 465 27101 27101
enqueue_resources 449 584 800 UNLIMITED
dml_locks 68 778 600 UNLIMITED
Kuyruğa ekleme kilidi nedir?
Kuyruğa ekleme kilidi başlı başına bir kilittir. Oracle, kuyruğa ekleme kilitlerini yönetmek için kuyruğa ekleme kaynaklarına nazaran ayrı dizinler kullanır. Bu yapı, aşağıdaki örnekteki gibi X$KSQEQ (kernel servisi kuyruğa ekleme nesnesi) görünümü veya V$ENQUEUE_LOCK görünümü üzerinden görülebilir. Bu yapının büyüklüğü _ENQUEUE_LOCKS parametresinden etkilenir. Bir önceki örnekte görüldüğü üzere, maksimum kullanımın bu limit değerine ne kadar yakın olduğu V$RESOURCE_LIMIT görünümü ile belirlenebilmektedir.
select *
from x$ksqeq
where bitand(kssobflg,1)!=0
and (ksqlkmod!=0 or ksqlkreq!=0);
from x$ksqeq
where bitand(kssobflg,1)!=0
and (ksqlkmod!=0 or ksqlkreq!=0);
veya,
select * from v$enqueue_lock;
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
---- -------- ---- ---- ---- --- ----- ------- ----- -----
243F8368 243F8378 2 MR 51 0 4 0 349520 0
243F831C 243F832C 2 MR 6 0 4 0 349520 0
243F82D0 243F82E0 2 MR 5 0 4 0 349520 0
243F8284 243F8294 2 MR 4 0 4 0 349520 0
243F8238 243F8248 2 MR 3 0 4 0 349520 0
243F81EC 243F81FC 2 MR 2 0 4 0 349520 0
243F81A0 243F81B0 2 MR 1 0 4 0 349520 0
243F80BC 243F80CC 3 RT 1 0 6 0 349521 0
243F7F8C 243F7F9C 4 XR 4 0 1 0 349524 0
243F8108 243F8118 5 TS 2 1 3 0 349519 0
243F7FD8 243F7FE8 9 TX 393241 875 0 6 2651 0
Kuyruğa ekleme kilit yapısı, oturum ID’si(SID), kilit tipi, veritabanı kaynağı(ID1 ve ID2 ile tanımlanan), kilit modu, istek modu, istek mod süresi(CTIME) ve blok bayrağı gibi bilgileri içermektedir. Bu yapı, istek sırasına göre bu kilit isteklerini yönetmek ve hizmete sunmak için kullanılır. Bu şu demektir; eğer bekleyenlerden birisi, belirli bir kilide ihtiyaç duyarsa ve bunun modu mevcut mod ile uyumlu ise ama bekleyen, kilit modu mevcut mod ile uyumlu olmayan başka bir bekleyenin gerisindeyse bu bekleyenin isteğine hizmet verilmez.
select *
from x$ktcxb
where KTCXBLKP in (select kaddr from v$lock where type = ’TX’);
from x$ktcxb
where KTCXBLKP in (select kaddr from v$lock where type = ’TX’);
Kuyruğa ekleme mimarisi
Kuyruğa ekleme mimarisi önbellek tampon mimarisi ile benzerlik göstermektedir. Ana parçaları, kuyruğa ekleme hash zincir mandalları(latches), kuyruğa ekleme hash tablosu, kuyruğa ekleme hash zincirleri ve kuyruğa ekleme kaynaklarıdır.
Alt kuyruğa ekleme hash zincir mandalları, kuyruğa ekleme hash tablosu ve hash zincirlerini korumaktadır. Varsayılan olarak alt kuyruğa ekleme hash zincir mandallarının sayısı CPU_COUNT ile eşittir. Bu sayı _ENQUEUE_HASH_CHAIN_LATCHES parametresi ile genişletilebilir.
Kuyruğa ekleme kaynakları, kaynak tipi ve tanımlayıcılarına bağlı olarak kuyruğa ekleme tablosu ile karıştırılır ve ilgili kuyruğa ekleme hash zincirine yerleştirilir. Kuyruğa ekleme hash tablosunun varsayılan uzunluğu SESSIONS parametresince sağlanır ve _ENQUEUE_HASH parametresince ayarlanır. Eğer ENQUEUE_HASH parametresi, varsayılan değerinden anlamlı olarak artırılma ihtiyacı hissederse, kuyruğa ekleme hash zincir mandallarının uyku oranına daha fazla dikkat edilmesi gerekmektedir. Bunun sebebi, kuyruğa ekleme hash tablo uzunluğunun ENQUEUE_RESOURCES parametresince değil, SESSIONS parametresince sağlanması sayesinde aynı kalmasıdır. Kuyruğa ekleme kaynakları ve küçük kuyruğa ekleme hash tabloları için yüksek talep birleşimi, yüksek hash çarpışma oranı ve potensiyel uzunlukta hash zincirleriyle sonuçlanır. Bu problem, kendini kuyruğa ekleme hash zincir mandalları için mandal çekişmeleri olarak tanımlanır. Bu durumda _ENQUEUE_HASH değerinin artırılması gerekmektedir.
kuyruğa ekleme hash tablo uzunluğu = ((SESSIONS – 10) * 2) + 55
Kuyruğa ekleme hash tablosu, kaynaklar ve kuyruklar hakkında daha fazla bilgi almak için aşağıdaki komutu kullanarak izleme dosyasına kuyruğa ekleme yapılarıı yığınlanır.
alter session set events ’immediate trace name enqueues level 3’;
Oracle, kuyruğa ekleme bekleme olayının P1 kolonu içine kuyruğa ekleme tipini ve modunu kodlar. Bu kodlama çözüldüğünde iki karakterli kuyruğa ekleme(kilit) tipi ve numerik mod numarası elde edilir. Kuyruğa ekleme tipi aşağıdaki sorgu ile deşifre edilir:
select sid, event, p1, p1raw,
chr(bitand(P1,-16777216)/16777215)||chr(bitand(P1,16711680)/65535) type, mod(P1, 16) "MODE"
from v$session_wait
where event = ‘enqueue’;
chr(bitand(P1,-16777216)/16777215)||chr(bitand(P1,16711680)/65535) type, mod(P1, 16) "MODE"
from v$session_wait
where event = ‘enqueue’;
SID EVENT P1 P1RAW TY MODE
---- ------- ---------- ---------------- --- -----
405 enqueue 1213661190 0000000048570006 HW 6
132 enqueue 1397817350 0000000053510006 SQ 6
43 enqueue 1413677062 0000000054430006 TC 6
44 enqueue 1415053316 0000000054580004 TX 4
40 enqueue 1415053318 0000000054580006 TX 6
. . .
Alternatif olarak kuyruğa ekleme tipi, kuyruğa ekleme bekleme olayının P1 RAW kolonundan elde edilebilir. Yukardaki örnekte P1RAW kolonu altındaki değerlerin baştaki sıfırlarını es geçip, son 4 bytes’a(yani son 8 numara) odaklanabiliriz. Yüksek öncelikli 2 bytes değeri kuyruğa ekleme tipini verir. Mesela; 54580006 örneğinde yüksek öncelikli 2 bytes değeri 0x5458Hex’dir. Şimdi, 54Hex 84 decimel ve 58Hex 88 decimeldir, böylece kuyruğa ekleme tipi aşağıdaki gibi elde edilebilir.
select chr(84) || chr(88) from dual;
CH
--
TX
--
TX
Prosesler altı moddan birisi içinde kuyruğa ekleme kilitlerini ister: Null (N), Row Share (RS), Row Exclusive (RX), Share (S), Share Row Exclusive (SRX), or Exclusive (X). Aşağıdaki tabloda görüldüğü üzere bu modlar, sıfırdan altıya kadar tekil nümerik digit ile temsil edilirler. Bu kilit modu, P1ROW kolonunun 2 byte’lık yüksek önceliği içinde deşifre olunur ve kolayca tanınır. Yukardaki 54580006 örneğini kullanarak, düşük öncelikli 2 bytes değeri 0006Hex’dir, böylece kilit modu 6’dır(exclusive). Alternatif olarak, kilit modu mod(P1,16) veya to_char(bitand(P1,65536)) fonksiyonu kullanarak P1 kolonundan deşifre olabilir.
Oracle, bir kaynağın birçok eş zamanlı proses tarafından paylaşılabildiğini belirlemek için kilit modunu kullanır. Altta uyum çizelgesi aşağıda yer almaktadır.
* Evet’in anlamı başka bir oturum tarafından tutulan hiç bir çakışan kilit olmadığında paylaşım mümkündür.
*** Bu yazıda yer alan 3 tabloyu blogger'a kopyaladığımda yazıyı kaydetme aşamasında sorun yaşadım, bu sebeple 3 tablonun snapshotunu çekip resim formatında yazıya ekledim. Okunmasında zorluk yaşanıyorsa, resimlerin üzerine sağ tıklayıp "ayrı pencerede aç" seçeneği ile başka bir browser penceresinde orijinal büyüklüğünde açıp inceleyebilirsiniz ***
*** Bu yazıda yer alan 3 tabloyu blogger'a kopyaladığımda yazıyı kaydetme aşamasında sorun yaşadım, bu sebeple 3 tablonun snapshotunu çekip resim formatında yazıya ekledim. Okunmasında zorluk yaşanıyorsa, resimlerin üzerine sağ tıklayıp "ayrı pencerede aç" seçeneği ile başka bir browser penceresinde orijinal büyüklüğünde açıp inceleyebilirsiniz ***
Kuyruğa eklemeler ile ilgili ikinci yazıda, kuyruğa ekleme bekleme olaylarının sebepleri, analiz yolları ve performans iyileştirme tekniklerine odaklanacağım.
0 yorum:
Yorum Gönder