Oracle Databaseへの接続
Oracle Databaseインスタンスにネットワーク経由で接続するためにはリスナーが必要です。リスナーは指定されたプロトコルとポート番号でクライアントからの接続を待ちます。クライアントが接続すると認証を行い、インスタンスと接続します。デフォルトでは「専用サーバー」と呼ばれるクライアントと1対1に対応するプロセスが起動し、クライアントからの SQL 文を処理します。本記事では Linux 版の Oracle Database 19c でクライアント接続時に発行されるシステムコールをトレースし、専用サーバープロセスが何を行っているかを確認します。
システムコールのトレース
Linux でシステムコールのトレースを取得するには strace コマンドを実行します。プロセスとしてリスナーを指定します。また子プロセスもトレースするために -f オプションも指定します。
$ ps -ef|grep tns | grep -v grep
root 29 2 0 Apr02 ? 00:00:00 [netns]
oracle 4828 1 0 Apr02 ? 00:00:01 /u01/app/oracle/product/19.0.0/dbhome_1/bin/tnslsnr LISTENER -inherit
$
$ strace -f -p 4828 -o trace.out
strace: Process 4828 attached with 2 threads
strace: Process 42229 attached
strace: Process 42230 attached
トレース結果
プロセス起動
プロセスID 4848 のリスナーはクライアントの接続を受け付けます。
4828 accept(11, {sa_family=AF_INET6, sin6_port=htons(59880), inet_pton(AF_INET6, "fe80::5ad2:2131:8c7:892d", &sin6_addr), sin6_flowinfo=htonl(0), sin6_scope_id=if_nametoindex("ens33")}, [128->28]) = 19
次に子プロセスを生成します。プロセスIDは42229です。リスナー・プロセスは子プロセスの終了を待ちます。
4828 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fcf3d9b7cd0) = 42229
4828 wait4(42229, <unfinished ...>
子プロセス42229は更に子プロセスを生成します。その後すぐに終了します。
42229 <... clone resumed>child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fcf3d9b7cd0) = 42230
42229 exit_group(0 <unfinished ...>
孫プロセス 42230 は $ORACLE_HOME/bin/oracle を実行します。これが専用サーバーになります。
42230 execve("/u01/app/oracle/product/19.0.0/dbhome_1/bin/oracle", ["oracleO19A", "(LOCAL=NO)"], 0x172f2f0 /* 32 vars */ <unfinished ...>
専用サーバープロセスはmmapシステムコールでSGAに接続します。
42230 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f920678c000
42230 mmap(NULL, 2105552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f9206369000
42230 mprotect(0x7f920636b000, 2093056, PROT_NONE) = 0
42230 mmap(0x7f920656a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0x7f920656a000
上記のように専用サーバーを起動するためには2つの子プロセスを生成する必要があります。最初の子プロセスがすぐに停止することで、専用サーバー・プロセスが親プロセスがいない独立したプロセスとして起動することができます。Oracle Database の専用サーバー構成は初期接続の負荷が高いため共有サーバー構成やコネクション・プーリング等のテクノロジーを使って負荷を軽減する対策が行われます。
設定ファイルの読み込み
専用サーバーは認証を行いますが、その際にいくつかの設定ファイルを読み込みます。以下のファイルの確認や読み込みを行っていることがわかります。
ファイル名 | 説明 | 備考 |
---|---|---|
${ORACLE_HOME}/env.ora | 環境変数の設定? | |
/etc/orabasetab | 読み取り専用Oracle-Home関連 | |
${ORACLE_HOME}/install/orabasetab | 読み取り専用Oracle-Home関連 | |
${ORACLE_HOME}/network/admin/sqlnet.ora | SQL*Net設定 | |
${ORACLE_HOME}/network/admin/intchg.ora | CMAN関連 | |
${ORACLE_HOME}/network/admin/tnsnav.ora | CMAN関連 | |
${ORACLE_HOME}/opmn/conf/ons.config.{hostname} | Oracle Notification System設定 | |
${ORACLE_HOME}/opmn/conf/ons.config | Oracle Notification System設定 |
上記以外に共有ライブラリの読み込み、ログ・ファイルの出力、メッセージ・カタログ(msb)の読み込み等が行われます。