tokuhirom's Blog

apache bench(ab) が OSX で刺さった夜は

ある日、OSX Yosemite で apache bench でベンチマークを使っていると、なぜか stuck して困っていた。

ab -c 10 -n 16500 http://127.0.0.1:5000/

どうも、対向サーバーを jetty にしても plack にしてもダメなので、なんなのかな~と。。


ab そのものを疑ってみる

いろいろ調べてみると、対向サーバーを変えても同じような感じで刺さるのでどうやら ab の側に問題があるのかな、と思って調べてみたところ、OSX Lion の時代にそのような問題が話題になっていたようだ。

最新版の ab は以下のようにして入れることができる。

wget http://ftp.tsukuba.wide.ad.jp/software/apache//httpd/httpd-2.4.12.tar.bz2
tar xzvf httpd-2.4.12.tar.bz2
cd httpd-2.4.12
sudo ln -s /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain /Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.10.xctoolchain
cd support/
make ab
cp ab /usr/local/bin/
↑このへんかな、と思ってしらべていたが、最新のリビジョンでは修正されているし、問題がなかった。また、該当のエントリで指摘されている問題は r1351737 で修正されており、yosemite にバンドルされている ab は r1604373 なので、すでに修正済みである。

osx のプロセスあたりのファイルデスクリプタ数制限を疑ってみる

kazuho さんが、「osx のプロセスあたりのファイルデスクリプタ数制限にぶちあたってるだけではないか」というアドバイスをくれたので調べてみたが、よくよく考えると -c 10 とかでやってるので枯渇することはなさそう。

-c 1000 とかだとありえる。

結論としては epehemeral port の枯渇でした、と

ephemeral port とは

An ephemeral port is a short-lived transport protocol port for Internet Protocol (IP) communications allocated automatically from a predefined range by the IP software.

のようなもののことですが、こいつが枯渇していた。

OSX では 49152 to 65535 = 16383 なので、ちょうどそのぐらいで枯渇してエラーになると。 kazuho さんによると「16325 みたいな数値をみたら、あー ephemeral」ってわかるものだそうです。僕にはわからなかった!

linux では同様の条件でやっても再現しないので困っていたのだが、単に linux の場合 ephemeral port の範囲がデフォルトで 32768 to 61000 = 28232 と広いため、-n 17000 とかでやっても再現していなかった。

まとめ

ab は腐ってない。