2009年8月28日金曜日

(FreeBSD) apacheで、[warn] (2)No such file or directory: Failed to enable the 'dataready' Accept Filter

FreeBSDのportsで、apacheが2.2.13になってますが、さっそくアップデートしてみたところ、/usr/local/etc/rc.d/apache22 start して、apacheが起動する時に

Starting apache22.
[Thu Aug 27 08:58:26 2009] [warn] (2)No such file or directory: Failed to enable the 'dataready' Accept Filter

とか表示されました。



なんだこれは?と思って、ソースコードをgrepしてみたんですが[E:coldsweats01]、apache httpdのマニュアルによれば、このAcceptFilterのことらしいです。

AcceptFilter ディレクティブ
http://httpd.apache.org/docs/2.2/mod/core.html#acceptfilter

これ、どこかで見た覚えがあるぞ、という感じがしますが、以前あった、accf_httpとよく似たものですね。

(FreeBSD) apache-2.2.xの「httpd -DNOHTTPACCEPT」って何だ? ~ accf_http

apache httpdのマニュアルを見て、なるほど[E:wink]、と思ったんですが、accf_dataは、httpsのSSL通信のときに、パフォーマンスを向上させるもの、とのこと。



accf_httpは、クライアントから送られてくるリクエストのGET、HEADがサーバーに届くまで、ソケットのacceptを遅らせて、無駄なコンテキストスイッチを無くすことで、処理性能が向上する、という機能でした。



ところがhttpsのときは、カーネルのレベルではまだ暗号化されているデータしか見えてないので、GETやHEADといった文字列を検索することができず、accf_httpは使えない
・・・そこで、accf_dataでは、データの中身は気にせず、とにかく、クライアントからサーバーまで何かデータが到着するまでは、カーネルにてacceptを遅らせるってわけですね。



ちなみに、accf_dataのソースコードはこんな風になってます。



http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/netinet/accf_data.c?rev=1.12.2.1;content-type=text%2Fx-cvsweb-markup



短いですね~ 実質、if文が1個だけですか。





未確認ですが、2.2.11のときは、accf_dataはデフォルトで有効になっていなかったと思うんですけど、2.2.13からデフォルトになったのでしょうか。





root権限で、あらかじめ、



kldload accf_data



を実行して、カーネルモジュールのaccf_data.koをロードしておいてから、/usr/local/etc/rc.d/apache22 startしてやれば、Failed to enable the 'dataready' Accept Filter がでなくなるようです。



/usr/local/etc/rc.d/apache22の中で、accf_http.koは自動でロードさせることができるのですが、accf_data.koはロードしてくれません。



そもそもhttpsを使うかどうかを、httpd.confでコントロールできるようになっているので、httpsを使わない場合は、accf_data.koをロードしても無意味なので、という考えがあるのでしょうか。



それとも、まだ/usr/local/etc/rc.d/apache22を更新するのを忘れているだけ、とか?





FreeBSDのaccept_filter(9)のマニュアルを見てみますと



http://www.freebsd.org/cgi/man.cgi?query=accept_filter&apropos=0&sektion=9&manpath=FreeBSD+7.2-RELEASE&format=html



こんなことが書かれています。

HISTORY
The accept filter mechanism was introduced in FreeBSD 4.0.

AUTHORS
This manual page was written by Alfred Perlstein, Sheldon Hearn and
Jeroen Ruigrok van der Werven.

The accept filter concept was pioneered by David Filo at Yahoo! and
refined to be a loadable module system by Alfred Perlstein.



そういえば、Yahoo!で、FreeBSDが使われているという話がありましたっけ。



直感的には、accf_httpって、ものすごくたくさんのアクセスがあるWebサーバーでしか、パフォーマンス向上が目に見えてこないんじゃない? と思うところがあったんですが、Yahoo!だったら、たしかに、有効でしょうね。





0 件のコメント:

コメントを投稿