kmuto’s blog

はてな社でMackerel CREをやっています。料理と旅行といろんなIT技術

勝ったッ!第3部完! HTTPリクエストをスケジューリング実行するやつを作った

LB+EC2のオートスケールを制御・可視化させる旅、ついに完結。ご愛読ありがとうございました、id:kmuto 先生の次回作にご期待ください。

第1部はMackerelのホストメモに書いたら何かを実行するという仕組み作り。

kmuto.hatenablog.com

第2部はHTTPリクエストパスで受け付けるとstressコマンドで負荷を自分にかける、アブないWebサーバーの実装。

kmuto.hatenablog.com

そして今回の第3部では、リクエスト粒度を指定して、ロードバランサーに対してリクエストするデーモンを実装。

github.com

時間ごとのおおまかなリクエスト回数を設定しておくと、少しランダムに回数を調整しながらHTTPリクエストを実行する。あまり細かすぎると指定が面倒なのと、いずれにせよオートスケールが反応してくるまでは時間がかかるので、5分単位でひとまず設定している(1分単位で指定することもできる)。

READMEにも書いているけど、設定はたとえばこんな感じ。

LB_URL = 'http://alb.internal.example.com/stress/1/5'
MINUTES = 5
MINUS_RANGE = 5

@config = {
  'lowload' => [20],
  'highload' => [90],
  'spike' => [90, 90, 100, 90, 20, 20, 20, 10, 10, 20, 20, 10, 10, 20],
  'smallspike' => [100, 50, 20, 20, 10, 10, 20, 20, 10, 10, 20],
  'wave' => [20, 20, 30, 30, 40, 40, 50, 50, 60, 60, 70, 70, 80, 80, 90, 80, 80, 70, 70, 60, 60, 50, 50, 40, 40, 30, 30]
}

DEFAULT_MODE = 'smallspike'

smallspikeであれば[100, 50, 20, 20, 10, 10, 20, 20, 10, 10, 20]がリクエスト設定で、1分目〜5分目は「100 - (ランダムに0〜5) 回のリクエスト」を毎分実行、6分目〜10分目は「50 - (ランダムに0〜5) 回のリクエスト」を毎分実行、……となる。最後まで進んだらまた最初に戻る。

ホストメモを見て判断しているので、たとえばlowloadとホストメモに書いたら、「20 - (ランダムに0〜5)回のリクエスト」が毎分実行されるように変化する。

パワーのないバックエンドを前提にしているため、実行するリクエスト数はかなり少ないものになっている(サンプル設定では多くて100/分)。

何かの本番Webサービス向けなどにもっと多いものにすることができるかどうかは、saba-load-requesterを実行する環境での許容度によってくる。大量のGETリクエストを1箇所で発行すると、送信側なり経路なり受信側なりでブロックされる可能性もある。

たとえばmkrの呼び出しのところをいじって、環境変数MACKEREL_APIKEYおよびホストIDを指定しておけば、別に自身のmackerel-agentに頼らずともどこでもホストメモを見られるので、リクエスタを分散して制御するという手法もとれるだろう。……ってなんてDDoSシステム?