はやいTCPサーバを書く際に忘れがちなこと

はやいTCPサーバの書き方 - nyaxtのPC作業ログid:nyaxt さんが書いてらっしゃるように、

  • epoll や kqueue を使う
  • TCP_NODELAY, TCP_DEFER_ACCEPT *1 等を活用する
  • TCP パケットを意識する
  • I/O システムコールの回数を最小にする
  • sendfile

といったあたりは、確実にやるべきことだと思います。一方で、TCP 関連以外のオーバーヘッドが実は結構あって、

  • 接続のタイムアウト処理
  • ログの出力
  • メモリの確保や解放をやらない

あたりにも気を配る必要がある、と思います。

接続のタイムアウト処理については、以前 Kazuho@Cybozu Labs: 高速なCometサーバを書いてみた件 に書いたように、ビットアレイのリングバッファを使うのがベストだと思います。

ログの出力について、複数行を1回のシステムコールにまとめてもいいかどうかは、要件によって異なると思います。ただ、少なくとも、gettimeofday(2) 等の時刻取得関数の呼出回数の極小化は図るべきです (特に linux 以外のプラットフォームでは)。具体的には、現在時刻はグローバル変数に格納し、メインループや別スレッドから、定期的にその値をアップデートする、という方式がいいでしょう。

*1:FreeBSD なら dataready とか httpready