全力で怠けたい

怠けるために全力を尽くしたいブログ。

K6 を実行したら "connect: cannot assign requested address" がでたときにやったこと。

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 オプションを指定しなければ k6TCP コネクションを再利用するようになるので解決できる……のだが、理由があって 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 サーバーに負荷をかけられるようになった。