株式会社コーソル

コーソルDatabaseエンジニアのブログ

技術ブログ

THREADED_EXECUTIONでOracleインスタンスをマルチスレッド構成に

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行が選択されました。
  • 同じ V$PROCESS SPID列の値を持つ複数のOracleプロセスがあることから、同一のOSプロセス内に複数のOracleプロセスが存在することがわかります。(マルチスレッド構成)
  • V$PROCESSにSTIDという列が追加されており、この値でOSのスレッドIDを確認できます。
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
  • バックグラウンドプロセス DBWn、 PMON、 PSP、 VKTMについては、従来同様シングルスレッド構成であることがわかります。
  • 上記以外のOracleプロセスがora_unnn_[$ORACLE_SID] というOSプロセス内のOSスレッドとして起動されていることがわかります。

注意点

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に書きたいと思います。

プロフィール

On7tWW6m1Ul4

渡部 亮太

・Oracle ACE
・AWS Certified Solutions Architect - Associate
・ORACLE MASTER Platinum Oracle Database 11g, 12c 他多数

カテゴリー

アーカイブ