Sequence Row cache lock incelemesi

Row cache lock inceleme:

Sistemde bir sequence den yapılan selectlerin çok uzun sürmeye başladığını gözlemledik. Bunun birden fazla nedeni olabilir.

 

Problem yaşadığımız sequence nocache bir sequence, cache miktarını arttırmanın problemimizi çözüp çözmeyeceğini incelemek  ve kök nedeni bulmak için aşağıdaki adımları gerçekleştirdim.

Öncelikle aşağıdaki sorgu ile shared pool boyutunun yeterli olup olmadığı incelenir.

select parameter ,
getmisses "MISS",
gets "READ",
100 - (100 * (sum(getmisses)/sum(gets))) "% Success"
from v$rowcache
where gets > 0 and
parameter = 'dc_sequences'
group by
parameter, getmisses , gets
order by 4 desc;

 

sorgu sonucunda miss oranımızın çok düşük olduğunu görüyoruz bu da bize shared pool size değerimizin yeterli olduğu fikrini veriyor.


Bundan sonra sequence’i cache leme işlemini deneyeceğiz.

Örnek sequence ve tablo oluşturdum.

CREATE TABLE TAHSINC.TEST_TABLE ( ID NUMBER(38));

CREATE SEQUENCE TAHSINC.TEST_SEQUENCE
 START WITH 1
 MAXVALUE 9999999999999999999999999999
 MINVALUE 1
 NOCYCLE
 NOCACHE
 NOORDER
/

Tabloyu doldurmak için. Aşağıdaki gibi bir loop yazıyoruz. Tek bir session açarak aşağıdaki sorguyu çalıştırıyoruz.

 

set lines 10000;
set pages 10000;
set timing on;

ALTER SESSION SET TRACEFILE_IDENTIFIER = "SEQUENCE_TEST_SESSION";

ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';

begin
for i in 1..1000000 loop
insert into TAHSINC.TEST_TABLE (ID) values (TAHSINC.TEST_SEQUENCE.nextval);
end loop;
commit;
end;
/

ALTER SESSION SET EVENTS '10046 trace name context off';

1.000.000 adet insert işlemimiz 5 dakika sürüyor.

Diagnostic destten trace dosyamızı buluyoruz. Set ettiğimiz trace identifier ile dosyayı kolayca buluyoruz

cd /u01/app/oracle/diag/rdbms/testdb/testdb2/trace/

trace dosyamızın ismi testdb2_ora_387821_SEQUENCE_TEST_SESSION.trc

Trace dosyamızı okunabilir hale getirmek için tkprof tool’unu kullanıyoruz.

tkprof testdb2_ora_387821_SEQUENCE_TEST_SESSION.trc translated.txt explain=tahsinc/your_password  table=sys.plan_table sys=no waits=yes

 

tkprof dosyasının içeriğine baktığımızda tek session üzerinden yapılan insert işlemlerinde bir row cache lock waiti olmadığını görüyoruz.

Bunun ardından üç ayrı sessiondan insert işlemini simultane olarak çalıştırmayı deniyoruz.

Sessionlardan sadece birini yine aşağıdaki gibi traceliyoruz.

lines 10000;
set pages 10000;
set timing on;

ALTER SESSION SET TRACEFILE_IDENTIFIER = "SEQUENCE_TEST_SESSION2";

ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';

begin
for i in 1..1000000 loop
insert into TAHSINC.TEST_TABLE (ID) values (TAHSINC.TEST_SEQUENCE.nextval);
end loop;
commit;
end;
/

ALTER SESSION SET EVENTS '10046 trace name context off';

3 session olarak çalıştırdığımızda. Bir session ortalama 13 dakikada tamamlanıyor.

Yeni oluşan trace dosyamızı tkprof ile okunabilir hale getiriyoruz.

tkprof testdb2_ora_387821_SEQUENCE_TEST_SESSION2.trc translated.txt explain=tahsinc/your_password  table=sys.plan_table sys=no waits=yes

bir önceki denememizden farklı olarak işlem yoğunluğunun row cache lock üzerinde oluştuğunu görüyoruz. 6 dakikanun üzerinde beklemeye neden oluyor.


Şimdi aynı işlemi sequence cache miktarını arttırdıktan sonra deniyoruz.

Alter sequence TAHSINC.TEST_SEQUENCE cache 1000;

 

set lines 10000;
set pages 10000;
set timing on;

ALTER SESSION SET TRACEFILE_IDENTIFIER = "SEQUENCE_TEST_SESSION3";

ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';

begin
for i in 1..1000000 loop
insert into TAHSINC.TEST_TABLE (ID) values (TAHSINC.TEST_SEQUENCE.nextval);
end loop;
commit;
end;
/

ALTER SESSION SET EVENTS '10046 trace name context off';

 

Cache miktarını 1000 olarak arttırdığımızda 1 dakika 20 saniyede işlem tamamlanıyor.

Trace dosyasını incelediğimizde. Cache miktarını arttırmamız 3 simultane bir milyonluk insert işlemindeki 380 saniyelik wait’ i 7 saniyeye düşürüyor.

 

Sonuç olarak düşük cache li ya da cache siz sequencelerinizde row cache lock wait görüyorsanız. Ve shared pool boyutunuz yeterliyse. sequence e cache ekleme ya da cache arttırma işlemi yapmanız performansınızı arttıracaktır.

 

Iperf kurulumu ve kullanımı, network performans analizi

Enterprise linux 6 için aşağıdaki rpm indirilerek test yapılacak sunuculara atılır. (Production sunucularımızda internete çıkış olmadığından manuel download edip sunucuya atıyoruz.)

http://rpm.pbone.net/index.php3/stat/4/idpl/25444783/dir/redhat_el_6/com/iperf-2.0.5-11.el6.x86_64.rpm.html

 

rpm -i rpm -i iperf-2.0.5-11.el6.x86_64.rpm

komutu ile rpm kurulur.

hedef tarafta aşağıdaki komut ile dinleme başlatılır.

iperf -s

[root@hedef tahsinc]# iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------

 

kaynak tarafta aşağıdaki komut çalışarak test isteği gönderilir.

iperf -c hedef ip -i 1

-i 1  parametresi ile 1 saniyelik aralıklarla gözleyebiliriz.
-t 60parametresi  ile 1 dakikada ne kadar transfer yaptığını gözleyebiliriz.

[root@kaynak tahsinc]# iperf -c hedef_ip -i 1
------------------------------------------------------------
Client connecting to hedef_ip, TCP port 5001
TCP window size: 16.0 KByte (default)
------------------------------------------------------------
[ 3] local xxx.xxx.xxx.xxx port 38481 connected with xxx.xxx.xxx.xxx port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 1.0 sec 16.0 MBytes 134 Mbits/sec
[ 3] 1.0- 2.0 sec 31.2 MBytes 262 Mbits/sec
[ 3] 2.0- 3.0 sec 30.4 MBytes 255 Mbits/sec
[ 3] 3.0- 4.0 sec 27.5 MBytes 231 Mbits/sec
[ 3] 4.0- 5.0 sec 30.4 MBytes 255 Mbits/sec
[ 3] 5.0- 6.0 sec 30.2 MBytes 254 Mbits/sec
[ 3] 6.0- 7.0 sec 30.2 MBytes 254 Mbits/sec
[ 3] 7.0- 8.0 sec 29.4 MBytes 246 Mbits/sec
[ 3] 8.0- 9.0 sec 28.5 MBytes 239 Mbits/sec
[ 3] 9.0-10.0 sec 30.0 MBytes 252 Mbits/sec
[ 3] 0.0-10.0 sec 284 MBytes 238 Mbits/sec
[root@kaynak tahsinc]#

Hedef taraftaki session’ı tekrar kontrol ettiğimizde aşağıdaki örnekte görüldüğü gibi gelen requestleri görebiliyoruz.

[root@hedef tahsinc]# iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[ 4] local xxx.xxx.xxx.xxx port 5001 connected with xxx.xxx.xxx.xxx port 38481
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-10.0 sec 284 MBytes 238 Mbits/sec

– P parametresi ile paralel çalıştırılabilir. Bunun için hedef tarafta da proses -P parametresi ile başlatılmalıdır.

Dataguard  veri iletiminin yavaşladığını düşünüyorsanız bu tool ile network performansınızı test edebilirsiniz.