Skip to content

Instantly share code, notes, and snippets.

@arimitsu-koichiro
Last active February 7, 2019 09:57
Show Gist options
  • Save arimitsu-koichiro/7ff6a911495014771c41bf33140a5287 to your computer and use it in GitHub Desktop.
Save arimitsu-koichiro/7ff6a911495014771c41bf33140a5287 to your computer and use it in GitHub Desktop.

結論

秒間10000/req以上かけてもfd掴みっぱなし等の現象は発現しなかった。

検証環境

benchmark server(vCPU:2, mem:1.8GB): http://34.85.8.96:8888/

stresser server(vCPU:8, mem:7.2GB) & result: http://34.85.7.57:8000/

検証アプリ

source: https://github.com/sxend/examplehttp

benchmark server ( http://34.85.8.96:8888/ )みたいなレスポンスを返すserverを各FWで実装した。 (実行時に使用するワーカースレッドは4つになるようにした)

actix
hyper
nodejs
tokio

一番下の tokiohttparse を用いて自前で簡易HTTP serverを 実装したもの。
HTTP(プロトコル)全てを実装しているわけでは無い。

benchmark serverのカーネルパラメータは以下のようにした。

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 2

検証アプリ(プロセス)のfdの上限だが、
stresser serverのip_local_port_rangeは

net.ipv4.ip_local_port_range = 32768	60999

のため、28231 + αってことで30000とした。

ベンチマーク記録

stresser serverに
<FW名>-<最大req/sec>-<timestamp>
という形式で保存されている。

エラーが起きなかった最大スループット記録

http://34.85.7.57:8000/hyper/hyper-17000-1549509074130/
http://34.85.7.57:8000/actix/actix-16000-1549507926508/
http://34.85.7.57:8000/tokio/tokio-20000-1549506024698/

当然だが 自前実装(不完全HTTP) > hyper > actix-web となった。
失敗したケースは処理が詰まってgatling側でレスポンスタイムアウトになったケースばかりで、too many open file 等は確認されなかった。

最後に

actix-webはactix上に構築されているのでその分オーバヘッドがあり、内部的にもhyperと同じくhttparseを使用している為不利なのは確かでそのままの結果になった。

httparseのissues(seanmonstar/httparse#18) でも述べられているが、
httparseはparseのたびにbyte配列を最初から最後までparseし直さないといけないので効率が悪い。
これを改善したライブラリを作るか、httparseを改善すればもっと早いFWが作れるかも?と思った。

@arimitsu-koichiro
Copy link
Author

28231 + αってことで30000とした。

fdの値だが、30000としなくても17000くらいあれば秒間15000reqくらいは捌けたため、
その点でもfdを過剰に掴んでいるとは思えなかった。

@inoue-yuri
Copy link

レスポンスを返す前に sleep させる実験もしてみたいところですね...
あと nodejs も気になります 💦

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment