pg_options の使用

Note: Massimo Dal Zottoによる寄稿。

data/pg_options というオプションファイルには、 バックエンドがトレースメッセージを制御するための実行時用オプション やその他のバックエンドのチューニング用パラメータを記述します。バッ クエンドは SIGHUP シグナルを受け取ると、このファイルを再読み込みし ます。これにより、Postgres を再起動する ことなく、実行した状態のまま実行時用オプションを変更することができ ます。このファイルでは、トレース用パッケージ( backend/utils/misc/trace.c )で使用されるデバ ッグ用フラグやバックエンドの動作を制御するための数値パラメータとい ったオプションを指定できます。

バックエンドが起動する時、全ての pg_options は 0 に初期化されて います。新しいもしくは変更されたオプションは新しくバックエンドが 起動した時に読み込まれます。実行中のバックエンドでオプションの変 更を有効にするには、postmaster に対して SIGHUP シグナルを送信する 必要があります。そのシグナルは自動的に全てのバックエンドに対して 送信されます。特定のバックエンドに対してのみに SIGHUP を直接送信 することにより、そのバックエンドに対してのみ変更を有効にすること もできます。

エラーやデバッグ用メッセージを表示するために使用される関数は、 syslog(2) 機能を使用するように設定できるよ うになりました。標準出力や標準エラーに表示されるメッセージに時刻 とバックエンドのプロセス番号を前につけた、以下のように形式で出力 されます。

#timestamp          #pid    #message
980127.17:52:14.173 [29271] StartTransactionCommand
980127.17:52:14.174 [29271] ProcessUtility: drop table t;
980127.17:52:14.186 [29271] SIIncNumEntries: table is 70% full
980127.17:52:14.186 [29286] Async_NotifyHandler
980127.17:52:14.186 [29286] Waking up sleeping backend process
980127.19:52:14.292 [29286] Async_NotifyFrontEnd
980127.19:52:14.413 [29286] Async_NotifyFrontEnd done
980127.19:52:14.466 [29286] Async_NotifyHandler done
    

この形式はログファイルの可読性を向上させており、どのバックエンドが いつ何をしたのかがユーザに判るようになっています。データベースに 関するエラーや問題の検出を行なう、ログを監視する簡単な awk や perl スクリプトを作成することや、トランザクション時間に関する統計情報の 演算を行なうことがより簡単にできるようになっています。

メッセージを syslog に出力する時には LOG_LOCAL0 ファシリティが使 われます。syslog を使用するかどうかは syslog pg_option で設定でき ます。残念ながら、多くの関数は printf() を直 接使ってメッセージを標準出力や標準エラーに出力していますので、その 出力はsyslogに出力することも時刻情報を付与することもできません。 全ての出力を統一された形で制御できるように、全ての printf の呼び出 しを PRINTF に置換すること、また、もしそれが標準エラーへの出力であ る場合は EPRINTF に置換することですっきりすることはわかっているの ですが(まだ行なわれていません)。

pg_options ファイルの形式は以下の通りです。

# コメント
オプション=整数値  # オプション に値を設定します。
オプション    # オプション を 1 に設定します。
オプション+   # オプション を 1 に設定します。
オプション-   # オプション を 0 に設定します。
    
keyword は、 backend/utils/misc/trace.cで定義されたオプ ション名の省略形にもなることに注意して下さい。

Example 7-1. pg_options ファイル

例として、私が使用している pg_options を以下に示します。

verbose=2
query
hostlookup
showportnumber
      

認知可能なオプション

現在、以下のオプションが定義されています。

all

大域的なトレースフラグ。以下の値を設定できます。

0

個別にトレースメッセージを出力可能にします。

1

全てのトレースメッセージを出力可能にします。

-1

全てのトレースメッセージの出力を無効にします。

verbose

冗長性フラグ。以下の値を設定できます。

0

メッセージを出力しません。デフォルトの設定です。

1

情報メッセージを出力します。

2

より多くの情報メッセージを出力します。

query

問い合わせトレースフラグ。以下の値を設定できます。

0

問い合わせを表示しません。

1

問い合わせを 1 行に要約して表示します。

4

問い合わせ全体を表示します。

plan

問い合わせ計画を表示します。

parse

パーサの出力を表示します。

rewritten

書き換えられた問い合わせを表示します。

parserstats

パーサの統計情報を表示します。

plannerstats

プランナの統計情報を表示します。

executorstats

エグゼキュータの統計情報を表示します。

shortlocks

今のところ使用していませんが、予定している機能を実現するために 必要となります。

locks

ロックについてトレースします。

userlocks

ユーザロックについてトレースします。

spinlocks

スピンロックについてトレースします。

notify

通知関数についてトレースします。

malloc

今のところ使用していません。

palloc

今のところ使用していません。

lock_debug_oidmin

ロックについてのトレースを行なうリレーションの最小 oid を 指定します。

lock_debug_relid

非 0 の場合、ロックについてのトレース対象となるリレーショ ンの oid を指定します。

lock_read_priority

今のところ使用していません。

deadlock_timeout

デッドロックを検出するためのタイマー。

syslog

syslog フラグ。以下の値を設定できます。

0

メッセージを標準出力/標準エラーに出力します。

1

メッセージを標準出力/標準エラーと syslog の両方に出力 します。

2

メッセージを syslog にのみ出力します。

hostlookup

ps_status においてホスト名の検索を有効にします。

showportnumber

ps_status においてポート番号を表示します。

notifyunlock

通知後に pg_listener のロックを解除します。

notifyhack

pg_listener から重複したタプルを削除します。