サバフェス で使ったツールやワンライナー

サバフェス時のベンチマークツールだったり、ログ確認だとかで使った小技をまとめます。

http_load

ベンチマークツールの1つです。
最初はこれでGETのベンチマークを取ってました。
後述するab (apache bench)じゃなくてなぜこっちを使ったのか、ですが「先輩が研究室のサーバに入れてくれていた」からです。
abもapache入れた時点で入ってるってことを知ったのは、恥ずかしながら競技後半でした。

使い方は以下の感じ
[bash]
$ cat url_file
http://example.com
$ http_load -second 10 -rate 200 url_file

[/bash]

上のコマンドでは、毎秒200リクエストを10秒間送る、っていう意味です。
-parallelとか-fetchesとかいろいろ指定の方法はあるみたいです。
僕は、もっぱら上記な感じでベンチマークとってました。

http_loadを使っていて感じた点ですが、abの時と違ってリアルタイムにエラーログが出力されます。
byte count wrong
とか
Operation already processing #=>確かこんな感じなログ
みたいなのがレスポンス返ってくると同時に標準出力に出力されます。

ちなみに、byte count wrongってエラー出た時は、以下で対応してました。
[bash]
$ rm -rf /var/cache/nginx/cache/*
$ service nginx restart

[/bash]

http_loadの微妙な点は、POSTのベンチマークができなかった点です。
やり方分からないので、知ってる方が居たら教えて頂きたいです…。
結局、POSTのベンチマークはabでしました。

ab (apache bench)

こちらではGETのテストはあまりしなかったような気がします。

使い方は以下の感じ
[bash]
# 同時接続100の状態で10秒間GETリクエストを送る
$ ab -c 100 -t 10 http://210.140.145.136/

# 同時接続100の状態で10秒間POSTリクエストを送る
$ ab -c 100 -t 10 -p post_data_file -T "application/x-www-form-urlencoded" http://example.com/wp-comments-post.php

[/bash]

abではPOSTのテストができます!
POSTのテストができます!!!

-pでPOSTするデータを入れたファイルを指定
-TでhttpのContent-typeのheaderを指定します。
上記の内容で、POSTのheaderになります。
ちなみにPOSTするデータを入れたファイルはurlエンコードする必要がありますので、
comment_post_ID=5&comment_parent=0&author=yota&email=aiueo&url=http%3a%2f%2fserverfesta%2einfo%2f&comment=aiueo
こんな感じにしてました。

dstat

yum install dstat すると入るとても良い感じなツールです。
是非。完

じゃなくて、dstatは結構便利なので使ったこと無い方とか、是非使ってみることをオススメします。

ログチェック

lessで見てます!(キリッ
じゃなくて、もっと便利に楽にログをチェックしたいです。
そんなときはワンライナーですよね!!!

nginxのaccess_log

httpdのaccess_logは見慣れた人は分かる通り、以下のようになっています。
[bash]
$ tail -n1 /var/log/nginx/access_log
ipaddr – – [24/Nov/2013:22:49:20 +0900] "GET / HTTP/1.1" 200 47014 "-" "Cloud Server Festa Benchmark" "-"
[/bash]

欲しい情報は、どれくらいGETのレスポンスを返したのか、っていう情報でした。
ということで、ログチェックするときは以下の感じでした。出力も載せています。
[bash]
$ grep "^210" /var/log/nginx/access_log | cut -d] -f2 | sort | uniq -c
39 "GET / HTTP/1.1" 200 20278 "-" "Cloud Server Festa Benchmark" "-"
2 "GET / HTTP/1.1" 200 43446 "-" "Cloud Server Festa Benchmark" "-"
75321 "GET / HTTP/1.1" 200 47014 "-" "Cloud Server Festa Benchmark" "-"
3 "GET / HTTP/1.1" 200 47022 "-" "Cloud Server Festa Benchmark" "-"
9 "GET / HTTP/1.1" 200 47029 "-" "Cloud Server Festa Benchmark" "-"
4 "GET / HTTP/1.1" 200 47037 "-" "Cloud Server Festa Benchmark" "-"
1 "GET / HTTP/1.1" 200 47045 "-" "Cloud Server Festa Benchmark" "-"
5455 "POST /wp-comments-post.php HTTP/1.1" 302 5 "-" "Cloud Server Festa Benchmark" "-"
60 "POST /wp-comments-post.php HTTP/1.1" 499 0 "-" "Cloud Server Festa Benchmark" "-"
[/bash]

これでだいぶログのチェックが楽になりました。

netstatの監視

あと、POSTのスコアが増えないなー、っていうときには以下の感じでnetstatの監視をしていました。
[bash]
$ while sleep 1; do netstat -atn | grep 3306 | uniq -c ; done
#=>追記: uniq -c じゃなくて、 wc -l でした…
[/bash]
これで毎秒、3306ポートへのアクセス数を取得することができます。
これは結構やっつけで、LocalとForeignの違いだとかはチェックしてないなどの問題はありますが、「おおまかな値は分かる」っていうことでw

awkとか使えば良い感じかもしれませんね。
ってことでやってみます。以下な感じ。
[bash]
$ while sleep 1; do netstat -atn | awk ‘BEGIN{i=0};$4~":3306$"{i++};END{print i}'; done

[/bash]

whileとsleep

whileとsleepの組み合わせ技はとっても便利です。
[bash]
$ while sleep 1; DO CMD; DONE

[/bash]
この書き方です。
たったこれだけで毎秒何かの動作をさせることができます。
様々な場面に使えるような気がするので覚えておいて損は無いはず!

まとめ

シェル楽しい ✌(‘ω'✌ )三✌(‘ω’)✌三( ✌'ω’)✌