apache bench(ab) が OSX で刺さった夜は
ある日、OSX Yosemite で apache bench でベンチマークを使っていると、なぜか stuck して困っていた。
ab -c 10 -n 16500 http://127.0.0.1:5000/
どうも、対向サーバーを jetty にしても plack にしてもダメなので、なんなのかな~と。。
ab そのものを疑ってみる
最新版の 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/
- http://simon.heimlicher.com/articles/2012/07/08/fix-apache-bench-ab-on-os-x-lion
- http://qiita.com/hagino3000/items/796da3bd1e8d1233973c
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 は腐ってない。