それでも気分は高専生

元高専生が自分のやってきたことを記事として残すためのてきとーなブログ

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のスレッドモデルの詳細は知らないが、スレッドが長時間ブロックされるとクラスタのヘルスチェックが失敗するので、負荷がかけられなくなる。

また何かこまったことがあったら追記する。