Oracle 12c – Multi threaded Model

Linux ve Unix tabanlı işletim sistemleri process based tabanlı çalışan işletim sistemleridir. Process based tabanlı işletim sistemlerinde her bir iş için işletim sistemi tarafında bir process create edilir. Şimdiye kadar da bu yapıyı oracle’ ın tüm sürümlerinde bu şekilde kullandık. Bu yapıyı kullanıyor olmanın bir takım avantajları ve dezavantajları bulıunmaktadır. Örneğin oracle tarafında processlerin sayısı artmaya başladığı zaman, (database de her bir processe karşılık gelen bir OS procesesi olacağından dolayı) prosess sayılarının çokluğundan dolayı performans problemleri ile karşılaşma ihtimalimide artmaktadır. Defaultta oracle 12c ile de aynı yapı ile geliyor. Ancak burada istersek bir parametre değişikliği ile process based tabanlı yapıdan thread based tabanlı yapıya geçebiliriz. Multithred yapı ile anlatılmak istenen her bir process aslında bir thread altında çalışıyor. Buda OS tarafında kaynakların daha verimli kullanılmasını sağlıyor.

Process based yapıda normalde oracle processlerinin nasıl izlendiğine ve kaç adet olduğuna bakalım ;

[oracle@Redhat70 admin]$ ps -ef|grep -v grep|grep ora_ ; ps -ef|grep -v grep|grep ora_ | wc -l
oracle 25240 1 0 23:26 ? 00:00:00 /u01/sq/ora_3/oracle/db/12.1.0.2/bin/tnslsnr listener_12c -inherit
oracle 25908 1 0 23:35 ? 00:00:00 ora_pmon_t1
oracle 25912 1 0 23:35 ? 00:00:00 ora_psp0_t1
oracle 25916 1 1 23:35 ? 00:00:00 ora_vktm_t1
oracle 25922 1 0 23:35 ? 00:00:00 ora_gen0_t1
oracle 25926 1 0 23:35 ? 00:00:00 ora_mman_t1
oracle 25934 1 0 23:35 ? 00:00:00 ora_diag_t1
oracle 25938 1 0 23:35 ? 00:00:00 ora_dbrm_t1
oracle 25942 1 0 23:35 ? 00:00:00 ora_vkrm_t1
oracle 25946 1 0 23:35 ? 00:00:00 ora_dia0_t1
oracle 25950 1 0 23:35 ? 00:00:00 ora_dbw0_t1
oracle 25954 1 0 23:35 ? 00:00:00 ora_dbw1_t1

oracle 25958 1 0 23:35 ? 00:00:00 ora_dbw2_t1
oracle 25962 1 0 23:35 ? 00:00:00 ora_dbw3_t1
oracle 25966 1 0 23:35 ? 00:00:00 ora_lgwr_t1
oracle 25970 1 0 23:35 ? 00:00:00 ora_ckpt_t1
oracle 25974 1 0 23:35 ? 00:00:00 ora_lg00_t1
oracle 25978 1 0 23:35 ? 00:00:00 ora_smon_t1
oracle 25982 1 0 23:35 ? 00:00:00 ora_lg01_t1
oracle 25986 1 0 23:35 ? 00:00:00 ora_reco_t1
oracle 25990 1 0 23:35 ? 00:00:00 ora_lreg_t1
oracle 25994 1 0 23:35 ? 00:00:00 ora_pxmn_t1
oracle 25998 1 1 23:35 ? 00:00:00 ora_mmon_t1
oracle 26002 1 0 23:35 ? 00:00:00 ora_mmnl_t1
oracle 26006 1 0 23:35 ? 00:00:00 ora_d000_t1
oracle 26010 1 0 23:35 ? 00:00:00 ora_s000_t1
oracle 26042 1 0 23:35 ? 00:00:00 ora_tmon_t1
oracle 26046 1 0 23:35 ? 00:00:00 ora_arc0_t1
oracle 26050 1 0 23:35 ? 00:00:00 ora_arc1_t1
oracle 26054 1 0 23:35 ? 00:00:00 ora_arc2_t1
oracle 26058 1 0 23:35 ? 00:00:00 ora_tt00_t1
oracle 26062 1 0 23:35 ? 00:00:00 ora_arc3_t1
oracle 26066 1 0 23:35 ? 00:00:00 ora_arc4_t1
oracle 26070 1 0 23:35 ? 00:00:00 ora_arc5_t1
oracle 26074 1 0 23:35 ? 00:00:00 ora_arc6_t1
oracle 26079 1 0 23:35 ? 00:00:00 ora_arc7_t1
oracle 26083 1 0 23:35 ? 00:00:00 ora_arc8_t1
oracle 26087 1 0 23:35 ? 00:00:00 ora_arc9_t1
oracle 26091 1 0 23:35 ? 00:00:00 ora_arca_t1
oracle 26095 1 0 23:35 ? 00:00:00 ora_arcb_t1
oracle 26099 1 0 23:35 ? 00:00:00 ora_arcc_t1
oracle 26103 1 0 23:35 ? 00:00:00 ora_arcd_t1
oracle 26107 1 0 23:35 ? 00:00:00 ora_smco_t1
oracle 26111 1 0 23:35 ? 00:00:00 ora_arce_t1
oracle 26115 1 0 23:35 ? 00:00:00 ora_w000_t1
oracle 26119 1 0 23:35 ? 00:00:00 ora_arcf_t1
oracle 26123 1 0 23:35 ? 00:00:00 ora_w001_t1
oracle 26127 1 0 23:35 ? 00:00:00 ora_arcg_t1
oracle 26131 1 0 23:35 ? 00:00:00 ora_arch_t1
oracle 26135 1 0 23:35 ? 00:00:00 ora_arci_t1
oracle 26139 1 0 23:35 ? 00:00:00 ora_arcj_t1
oracle 26144 1 0 23:35 ? 00:00:00 ora_imco_t1
oracle 26148 1 0 23:35 ? 00:00:00 ora_aqpc_t1
oracle 26156 1 0 23:35 ? 00:00:00 ora_p000_t1
oracle 26160 1 0 23:35 ? 00:00:00 ora_p001_t1
oracle 26164 1 0 23:35 ? 00:00:00 ora_p002_t1
oracle 26168 1 0 23:35 ? 00:00:00 ora_p003_t1
oracle 26172 1 0 23:35 ? 00:00:00 ora_p004_t1
oracle 26176 1 0 23:35 ? 00:00:00 ora_p005_t1
oracle 26180 1 0 23:35 ? 00:00:00 ora_p006_t1
oracle 26184 1 0 23:35 ? 00:00:00 ora_p007_t1
oracle 26188 1 0 23:35 ? 00:00:00 ora_p008_t1
oracle 26192 1 0 23:35 ? 00:00:00 ora_p009_t1
oracle 26196 1 0 23:35 ? 00:00:00 ora_p00a_t1
oracle 26200 1 0 23:35 ? 00:00:00 ora_p00b_t1
oracle 26204 1 0 23:35 ? 00:00:00 ora_p00c_t1
oracle 26208 1 0 23:35 ? 00:00:00 ora_p00d_t1
oracle 26212 1 0 23:35 ? 00:00:00 ora_p00e_t1
oracle 26216 1 0 23:35 ? 00:00:00 ora_p00f_t1
oracle 26220 1 0 23:35 ? 00:00:00 ora_cjq0_t1
oracle 26403 1 0 23:35 ? 00:00:00 ora_p00g_t1
oracle 26407 1 0 23:35 ? 00:00:00 ora_p00h_t1
oracle 26411 1 0 23:35 ? 00:00:00 ora_p00i_t1
oracle 26415 1 0 23:35 ? 00:00:00 ora_p00j_t1
oracle 26443 1 0 23:35 ? 00:00:00 ora_qm02_t1
oracle 26447 1 0 23:35 ? 00:00:00 ora_qm03_t1
oracle 26451 1 0 23:35 ? 00:00:00 ora_q002_t1
oracle 26455 1 0 23:35 ? 00:00:00 ora_q003_t1
78

Database’ den çalışan processlerin type’larına baktığımızda da ;

===> select distinct (execution_type), count(*) from v$process group by execution_type

EXECUTION_TYPE COUNT(*)
————– ———-
PROCESS 78
NONE 1

2 rows selected.

Benzer bir sonucu görebiliyoruz. Yani db de ne kadar task varsa o kadar OS tarafında da processesimiz var. Şimdi thread based yapıya nasıl geçeceğimize ve geçtikden sonra yaşanacak olan değişikliğe bakalım. Aslında thread based yapıya geçmek için sadece bir parametreyi değiştirmemiz yeterli olacaktır. Değişiklik sonrasında hayatımızda bir takım değişikliklerde meydana gelecek ve rutin komutlarımızdan bazılarının hata vermeye başladığını gözlemliyor olacağız. Parametreyi set ederek başlayalım ;

Bu değişiklik için alter edeceğimiz parametremizin adı THREADED_EXECUTION parametresidir. Bu parametrenin şu anki değerini sorgulayalım ;

SQL> sho parameter thread

NAME TYPE VALUE
———————————— ———– ——————————
parallel_threads_per_cpu integer 2
thread integer 0
threaded_execution boolean FALSE

False durumda bu parametreyi TRUE olarak değiştirdikden sonra database’ imizi restart etmemiz ve sonrasında da listener dosyasına eklememiz gereken bir satır olacak ;

SQL> alter system set threaded_execution=TRUE scope=spfile ;
System altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ERROR:
ORA-01017: invalid username/password; logon denied

ORA-01017: invalid username/password; logon denied
SQL>

Bize garip gelecek bazı hatalar alacağımızı söylemiştik. Öncelikle thread based yapıya geçişle birlikte artık sys ile database’ e login olma yapımız da değişmiş oldu. Sqlplus / as sysdba ile yine bağlanmaya çalışsakda sonrasında sys şifresini mutlaka girmemiz gerekecektir.

SQL> startup
ORACLE instance started.

Total System Global Area 5771362304 bytes
Fixed Size 2936864 bytes
Variable Size 989859808 bytes
Database Buffers 3690987520 bytes
Redo Buffers 13836288 bytes
In-Memory Area 1073741824 bytes
Database mounted.
Database opened.
SQL>

Son olarak listener.ora dosyasına DEDICATED_THROUGH_BROKER_(listener_name)=ON satırını ekliyoruz.

[oracle@Redhat70 admin]$ vi listener.ora
# listener.ora Network Configuration File: /u01/sq/ora_3/oracle/db/12.1.0.2/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER_12C =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = Redhat70)(PORT = 2222))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC2222))
)
)

DEDICATED_THROUGH_BROKER_LISTENER_12C=ON

Şimdi operating sistem tarafında processlerin nasıl gözüktüğüne bakalım ;

[oracle@Redhat70 ~]$ ps -ef|grep -v grep|grep ora_ ; ps -ef|grep -v grep|grep ora_ | wc -l
oracle 25240 1 0 Sep29 ? 00:00:00 /u01/sq/ora_3/oracle/db/12.1.0.2/bin/tnslsnr listener_12c -inherit
oracle 27123 1 0 Sep29 ? 00:00:02 ora_pmon_t1
oracle 27127 1 0 Sep29 ? 00:00:05 ora_psp0_t1
oracle 27132 1 1 Sep29 ? 00:07:47 ora_vktm_t1
oracle 27138 1 0 Sep29 ? 00:00:31 ora_u004_t1
oracle 27152 1 0 Sep29 ? 00:03:11 ora_u005_t1
oracle 27169 1 0 Sep29 ? 00:00:01 ora_dbw0_t1
oracle 27173 1 0 Sep29 ? 00:00:01 ora_dbw1_t1
oracle 27177 1 0 Sep29 ? 00:00:01 ora_dbw2_t1
oracle 27181 1 0 Sep29 ? 00:00:01 ora_dbw3_t1
10

Daha önce 78 tane olan OS process sayısı 10’ a indi. (Daha önceden tanıdık olduğumuz Pmon ve Dbwn processleri hala single thread (process based) çalışmaya devam ediyorlar ancak Lgwr ve Smon gibi processler multithread olarak çalışıyorlar.)

Peki database’deki process sayıları ne durumda ;

SQL> select distinct (execution_type), count(*) from v$process group by execution_type;

EXECUTION_ COUNT(*)
———- ———-
PROCESS 7
NONE 1
THREAD 76
SQL>

Database’ de çalışan processlerde bir değişiklik yok hala 80’ nin üzerinde çalışan process var. Biraz daha inceleyelim ve kafamızdaki bazı sorulara cevap bulmaya çalışalım ;

Multithread yapıda OS tarafındaki processleri select ettiğimiz de “ora_u004_t1” u ile başlayan bazı processler geldiğini göreceksiniz. Bunlar daha önceden yoktu. Burada U ile başlayan processler database tarafında şu anda multithread olarak çalışan processleri göstermektedir. Yine bir örnek üzerinden giderek database’ de multuthread olarak çalışan bir processesin SO tarafındaki processesini nasıl bulabileceğimize bakalım ;

Kendi sessionıma ait spid değerini alalım;

SQL> select p.spid from v$process p, v$session s where p.addr=s.paddr and s.sid in(select sys_context(‘userenv’,’sid’) from dual) ;

SPID
————————
27152

Bu process id’ sini OS tarafında sorgulayalım ;

[oracle@Redhat70 ~]$ ps -ef | grep -v grep | grep 27152
oracle 27152 1 1 Sep29 ? 00:12:38 ora_u005_t1

“U” ile başlayan processlerin oracle tarafındaki processlerin OS tarafındaki multithread process id’sini yansıttığını belirtmiştik.

Aşağıdaki sorgu yardımı ile hangi multithread altında hangi oracle processleri çalışıyor bunu görebiliriz ama bu bize eskidenyapmış olduğumuz gibi kill -9 komutu ile OS tarafından processesi kill edebilmemizi sağlayacak bir bilgi de vermez. Çünkü artık db’ deki bir processese karşılık gelen bir OS processesi yok.

SQL> column Process_ID format A11
SQL> column Thread_ID format A11
SQL> column Process_Name format A13
SQL> column Process_Type format A13
SQL> select SPID as Process_ID , STID as Thread_ID, PNAME as Process_Name, EXECUTION_TYPE as Process_Type
2 from v$process
3 order by 4,1,2;

PROCESS_ID THREAD_ID PROCESS_NAME PROCESS_TYPE
———– ———– ————- ————-
NONE
27123 27123 PMON PROCESS
27127 27127 PSP0 PROCESS
27132 27132 VKTM PROCESS
27169 27169 DBW0 PROCESS
27173 27173 DBW1 PROCESS
27177 27177 DBW2 PROCESS
27181 27181 DBW3 PROCESS
27138 27138 SCMN THREAD
27138 27142 GEN0 THREAD
27138 27145 MMAN THREAD
27138 27159 DBRM THREAD
27138 27184 LGWR THREAD
27138 27187 CKPT THREAD
27138 27190 LG00 THREAD
27138 27193 SMON THREAD
27138 27196 LG01 THREAD
27138 27202 LREG THREAD
27152 19394 W002 THREAD
27152 27152 SCMN THREAD
27152 27156 DIAG THREAD
27152 27162 VKRM THREAD
27152 27165 DIA0 THREAD
27152 27199 RECO THREAD
27152 27205 PXMN THREAD
27152 27208 MMON THREAD
27152 27211 MMNL THREAD
27152 27214 D000 THREAD
27152 27217 S000 THREAD
27152 27220 N000 THREAD
27152 27243 TMON THREAD
27152 27246 ARC0 THREAD
27152 27249 ARC1 THREAD
27152 27252 ARC2 THREAD
27152 27255 ARC3 THREAD
27152 27258 ARC4 THREAD

27152 27280 ARCA THREAD
27152 27283 ARCB THREAD
27152 27286 ARCC THREAD
27152 27289 ARCD THREAD
27152 27292 ARCE THREAD
27152 27295 ARCF THREAD
27152 27298 ARCG THREAD
27152 27301 ARCH THREAD
27152 27304 ARCI THREAD
27152 27307 ARCJ THREAD
27152 27310 SMCO THREAD
27152 27319 IMCO THREAD
27152 27322 AQPC THREAD
27152 27328 P000 THREAD
27152 27331 P001 THREAD

27152 27343 P005 THREAD
27152 27346 P006 THREAD

27152 31267 W003 THREAD
27152 31552 W000 THREAD
27152 3170 W004 THREAD
27152 3454 W005 THREAD
27152 5754 THREAD
..
27152 9608 THREAD

85 rows selected.

Çalışan sorguyu kill etmek isterseniz sessionı bulmak için aşağıdaki sorguyu kullanabilirsiniz;

COLUMN username FORMAT A15
COLUMN osuser FORMAT A15
column Sess_Process_ID format A16
column Sess_Process_ID format A16
column Process_Name format A13
column Process_Type format A13

SELECT s.username,
s.osuser,
s.sid,
s.serial#,
SPID as Sess_Process_ID,
STID as Sess_Thread_ID,
PNAME as Process_Name,
EXECUTION_TYPE as Process_Type
FROM v$session s,
v$process p
WHERE s.paddr = p.addr
AND s.username IS NOT NULL
ORDER BY s.username, s.osuser;

Şimdi OS tarafındaki processleri select ettiğimizde gelen diğer processlerin ne olduğunu hatırlayalım;

Pmon = Process monitor
Psp0 = Process spawner
Vktm = Virtual keeper of time
Dbwo = Database Writer

Processlerini ifade etmektedir.

Son olarak (aslında bence tüm yazının en önemli noktasıda burası) process based bir yapı yerine thread based bir yapıyı tercih ettiğimiz de performans olarak elimize ne geçecek. Bu konu ile ilgili bikaç tane test yaptım ancak performans konusunu etkileyen birçok parametre olduğundan dolayı ve testlerimde farklı sonuçlar elde ettiğim için (çokda sağlıklı olduğunu düşünmediğim için) burada sonuçları paylaşmak istemedim ancakçok kabaca şunu söyleyebilirimki ortalama %20 oranında bir performans artışını yakaladım.

Be Sociable, Share!

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


altı − = 2