[pgpool-general-jp: 88] Re: 接続数が増えるとpgbenchに失敗した件

Yoshiyuki Asaba y-asaba @ sraoss.co.jp
2007年 1月 25日 (木) 10:10:50 JST


浅羽です。

先日はお世話になりました。

From: "ISHIDA Akio" <iakio @ mono-space.net>
Subject: [pgpool-general-jp: 85] 接続数が増えるとpgbenchに失敗した件
Date: Wed, 24 Jan 2007 17:34:24 +0900

> 関係無い方には申しわけないのですが(しかもあまりpgpoolに関係無いかもしれない)
> 先日札幌で行なわれた勉強会の時の話です。
> 
> この時、Windows版PostgreSQLをインストールしたノートPC2台
> を持ち込んで、pgpool-IIに継ぐ即席デモをお願いしたのですが、
> pgbenchである程度接続数が増えると、上手く動かなかったと記憶しています。
> (あまり、ちゃんと現象を覚えていないのですが)。
> 
> で、こんな文書を見かけました。
> http://www.kt.rim.or.jp/~ksk/wskfaq-ja/advanced.html
> 4.9 - 「64 ソケット」制限とは何ですか?
> 
> つまり、そもそもWindows版PostgreSQLは64以上の接続は扱えない
> (FD_SETSIZEを再定義しないかぎり)ということだったんでしょうか。
> そういえば60あたりが境界だった気もします。

PostgreSQL の場合、1 プロセス 1 接続なので、1 プロセスでソケットを 64
個以上同時に監視するという状況は発生しません。例えば postmaster の場合
は listen socket のみ監視(select() -> pgwin32_select())します。

ただし、postmaster が 64 個以上のイベントを監視しないといけない箇所が
あります。それは win32_waitpid() です。これはプロセスが終了したらシグ
ナル状態になるので、それを WaitForMultipleObjects() で検知して適切な後
処理をします。

そこでプロセスを生成したら win32_childHNDArray という配列に子プロセス
のハンドルを登録し、64 個ずつ WaitForMultipleObjects() を呼びだすとい
うことをやっています。8.1.? で Win32 の脆弱性があった問題はこの配列を
オーバーフローさせて意図的に落とすことができたわけです。

では、あのデモの時なぜ接続できなかったかというと、それは謎です…。

# だいぶ脱線してしまいました。すみません。
--
Yoshiyuki Asaba
y-asaba @ sraoss.co.jp


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