Comet 的な HTTP トラフィックのベンチマークを weighttp でやってみる

HTTP コネクションは張ったままだけど大して通信しないという、いわゆる Comet のような負荷をベンチマークするのは意外と難しい。
以下の patch を当てた weighttp でベンチマークすると良い感じだった。 weighttp はいわゆるベンチマークツールだが、軽量かつイベントドリブンなのでコネクション数について良くスケールする。

** worker.c.orig       2013-04-01 16:59:12.000000000 +0900
--- worker.c    2013-04-01 17:06:02.000000000 +0900
***************
*** 17,22 ****
--- 17,23 ----
        worker = W_MALLOC(Worker, 1);
        worker->id = id;
        worker->loop = ev_loop_new(0);
+       ev_set_io_collect_interval(worker->loop, 3);
        ev_ref(worker->loop);
        worker->config = config;
        worker->num_clients = num_clients;

上記パッチを当てると、トラフィックは 3秒に 1回ぐらいしか流れなくなりぬるくなる。コネクション数以外の部分では当たらなくなるので好都合。
こいつを使ってクライアント 10台ぐらいで nginx をイジメると簡単に C10K を突破する。ソースポートの数とか色々当たってくるので、(頑張ればもっと張れるのは知っているが)クライアント 1台あたり数千〜数万コネクションに抑えた方が面倒は無い。

参考

weighttp 自体は以下を見て知ったので、詳細は直接見た方が早い。 ulimit まわりの話もあります。
http://www.iij.ad.jp/company/development/tech/activities/weighttp/