0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

リスナー経由接続時のシステムコールを見る(Oracle Database 19c)

Last updated at Posted at 2022-04-04

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)の読み込み等が行われます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?