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 サーバーに負荷をかけられるようになった。