[pgsql-jp: 35718] Re: pgpoolのfflush()におけるEAGAIN

bunji @ iris.eonet.ne.jp bunji @ iris.eonet.ne.jp
2005年 7月 10日 (日) 00:40:34 JST


永橋です。

linuxでpgpool(2.6.1)の簡単な動作確認を行いました。

個別のメールでnon_blockingに統一するとのお話がありましたが
2.6.1でもdo_acceptのaccept関数で生成されたソケットには
fcntlでのO_NONBLOCK設定がされていなかったのでlinuxでは
blockingで動作していると思われます。

そこでchild.cのdo_acceptを呼び出し後を以下のように変更しました。

    frontend = do_accept(unix_fd, inet_fd, &timeout);

    if (frontend == NULL)
    {
      /* check select() timeout */
      if (connected && pool_config.child_life_time > 0 &&
        timeout.tv_sec == 0 && timeout.tv_usec == 0)
      {
        pool_debug("child life %d seconds expired", pool_config.child_life_time);
        send_frontend_exits();
        exit(2);
      }
      continue;
    }
#ifdef NONE_BLOCK
    set_nonblock(frontend->fd);
#endif

動作としては正常なのですが大量レコード検索時 pool_fulsh_itでの
write関数でEAGAINが多発します。
(検索結果3万レコードを受けるのに13万回発生)

この状態がシステムにどれほどの負荷がかかるのか判断できませんが
やはり山下さんが言われてたようにselectで書き込み可を確認しwrite関数を
呼び出した方が良いのではないでしょうか。

以上




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