libcが遅い?それとも、lighttpdが遅い?それとも、Hardened Gentoo(grsecurity/PaX)が遅い???

lighttpdの速さに感動!したのもつかの間・・・。
Hardened Gentoo LinuxマシンとCentOS 5.3マシンでab勝負させてみると・・・なんとPentium III 1GHzのCentOS 5.3マシンが、Pentium 4 (Willametteコア) 1.5 GHzよりもかなり速いなんて・・・;w;
具体的には、2800 vs 3400 requests per secondぐらいだった。
モジュールはmod_accessとmod_access_logのみ読み込むようにし、access_logの保存は無効にしてある。
測定にはab(keepaliveはオフ)を使用し、2つのマシンのうち一方をサーバ、他方をクライアントとすることで測定した。


※この先、一部前提条件(例:gccの最適化オプション)などに難があり、正確な測定ではないことをご了承願いたい。


OProfileを使ったものの慣れていないせいかわからず、結局のところ勘になってしまったが、やはり怪しいのはGentooがHardenedであるせいではないかと感じた。
そこで、Gentooマシンのchroot環境下に最新の(Hardenedじゃない)Gentooのstage3(簡単に言えば、Gentooのバイナリ即席環境)を入れて、そこにlighttpdをインストール。これで試してみると・・適当なのにもかかわらず、一気に2800->3100 requests per second!
chroot下のGentooと外のHardened Gentooとでは、gccのバージョンやHardened機能(Stack Smashing ProtectorとPIE)の有無なども違うから一概には言えないけれども、OProfileの結果を見る限りでは、glibcのHardenedが何となく重いような気がする・・・。
そこで、chroot下の(Hardenedでない)glibcをquickpkgで固めて、それをchrootの外のHardened Gentooにインストールしてみた(glibcのバージョンはともに2.8_p20080602-r1)。で、ab -n 5000 -c 100。残念ながら2800 requests per second、変化無し・・・。
さらに、(Hardened gccコンパイルされていない)lighttpdもquickpkgで固めてインストールしたところ、ついに3100 requests per secondになった。
glibcよりもlighttpd本体が怪しくなったので、先ほど非Hardend版のglibcをインストールしたので、Hardened版glibcに戻して試してみた。3100近いrequests per secondをたもった。


少なくとも今回Hardened Gentooマシンに入っていたlighttpd本体は遅かったのだ・・・。


しかし、「TCP: time wait bucket table overflow」というログを吐き出しまくっていながらも、CentOSlighttpdが300ほど上回って3400 requests per secondだ。
もう一つ影響してそうなものは、Gentooにインストールされている、HardenedなKernelだ。
オプションをほとんど同じにしてHardenedでないKernelをコンパイルし、先ほどchroot下に入れた新しい(Hardenedでない)Gentoo環境を起動してみた。つまり、glibcgccも、lighttpd本体も、Hardenedの息がかかっていない。
結果・・・3200 requests per secondを下回るぐらいだった。先ほどHardenedなKernelのchrootのもとで動かしたときと、ほとんど変わらなかった。


今度は、普通(のglibcとKernel)に戻したHardened Gentoo環境で、gccのHardened機能をオフにして(gcc-configで、末尾に「vanilla」と書かれているものを選択する)、lighttpdコンパイルしてインストールしてみた。
2800 requests per secondとなった。2800といえば、gccのHardenedが有効の状態でコンパイルしたlighttpdと変わりない。つまり、gccのHardened機能を無効にしてもしなくても、変化があまりなかったのだ!


最後に、gccのバージョンに目をつけた。CentOS 5.3も、今回chroot環境下に入れた非HardenedなGentoo Linuxも、gcc-4でコンパイルされているようであった(/lib/libc.so.6を実行すると、どんな環境でコンパイルされたかがわかる)。
しかし、Hardened Gentooではまだgccのバージョン4以上はテスト中になっていて、(Hardenedパッチを当てた)gcc-3を使っていた。
もうやるしかない、ということで、「ACCEPT_KEYWORDS=~x86 emerge -1 gcc」(ホントは-1よりも-uが正しいのかも)として、テスト中のgcc-4.3.3-r2(Hardened有効)をインストールし、lighttpdコンパイルした。
その結果3000 requests per secondぐらいに。gcc-4にするとかなり性能が向上することがわかった。しかし、相変わらず3200にすら届いていない。


結局、なぜHardened Gentooマシンのlighttpdが遅いのかは、はっきりしていない。もしかしたら、glibcgcc以外にも影響要素があるのかもしれない。しかしこれだけは言える。普通のGentooとHardenedのGentooを(lighttpdで)比べると、あまり大きな速さの違いはでないということだ。
そして、gcc4はgcc3に比べて、(デフォルトの最適化オプションが違うのかもしれないが)、大きく性能が改善したようだ。


少し前に書いた上に、メモ書きになってしまったので、修正して行きたいと思う。
今回は、ここまで。・w・