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

Tatsuo Ishii t-ishii @ sra.co.jp
2005年 1月 28日 (金) 10:33:05 JST


石井です.

> 伊藤です。
> このトレースは、pgpoolのトレースで良いのでしょうか?
> 
> ごめんなさい、とりあえず、pgpoolのソースは読まずに話しています。
> 
> accept(2)が、EAGAINを返してきてるんですね。
> select(2)に、4番と5番のファイルディスクリプタを渡していて、
> 接続があったから、select()から抜けて、5番のファイルディスクリプタ
> を渡して、accept()を呼んだところで、
> accept()が、-1を返して、そのときのerrnoが、EAGAINという事は、
> 
> http://www.linux.or.jp/JM/html/LDP man-pages/man2/accept.2.html
> 
> によると、
> accept()に渡しているファイルディスクリプタが間違っている(本当は4番を
> 渡さないといけないとか)ってことになるのかなぁ。(Linixのacceptは、BSDソケット
> の実装とは異なるって上記ページに書いてあるのがかなり気になります。)

違いますね.pgpoolでは,このfdをnon blockingにしており,かつ複数の子プ
ロセスが同じfdに対するaccept要求を取り合う構造になっています.したがっ
て,ある子プロセスがacceptしにいったときにはすでに他の子プロセスに横取
りされてしまっている...ということは起こり得ます.このケースでEAGAINが
acceptから返るわけです.

もちろんaccept要求が来ているのに,どの子プロセスのacceptもEAGAINで蹴ら
れてしまった...ということならもちろん異常なんですが,ひとつの子プロセ
スの動きだけを見ているだけでは,そういうことなのかどうかの判断はできな
いと思います.

つまり,結論としてはこのシステムコールトレースだけを見る限り,正常な動
きのように見えるけど,全体としてなんら異常がないとは結論できない,とい
うことになります.

要は,まだよくわからない,ということです.残念ながら...

> accept()に渡しているファイルディスクリプタが間違っているとすると、
> select()が、返してきているfd_setが間違っているか、その後の
> アプリ側での、ファイルディスクリプタのチェックが間違っている、
> アプリ側で、fd_setを壊しているぐらいでしょうか。
> いずれも、可能性としては低そうですね。
> 
> Linuxには詳しくないのであまり突っ込んだ話が出来ないのですが、
> select(),accept()あたりに関するカーネルパッチとか出てないんでしょうか?
> 接続したとたんに、相手がclose()したり、ハーフオープンな接続があった
> 時とかのLinuxのselect(),accept()ってどう動くんでしょう?

よくわかりませんが,さすがにそういうコネクションに対してacceptが-1以外
を返すことはないと思われます.仮に-1以外を返したとしても,次にフロント
エンドからスタートアップパケットを読み込むためにそのコネクションに対し
てreadをかけますので,その時点でエラーになると思います.

> ロジック上問題がないとすると、tcpdumpなどで、LANのトレースを取る必用が
> あるかもしれません。

このあたりはうといのですが,これによってどのような情報を得ることができ
るのでしょうか?
--
Tatsuo Ishii



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