locustで負荷試験を実施する際のTips
locustで負荷試験をする際に苦労したことをメモ書き程度に書き留めていく。
(locustやpythonに慣れ親しんだ人には常識かもしれないが...)
RPSを固定するときはconstant_throughput/constant_spacingを使う
想定負荷をかけたときの対照システムの挙動をみたいときなど、RPSを一定に保ちたい時がある。
sampleなどを探してもいまいち見当たらないが、constant_throughput/constant_spacingという関数があり、wait_timeを指定する際に使うと面白いほどRPSが安定する。
API — Locust 2.5.0 documentation
FastHttpUserを使う
HttpUserより早いFastHttpUserが存在し、そちらを使うことでより高いパフォーマンスを出せることがある。
リソースが余っているのにRPSが頭打ちになっている場合、FastHttpUserに切り替えることで解決することがある。
Increase performance with a faster HTTP client — Locust 2.5.0 documentation
getメソッドにパラメタを渡す際にはname引数を渡す
リクエストを投げる際にgetメソッドへリクエストパラメタを付与する場合(ex. /hoge/foo?var1=piyo&var2=bar)、locsutのstaticsはパス毎に集計されるため異なるリクエストパラメタは全て異なるパスとして集計される。
以下の例のようにname引数を指定することで、'/hoge/foo'へのリクエストはどんなリクエストパラメタを渡されても同じパスとして集計されるようになる。
self.client.get('/hoge/foo', params={'var1': 'piyo', 'var2': 'bar'}, name='/hoge/foo?[params]')
API — Locust 2.5.0 documentation
with文を使わずcatch_response=Trueを指定しない
リクエスト時にwith文を使わずにcatch_response=Trueの引数を指定するとリクエストが流れなくなる。
on_startで時間のかかる処理を実施しない
大きなファイルを読み込むなど、時間のかかる処理を行う場合はon_startではなく、initイベントに登録した関数を使う。
on_startはuserがスポーンするたびに実行されるが、initイベントはノードが起動した場合に実行される。
Writing a locustfile — Locust 2.5.0 documentation
長時間スレッドをブロックしているとworker→masterのヘルスチェックが失敗する
大きなサイズのファイルを一気に読み込もうとすると、ディスクIOがスレッドを長時間ブロックしてしまう。
locustのスレッドモデルの詳細は知らないが、スレッドが長時間ブロックされるとクラスタのヘルスチェックが失敗するので、負荷がかけられなくなる。
また何かこまったことがあったら追記する。