k6 で WEB サーバーに負荷をかけると "connect: cannot assign requested address" みたいなメッセージが表示されたときにやったこと。
k6 run すると "connect: cannot assign requested address" みたいなメッセージが大量に表示される
WEB サーバーに負荷をかけるために k6 run --vus <でかい数> --iterations <でかい数> --no-vu-connection-reuse script.js みたいに k6 run すると connect: cannot assign requested address というメッセージが大量に表示される。
表示されているメッセージを見た感じだと k6 がエフェメラルポートを使い尽くしてソケットをバインドできていないっぽいので k6 run しながら TIME_WAIT のポート数を数えてみるとたくさんあった。
やっぱり k6 がエフェメラルポートを使い尽くしてソケットをバインドできていないっぽい。
$ netstat -anp | grep TIME_WAIT | wc -l 28223
ちなみに k6 のバージョンは 0.26.0.
$ k6 version k6 v0.26.0 (2019-12-16T11:07:36+0000/v0.26.0-0-gaeec9a7f, go1.13.5, linux/amd64)
やったこと
k6 がエフェメラルポートを使い尽くしてソケットをバインドできないのは --no-vu-connection-reuse オプションを指定しなければ k6 が TCP コネクションを再利用するようになるので解決できる……のだが、理由があって TCP コネクションは毎回貼り直すようにしたかったので --no-vu-connection-reuse オプションは指定しておきたい。
k6 を実行するマシンは他の用途には使わないので、お行儀がよくないけど TIME_WAIT のポートを再利用するようにした。
$ sysctl net.ipv4.tcp_tw_reuse net.ipv4.tcp_tw_reuse = 0 $ sudo sysctl -w net.ipv4.tcp_tw_reuse=1 $ sysctl net.ipv4.tcp_tw_reuse net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_reuse = 1 にしてから k6 run すると connect: cannot assign requested address みたいなメッセージが表示されなくなり、モリモリと WEB サーバーに負荷をかけられるようになった。