Yahoo!のえらい人によるApacheハッキング

http://d.hatena.ne.jp/naoya/20060202/1138891578
はてなのCTOの人が書いてた記事を教えてもろて、面白そうだったので読んでみました。Yahoo!のえらい人のApache関連記事、どんなApacheYahoo!のサービスをやっているか。
http://public.yahoo.com/~radwin/talks/yapache-apachecon2005.htm

Webサーバの最適化って、小さなとこだとMaxClientsいじって終了、とかそういうレベルが大半だと思うんだけれど、だいたい突き詰めて行くとKernelのチューニングってことになると思う(だいたいにおいて劇的な改善は望めないわけだけど)。速いサーバに入れ替えるって解は楽だけど金かかるし、台数増えすぎるのは考え物。一台あたりの性能を最大限に引き出すって大事な事だと思うですよ。常々そう思ってた、なんて後だしジャンケンはかっこ悪いけど、パフォーマンスチューニングに時間をかけるなら高速なサーバに置き換えて(つまり金を使って)解決って話はよくある。
そんなこんなで、↑の記事で紹介されてたパフォーマンスチューニング手法、一番面白かったのはやっぱアレですね。ソケットバッファをいじる話。FreeBSD限定ってことになるんだけども。

通信データ━━KernelのIP関連処理━━Apacheの入出力部

簡単のためにこんなモデルで考えると、前述のKernelチューニングってのがKernelのIP関連処理部分に相当する。Yahoo!のえらい人が考えたのはApacheの入出力部。Apacheの入出力部に、ちょこちょこちょこちょこデータが入って、都度処理が必要なら、Kernel部分で巨大なバッファ(100K超えりゃバッファとしては十分巨大)を持つことで、Apacheの処理負担を引き下げる事に主眼がある。トレードオフとして出力もKernelがバッファリングしちゃう事をYahoo!のえらい人は書いてるけど、大問題には見えない気がする。メモリ喰うのはしゃーないにせよ、Apacheがやるメモリ管理よりもKernelがIP関連の一処理としてやるメモリ管理のほうが効率的で速いんじゃないかね。たぶん速いよね。
メモリ喰うってどんぐらいかな?と計算。ソケットバッファに224Kを割り当てているらしいので、仮に同時接続ソケット512として、112MB?IN/OUTで別バッファだと考えても224MB?だけで済んじゃうね。すごい。MaxClients 2048にしてもメモリ1GBいらない(他でちゃんと必要だけどね)。
他にも、ログローテーションを最適化する話や(興味アリ)、子プロセスの起動制御など。楽しそうだなーと思った。
1.3系でやってるこれら最適化を2006年 Apache2.2系に合わせるって書いてるけど、むしろ2.2系にフィードバックしてほしいもんです。はい。