技術ブログ
Linux/UNIX環境では、Oracleインスタンスはマルチプロセス構成でした。 Oracle Database 12c よりTHREADED_EXECUTION初期化パラメータをONにすることで 一部のプロセスがマルチスレッド構成になります。
みなさんご存知の通り、デフォルトの構成(THREADED_EXECUTION=OFF)では、 1つのバックグラウンドプロセス、サーバープロセスに対して、1つのOSのプロセスが起動します。
SQL> SELECT program, spid, stid FROM V$PROCESS; PROGRAM SPID STID ------------------------------------------------ ------------------------ ------------------------ PSEUDO oracle@l63x64a.domain (PMON) 13091 13091 oracle@l63x64a.domain (PSP0) 13095 13095 oracle@l63x64a.domain (VKTM) 13099 13099 oracle@l63x64a.domain (GEN0) 13103 13103 oracle@l63x64a.domain (MMAN) 13105 13105 oracle@l63x64a.domain (TNS V1-V3) 13153 13153 oracle@l63x64a.domain (DIAG) 13109 13109 oracle@l63x64a.domain (DBRM) 13111 13111 oracle@l63x64a.domain (DIA0) 13113 13113 oracle@l63x64a.domain (DBW0) 13115 13115 oracle@l63x64a.domain (LGWR) 13117 13117 oracle@l63x64a.domain (CKPT) 13119 13119 oracle@l63x64a.domain (SMON) 13121 13121 oracle@l63x64a.domain (RECO) 13123 13123 oracle@l63x64a.domain (LREG) 13125 13125 oracle@l63x64a.domain (MMON) 13127 13127 oracle@l63x64a.domain (MMNL) 13129 13129 oracle@l63x64a.domain (D000) 13131 13131 oracle@l63x64a.domain (S000) 13135 13135 oracle@l63x64a.domain (TMON) 13155 13155 oracle@l63x64a.domain (TT00) 13157 13157 oracle@l63x64a.domain (SMCO) 13159 13159 oracle@l63x64a.domain (FBDA) 13163 13163 oracle@l63x64a.domain (AQPC) 13165 13165 oracle@l63x64a.domain (W000) 13171 13171 oracle@l63x64a.domain (CJQ0) 13193 13193 oracle@l63x64a.domain (P000) 13185 13185 oracle@l63x64a.domain (P001) 13187 13187 oracle@l63x64a.domain (P002) 13189 13189 oracle@l63x64a.domain (P003) 13191 13191 oracle@l63x64a.domain (VKRM) 13239 13239 oracle@l63x64a.domain (QM02) 13229 13229 oracle@l63x64a.domain (Q002) 13234 13234 oracle@l63x64a.domain (Q003) 13237 13237 35行が選択されました。 SQL> host ps -e -o pid,ppid,command |grep $ORACLE_SID |grep -v grep 13091 1 ora_pmon_c101 13095 1 ora_psp0_c101 13099 1 ora_vktm_c101 13103 1 ora_gen0_c101 13105 1 ora_mman_c101 13109 1 ora_diag_c101 13111 1 ora_dbrm_c101 13113 1 ora_dia0_c101 13115 1 ora_dbw0_c101 13117 1 ora_lgwr_c101 13119 1 ora_ckpt_c101 13121 1 ora_smon_c101 13123 1 ora_reco_c101 13125 1 ora_lreg_c101 13127 1 ora_mmon_c101 13129 1 ora_mmnl_c101 13131 1 ora_d000_c101 13135 1 ora_s000_c101 13153 11667 oraclec101 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) 13155 1 ora_tmon_c101 13157 1 ora_tt00_c101 13159 1 ora_smco_c101 13163 1 ora_fbda_c101 13165 1 ora_aqpc_c101 13171 1 ora_w000_c101 13185 1 ora_p000_c101 13187 1 ora_p001_c101 13189 1 ora_p002_c101 13191 1 ora_p003_c101 13193 1 ora_cjq0_c101 13229 1 ora_qm02_c101 13234 1 ora_q002_c101 13237 1 ora_q003_c101 13239 1 ora_vkrm_c101 SQL> host ps -e -o pid,ppid,command |grep $ORACLE_SID |grep -v grep | wc -l 34
ここで、Oracle Database 12c R1より導入された初期化パラメータ THREADED_EXECUTION を ONにしてインスタンスを再起動すると、マルチスレッド構成が有効になります。
SQL> alter system set THREADED_EXECUTION=TRUE scope=spfile; システムが変更されました。 SQL> shutdown immediate データベースがクローズされました。 データベースがディスマウントされました。 ORACLEインスタンスがシャットダウンされました。 SQL> startup ORACLEインスタンスが起動しました。 Total System Global Area 417546240 bytes Fixed Size 2289064 bytes Variable Size 331350616 bytes Database Buffers 79691776 bytes Redo Buffers 4214784 bytes データベースがマウントされました。 データベースがオープンされました。 SQL> SELECT program, spid, stid FROM V$PROCESS; PROGRAM SPID STID -------------------------------- -------- -------- PSEUDO oracle@l63x64a.domain (PMON) 13508 13508 oracle@l63x64a.domain (PSP0) 13510 13510 oracle@l63x64a.domain (VKTM) 13514 13514 oracle@l63x64a.domain (GEN0) 13518 13520 oracle@l63x64a.domain (SCMN) 13518 13518 oracle@l63x64a.domain (MMAN) 13518 13521 oracle@l63x64a.domain (TMON) 13524 13557 oracle@l63x64a.domain (DIAG) 13524 13526 oracle@l63x64a.domain (SCMN) 13524 13524 oracle@l63x64a.domain (DBRM) 13518 13527 oracle@l63x64a.domain (DIA0) 13524 13528 oracle@l63x64a.domain (DBW0) 13530 13530 oracle@l63x64a.domain (LGWR) 13518 13531 oracle@l63x64a.domain (CKPT) 13518 13532 oracle@l63x64a.domain (SMON) 13518 13533 oracle@l63x64a.domain (RECO) 13524 13534 oracle@l63x64a.domain (LREG) 13518 13535 oracle@l63x64a.domain (MMON) 13524 13536 oracle@l63x64a.domain (MMNL) 13524 13537 oracle@l63x64a.domain (D000) 13524 13539 oracle@l63x64a.domain (S000) 13524 13541 oracle@l63x64a.domain (N000) 13524 13542 oracle@l63x64a.domain 13524 725 oracle@l63x64a.domain (TT00) 13524 13558 oracle@l63x64a.domain (SMCO) 13524 13559 oracle@l63x64a.domain (FBDA) 13524 13560 oracle@l63x64a.domain (AQPC) 13524 13563 oracle@l63x64a.domain (W000) 13524 14831 oracle@l63x64a.domain (CJQ0) 13524 13576 oracle@l63x64a.domain (P000) 13524 13570 oracle@l63x64a.domain (P001) 13524 13571 oracle@l63x64a.domain (P002) 13524 13572 oracle@l63x64a.domain (P003) 13524 13573 oracle@l63x64a.domain (QM02) 13524 13604 oracle@l63x64a.domain (VKRM) 13524 13595 oracle@l63x64a.domain (W001) 13524 16107 oracle@l63x64a.domain (Q002) 13524 13606 oracle@l63x64a.domain (Q003) 13524 13607 oracle@l63x64a.domain (W002) 13524 19930 oracle@l63x64a.domain (W004) 13524 27371 oracle@l63x64a.domain (W005) 13524 27494 oracle@l63x64a.domain (W003) 13524 20055 oracle@l63x64a.domain (W006) 13524 2636 oracle@l63x64a.domain (W007) 13524 2767 oracle@l63x64a.domain (J000) 13524 8442 oracle@l63x64a.domain (J001) 13524 8443 47行が選択されました。
SQL> host ps -e -o pid,ppid,command |grep $ORACLE_SID |grep -v grep 13508 1 ora_pmon_c101 13510 1 ora_psp0_c101 13514 1 ora_vktm_c101 13518 1 ora_u004_c101 13524 1 ora_u005_c101 13530 1 ora_dbw0_c101 SQL> host ps -e -o pid,ppid,command |grep $ORACLE_SID |grep -v grep | wc -l 6 SQL> host ps -e -o pid,ppid,lwp,command -L |grep $ORACLE_SID |grep -v grep 13508 1 13508 ora_pmon_c101 13510 1 13510 ora_psp0_c101 13514 1 13514 ora_vktm_c101 13518 1 13518 ora_u004_c101 13518 1 13519 ora_u004_c101 13518 1 13520 ora_u004_c101 13518 1 13521 ora_u004_c101 13518 1 13527 ora_u004_c101 13518 1 13531 ora_u004_c101 13518 1 13532 ora_u004_c101 13518 1 13533 ora_u004_c101 13518 1 13535 ora_u004_c101 13524 1 13524 ora_u005_c101 13524 1 13525 ora_u005_c101 13524 1 13526 ora_u005_c101 13524 1 13528 ora_u005_c101 13524 1 13534 ora_u005_c101 13524 1 13536 ora_u005_c101 13524 1 13537 ora_u005_c101 13524 1 13539 ora_u005_c101 13524 1 13541 ora_u005_c101 13524 1 13542 ora_u005_c101 13524 1 13557 ora_u005_c101 13524 1 13558 ora_u005_c101 13524 1 13559 ora_u005_c101 13524 1 13560 ora_u005_c101 13524 1 13563 ora_u005_c101 13524 1 13570 ora_u005_c101 13524 1 13571 ora_u005_c101 13524 1 13572 ora_u005_c101 13524 1 13573 ora_u005_c101 13524 1 13576 ora_u005_c101 13524 1 13595 ora_u005_c101 13524 1 13604 ora_u005_c101 13524 1 13606 ora_u005_c101 13524 1 13607 ora_u005_c101 13524 1 14831 ora_u005_c101 13524 1 16107 ora_u005_c101 13524 1 19930 ora_u005_c101 13524 1 20055 ora_u005_c101 13524 1 27371 ora_u005_c101 13524 1 27494 ora_u005_c101 13524 1 725 ora_u005_c101 13524 1 2636 ora_u005_c101 13524 1 2767 ora_u005_c101 13524 1 8442 ora_u005_c101 13524 1 8443 ora_u005_c101 13530 1 13530 ora_dbw0_c101 SQL> host ps -e -o pid,ppid,lwp,command -L |grep $ORACLE_SID |grep -v grep |wc -l 48
THREADED_EXECUTION=ONとすると、OS認証を用いた接続ができなくなります。OS認証を用いた接続は、SYSユーザーでのローカル接続で非常によく使用される接続形態であるため、この制限については注意が必要です(というか、私が最初試したとき、この制限に引っかかって少し焦りました・・・)
[oracle@l63x64a ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.1.0 Production on 月 8月 5 02:06:14 2013 Copyright (c) 1982, 2013, Oracle. All rights reserved. ERROR: ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。 ユーザー名を入力してください: [oracle@l63x64a ~]$ sqlplus sys/password as sysdba SQL*Plus: Release 12.1.0.1.0 Production on 月 8月 5 02:06:18 2013 Copyright (c) 1982, 2013, Oracle. All rights reserved. Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options に接続されました。 SQL>
動作としては上記のとおりですが、THREADED_EXECUTION初期化パラメータをONにすることに よるマルチスレッド構成の意味ははっきりとつかみにくい気がします。というのも、プロセスの代わりにスレッドを使用するメリットが分かりにくいためです。プロセスの代わりにスレッドを使用しても、CPUのコンテキストスイッチは発生します。同一のプロセス内のスレッド間のタスク切り替えであれば、メモリ空間の切り替えが不要になるというメリットはありますが、効果は若干疑問です。
もう少し調べてみます。
下記のps2は、psコマンドの実行結果を外部表として参照できるようにしたものです。 ps2外部表とV$PROCESSをスレッドIDで結合して、OSスレッドとOracleプロセスの対応を確認しています。
SQL> SELECT program, spid, stid, COMMAND,lwp FROM V$PROCESS pr FULL OUTER JOIN ps2 ON pr.stid = ps2.lwp; PROGRAM SPID STID COMMAND LWP -------------------------------- -------- -------- -------------------- ---------- oracle@l63x64a.domain (PMON) 13508 13508 ora_pmon_c101 13508 oracle@l63x64a.domain (PSP0) 13510 13510 ora_psp0_c101 13510 oracle@l63x64a.domain (VKTM) 13514 13514 ora_vktm_c101 13514 oracle@l63x64a.domain (SCMN) 13518 13518 ora_u004_c101 13518 ora_u004_c101 13519 oracle@l63x64a.domain (GEN0) 13518 13520 ora_u004_c101 13520 oracle@l63x64a.domain (MMAN) 13518 13521 ora_u004_c101 13521 oracle@l63x64a.domain (DBRM) 13518 13527 ora_u004_c101 13527 oracle@l63x64a.domain (LGWR) 13518 13531 ora_u004_c101 13531 oracle@l63x64a.domain (CKPT) 13518 13532 ora_u004_c101 13532 oracle@l63x64a.domain (SMON) 13518 13533 ora_u004_c101 13533 oracle@l63x64a.domain (LREG) 13518 13535 ora_u004_c101 13535 oracle@l63x64a.domain (SCMN) 13524 13524 ora_u005_c101 13524 ora_u005_c101 13525 oracle@l63x64a.domain (DIAG) 13524 13526 ora_u005_c101 13526 oracle@l63x64a.domain (DIA0) 13524 13528 ora_u005_c101 13528 oracle@l63x64a.domain (RECO) 13524 13534 ora_u005_c101 13534 oracle@l63x64a.domain (MMON) 13524 13536 ora_u005_c101 13536 oracle@l63x64a.domain (MMNL) 13524 13537 ora_u005_c101 13537 oracle@l63x64a.domain (D000) 13524 13539 ora_u005_c101 13539 oracle@l63x64a.domain (S000) 13524 13541 ora_u005_c101 13541 oracle@l63x64a.domain (N000) 13524 13542 ora_u005_c101 13542 oracle@l63x64a.domain (TMON) 13524 13557 ora_u005_c101 13557 oracle@l63x64a.domain (TT00) 13524 13558 ora_u005_c101 13558 oracle@l63x64a.domain (SMCO) 13524 13559 ora_u005_c101 13559 oracle@l63x64a.domain (FBDA) 13524 13560 ora_u005_c101 13560 oracle@l63x64a.domain (AQPC) 13524 13563 ora_u005_c101 13563 oracle@l63x64a.domain (P000) 13524 13570 ora_u005_c101 13570 oracle@l63x64a.domain (P001) 13524 13571 ora_u005_c101 13571 oracle@l63x64a.domain (P002) 13524 13572 ora_u005_c101 13572 oracle@l63x64a.domain (P003) 13524 13573 ora_u005_c101 13573 oracle@l63x64a.domain (CJQ0) 13524 13576 ora_u005_c101 13576 oracle@l63x64a.domain (VKRM) 13524 13595 ora_u005_c101 13595 oracle@l63x64a.domain (QM02) 13524 13604 ora_u005_c101 13604 oracle@l63x64a.domain (Q002) 13524 13606 ora_u005_c101 13606 oracle@l63x64a.domain (Q003) 13524 13607 ora_u005_c101 13607 oracle@l63x64a.domain (W000) 13524 14831 ora_u005_c101 14831 oracle@l63x64a.domain (W001) 13524 16107 ora_u005_c101 16107 oracle@l63x64a.domain (W002) 13524 19930 ora_u005_c101 19930 oracle@l63x64a.domain (W003) 13524 20055 ora_u005_c101 20055 oracle@l63x64a.domain (W004) 13524 27371 ora_u005_c101 27371 oracle@l63x64a.domain (W005) 13524 27494 ora_u005_c101 27494 oracle@l63x64a.domain 13524 725 ora_u005_c101 725 oracle@l63x64a.domain (W006) 13524 2636 ora_u005_c101 2636 oracle@l63x64a.domain (W007) 13524 2767 ora_u005_c101 2767 oracle@l63x64a.domain (J000) 13524 8442 ora_u005_c101 8442 oracle@l63x64a.domain (J001) 13524 8443 ora_u005_c101 8443 oracle@l63x64a.domain (DBW0) 13530 13530 ora_dbw0_c101 13530 PSEUDO 49行が選択されました。
1つのora_unnn_[$ORACLE_SID]プロセスに対して、1つずつOracleプロセスに割り当てられてないOSスレッドがあることがわかります。役割は謎です。将来的な新規接続に備えて、スレッドをプーリングしているのかと思ったのですが、違うようです。何かわかったらblogに書きたいと思います。