Pages

13 Nisan 2011 Çarşamba

Oracle veritabanında kuyruğa ekleme(enqueue) olayları - Bölüm 1

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 nedir?
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 ***


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’);

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);

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        0   4     0        349520 0
243F80BC  243F80CC     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.

Eğer normal işlem(TX) ve DML kilitleri V$ENQUEUE_LOCKS görünümünde görülmüyorsa şaşırmayın. Bunlar, bir kuyruğa ekleme beklemesi olmadan X$KSQEQ yapısında yer almaz. Oracle, TX ve TM kuyruğa eklemelerini yönetmek için değişik yapılar kullanır. Bunlar  X$KTCXB (kernel işlem kontrol işlem nesnesi- V$TRANSACTION_ENQUEUE için temel görünüm) ve X$KTADM (kernel işlem erişim DML kilidi) dir. Aşağıdaki sorgularda bu girişler yer almaktadır. Bu yapılar TRANSACTIONS ve DML_LOCKS parametreleri tarafından boyutlandırılır. V$LOCK görünümü en iyisidir, çünkü tüm kilitleri gösterir.

select *
from   x$ktcxb
where  KTCXBLKP in (select kaddr from v$lock where type = ’TX’);

select *
from   x$ktadm
where  KSQLKADR in (select kaddr from v$lock where type = ’TM’);


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’;


Kuyruğa alma tipini ve modunu deşifre etmek
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’;

 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

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 ***

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