はやい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 以外のプラットフォームでは)。具体的には、現在時刻はグローバル変数に格納し、メインループや別スレッドから、定期的にその値をアップデートする、という方式がいいでしょう。