HelloControllerを持つ簡単なSpringブートアプリケーションを作成しました。
Get API: http://localhost:8080/hello
Response: Hello World
これで、上記のget APIにヒットする10万人の同時ユーザーを持つJMeterスクリプトを作成しました。 JMeterスクリプトを実行すると、3万カウント後にエラーが発生し始めます。
Java.net.NoRouteToHostException: Cannot assign requested address (Address not available)
この理由は何ですか?この問題を解決するにはどうすればよいですか?
Lakshmi Narayan answer に従って、利用可能なポートを増やすことができます。
解決:
- 以下のコマンドを使用して、ローカルポート範囲を拡大しました。
echo 1024 65000>/proc/sys/net/ipv4/ip_local_port_range
これにより、より多くのローカルポートを使用できます。
- 以下のように、TIME_WAITソケットの高速リサイクルを有効にします。
$ Sudo sysctl -w net.ipv4.tcp_tw_recycle = 1
デフォルトでは、
cat/proc/sys/net/ipv4/tcp_tw_recycle
出力:0(デフォルトでは無効)
本番環境で有効にした場合は注意してください。これはJmeterの負荷テストにのみ使用される内部環境およびマシンであるため、リサイクルを有効にして問題を解決しました。
- 以下のようにソケットの再利用を有効にします。
$ Sudo sysctl -w net.ipv4.tcp_tw_reuse = 1
デフォルトでは、
cat/proc/sys/net/ipv4/tcp_tw_reuse
出力:0(デフォルトでは無効)
注:tcp_tw_reuse設定は、Webサーバーなど、多数の短い接続が開いていてTIME_WAIT状態のままになっている環境で特に役立ちます。ソケットの再利用は、サーバーの負荷を減らすのに非常に効果的です。
高速なリサイクルと再利用を有効にすると、サーバーは単一のUnixボックスで5Kのユーザーロードをサポートできます。