[pgsql-jp: 34731] Re: pgpoolが無応答になる

Kouji Ito kouji @ cty-net.ne.jp
2005年 1月 27日 (木) 15:06:32 JST


> 調べてみたらLinuxではstraceというコマンドがtruss相当のコマンドのようでした。
> テスト環境で親プロセスに対してstraceを投げてみましたが、
> pause(
> という表示で止まっており、
>
pause(2)をコールして、シグナルによる割り込みを待っているという
状態ですね。この場合は、CPU負荷が100%になる事はないと思います。
> 子プロセスに対して投げたら
> select(6, [4 5], NULL, NULL, {0, 390000}) = 0 (Timeout)
> select(6, [4 5], NULL, NULL, {1, 0})    = 0 (Timeout)
> select(6, [4 5], NULL, NULL, {1, 0})    = 0 (Timeout)
> select(6, [4 5], NULL, NULL, {1, 0})    = 0 (Timeout)
> といった形で延々と表示されました。
>
6番のファイルディスクリプタに対して1秒のタイマを設定していますね。
おそらく、ソケットに対して接続を待っているという状態だと思います。

> こういった使い方で正しいのでしょうか?
> なにぶんデバッガの使用経験がなく本番環境で実行するので不安でして。。。
>

使い方は、それで良いと思います。

CPU負荷が100%になったときに、一番CPUを使っているプロセスをtopなどで
調べて、そのプロセスに対してstraceを使えば、もし、そのプロセスが、
ユーザープロセスとして永久ループを実行しいて、かつ何らかのシステム
コールをその永久ループの中でコールしていれば、straceはすごい勢い
でトレース結果を出力します。

システムコールを実行中にカーネル内部で永久ループして、CPUを使用している
のであれば、straceは、なにも出力しないでしょう。(=カーネルのバグですね。)

プロセスが、システムコールを実行しないループを回っている場合も、strace
は、何も出力しないと思います。
この場合は、gcore と言うコマンドで、そのプロセスのcoreイメージをファイル
に落として、デバッガで見ればなにをしているかは判ると思います。

本番環境で、上記の作業を行う事に対するリスクに関しては、私には判りません。

ただ、straceや、gcoreなどのコマンドは、実行中のプロセスに対してアタッチを
行います。アタッチしたプロセスおよび、OSに対して、全く何の影響もなく情報が
取り出せるという訳ではないと思います。




pgsql-jp メーリングリストの案内