share facebook facebook2 twitter menu hatena pocket slack

2014.09.07 SUN

Siege でお手軽 Web 負荷テスト(3)〜 fluentd + dstat + graphite でお手軽可視化 〜

川原 洋平

WRITTEN BY川原 洋平

どうも、かっぱ (@inokara) です。

引き続き…

Siege でお手軽 Web 負荷テストシリーズ宜しくです。

負荷テストの観点(超私的)

超私的な負荷テストのざっくりとした観点です。

  • どんな負荷を掛けたか?
  • そして、その結果は?
  • テスト対象のリソース変化は?

これらを全て fluentd と Graphite を利用して可視化してしまいたいと思います。

どんな負荷を掛けたか?、そしてその結果は?

Siege を利用して連続的に負荷を掛けます。

siege

以下のように実行して負荷を掛けます。

/usr/local/bin/siege -c 100 -r 1 --time=10m --log=/tmp/siege_log --benchmark https://example.inokara.com/

siege に関して過去に書いた記事を御覧くださいませ。

siege + fluentd + in_tail

siege のログ(/tmp/siege_log)は以下のようなログが出力されます。

      Date & Time,  Trans,  Elap Time,  Data Trans,  Resp Time,  Trans Rate,  Throughput,  Concurrent,    OKAY,   Failed
2014-08-26 04:43:48,   4440,      17.14,           1,       0.32,      259.04,        0.06,       83.42,    4440,       0

そしてこのログを以下のような fluentd の設定で監視しちゃいます。

siege.conf

<source>
  type tail
  path /tmp/siege_log
  pos_file /tmp/test.pos
  tag siege.access
  format /^(?<date>(d{4})-(d{2})-(d{2}) (d{2}:)(d{2}):(d{2})),s{0,}(?<Trans>d+(.d+)?),s{0,}(?<Elap_Time>d+(.d+)?),s{0,}(?<Data_Trans>d+(.d+)?),s{0,}(?<Resp_Time>d+(.d+)?),s{0,}(?<Trans_Rate>d+(.d+)?),s{0,}(?<Throughput>d+(.d+)?),s{0,}(?<Concurrent>d+(.d+)?),s{0,}(?<OKAY>d+),s{0,}(?<Failed>d+)$/
  time_format %Y-%m-%d %H:%M:%S
</source>

<match siege.access>
  type copy
  <store>
    type forward
    <server>
      host xxx.xxx.xxx.xxx
      port 24224
    </server>
  </store>
  <store>
    type file
    path /tmp/siege_log.parsed
  </store>

正規表現がツライっす。

テスト対象のリソース変化は?

テスト対象のリソース変化は dstat を利用します。

dstat + fluent-plugin-dstat で…

テスト対象となるサーバーでは以下のように dstat のメトリクスを fluentd を利用して Graphite サーバーに飛ばします。

dstat.conf

<source>
  type dstat
  tag dstat
  option -d -lcm --tcp
  delay 3
</source>

<match dstat>
  type forest
  subtype copy
  <template>
    <store>
      type map
      tag "dstat.${hostname}.cpu"
      time time
      record record['dstat']['total cpu usage']
    </store>

    <store>
      type map
      tag "dstat.${hostname}.mem"
      time time
      record record['dstat']['memory usage']
    </store>

     <store>
       type map
       tag "dstat.${hostname}.tcp-sockets"
       time time
       record record["dstat"]["tcp sockets"]
     </store>

     <store>
       type map
       tag "dstat.${hostname}.disk-io"
       time time
       record record["dstat"]["dsk/total"]
     </store>
  </template>
</match>

<match dstat.**>
  type forward
  buffer_type file
  buffer_path /tmp/fluent.dstat.buffer
  retry_wait 30s
  retry_limit 5
  flush_at_shutdown true
  <server>
    host xxx.xxx.xxx.xxx
    port 24224
  </server>
</match>

dstat + fluent-plugin-dstat の結果を Graphite で可視化

dstat + fluent-plugin-dstat から以下のようにレコードが飛んできます。

2014-08-30 08:11:46 +0900 dstat.xxx.xxx.xxx.xxx.tcp-sockets: {lis,act,syn,tim,clo}
2014-08-30 08:08:43 +0900 dstat.xxx.xxx.xxx.xxx.disk-io: {"read":"0.0","writ":"51882.667"}
2014-08-30 08:13:48 +0900 dstat.xxx.xxx.xxx.xxx.mem: {"used":"2553696256.0","buff":"29032448.0","cach":"722718720.0","free":"646238208.0"}
2014-08-30 08:13:48 +0900 dstat.xxx.xxx.xxx.xxx.cpu: {usr,sys,idl,wai,hiq,siq}

このレコードを以下のようにして Graphite に飛ばします。各メトリクス毎に fluent-plugin-graphite を呼んでいるのでもう少し効率良い設定がないものかお悩み中。

metrics.conf

<source>
  type forward
  port 24224
  bind 0.0.0.0
</source>

<match dstat.*.cpu>
  type copy
    <store>
      type  stdout
    </store>

    <store>
      type graphite
      host localhost
      port 2003
      tag_for prefix
      name_keys usr,sys,idl,wai,hiq,siq
    </store>

</match>

<match dstat.*.tcp-sockets>
  type copy
    <store>
      type  stdout
    </store>

    <store>
      type graphite
      host localhost
      port 2003
      tag_for prefix
      name_keys lis,act,syn,tim,clo
    </store>

</match>

<match dstat.*.disk-io>
  type copy
    <store>
      type  stdout
    </store>

    <store>
      type graphite
      host localhost
      port 2003
      tag_for prefix
      name_keys read,writ
    </store>

</match>

<match dstat.*.mem>
  type copy
    <store>
      type  stdout
    </store>

    <store>
      type graphite
      host localhost
      port 2003
      tag_for prefix
      name_keys used,buff,cach,free
    </store>

</match>


<match siege.**>
  type forest
  subtype copy
  <template>
    <store>
      type  growthforecast
      gfapi_url http://127.0.0.1:5125/api/
      service ${tag_parts[0]}
      tag_for section
      name_key_pattern .*
    </store>

    <store>
      type graphite
      host localhost
      port 2003
      key_prefix siege.${tag_parts[0]}
      name_keys Trans,Elap_Time,Data_Trans,Resp_Time,Trans_Rate,Throughput,Concurrent,OKAY,Failed
    </store>

  </template>
</match>

暫くすると…

以下のようにリソースの状態が Graphite に…

CPU

Siege: Graphiteによる結果画面_CPU

Memory

Siege: Graphiteによる結果画面_Memory

Disk I/O

Siege: Graphiteによる結果画面_Disk I/O

TCP Scoket

Siege: Graphiteによる結果画面_TCP Socket

Siege について後ほど…

ということで…

fluentd を中心に各種ツールのログをかき集めて負荷テストをお手軽可視化してみました。JMeter のような多機能ではないものガッツリ JMeter 用のリソースを用意することが難しいような場合にサーバーで一般的に動いている(fluentd を含め)ツールで負荷テスト、結果の可視化まで出来るんぢゃないかしらというご提案でした!

元記事はこちらです。
Siege でお手軽 Web 負荷テスト(3)〜 fluentd + dstat + graphite でお手軽可視化 〜