TKC Works

ギジュツ的なメモ、読書感想文など

Webサイトの負荷テスト参考記事など

apache bench

http://blog.verygoodtown.com/2012/05/apache-bench-ab/

wrk

http://memo.yomukaku.net/entries/kYIVkXx

jMeter

http://www.techscore.com/tech/Java/ApacheJakarta/JMeter/index/ http://sy5.sakura.ne.jp/jmeter/ref/


秒間どれくらい処理が出来るか見たくてパラメータを変えながら実行するんだけど、それぞれ微妙に意味合いが違うので注意が必要。
例えば-cだけどヘルプで見ると、

  • ab
    -c concurrency Number of multiple requests to make at a time
  • wrk
    -c, --connections <N> Connections to keep open

になっている。
abはガチで瞬間的に同時にアクセスしているっぽくて、c=50くらいでssl入れてロードバランサにしたNginxサーバ(EC2 m1.small)のCPUが即吹き飛んだ。

jMeterはそもそもパラメータが違う、スレッド数とかRamp-Up期間の考え方はここが参考になる。
http://keis-software.com/2013/09/02/jmeter-%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%951-ramp%EF%BC%8Dup%E3%80%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E6%95%B0%E3%80%81%E3%83%AB%E3%83%BC%E3%83%97%E5%9B%9E%E6%95%B0%E3%81%AE%E8%AA%A4/
スレッドの開始時間がばらされるので完全な同時アクセスとはいかないけど、Ramp-Upを1でスレッド数を高めにすると瞬間的な負荷もそれなりにかけられる。

秒間で考えると実際のアクセスに近いのはabよりはwrkやjMeterのような気がする。

6/4追記
jmeterのHTTPリクエストでKeepAliveを有効にしていたための勘違い。
abは-kオプションを付ける必要がある。
wrkは常にKeepAliveが有効っぽい。

OpenRestyに乗り換え

以前こんなエントリー書きまして、ちょっとしたAPIを作っていたんですが、
redis2-nginx-moduleがRedis2.0までのコマンドにしか対応しておらず、SCANとか新しめのコマンドが使えない自体に。。
まあページトップに大きく2.0と書いているし、GitHub見ても開発も止まってるぽいので早く気づけよ自分としか言えない。。

開発者ののagentzhさんがこちらのOpenRestyを開発しているようなので乗り換えることに。

このOpenResty、非常に便利でnginxをベースに必要そうなモジュール類がほぼ全部入りな感じ。lua-nginx-moduleも入っているのでこれまでのコードも使いまわせる。 インストールも簡単で公式通りにやるだけ。

wget http://openresty.org/download/ngx_openresty-VERSION.tar.gz
tar xzvf ngx_openresty-VERSION.tar.gz
cd ngx_openresty-VERSION/
./configure --with-luajit
make
sudo make install

perlreadlineなどは先にyumなどで入れておくこと。
./configure時にオプションで--with-luajitみたいにしてモジュールの追加削除が出来る。

起動は必要なディレクトリとnginx.confを作って、

PATH=/usr/local/openresty/nginx/sbin:$PATH
export PATH
nginx -p `pwd`/ -c conf/nginx.conf

Redisを使うにはこちらのlua-resty-redisで。redis2-nginx-moduleのようにいちいちロケーションを用意せずにluaコード内で呼ぶのでわかりやすくなった。

NginxとLuaとRedisと

NginxはRailsで作ったサービスを公開する時にプロキシとして使うとか、そんな感じでしか使ったことがなかったけど、LuaとRedis組み合わせると何かいろいろ出来そうということでお試し中。この組み合わせならきっと爆速。 http://d.hatena.ne.jp/hiboma/20120205/1328448746

環境構築


事前にビルドに必要なパッケージをインストール(CentOSの場合)
$ yum install gcc make pcre-devel openssl-devel

次にlua関連を入れる

LuaJIT

$ wget http://luajit.org/download/LuaJIT-2.0.3.tar.gz
$ tar xzf LuaJIT-2.0.3.tar.gz
$ cd luajit-2.0.3
$ make && make install

Lua CJSON(jsonを扱いたい場合のみ)

$ wget http://www.kyne.com.au/~mark/software/download/lua-cjson-2.1.0.tar.gz
$ tar xzf lua-cjson-2.1.0.tar.gz
$ cd cjson-2.1.0
$ make install LUA_INCLUDE_DIR=/usr/local/include/luajit-2.0

※LuaJITで動かしている場合はオプションでディレクトリを指定しないとこける

lua-redis-parser(redis2-nginx-moduleとセットで使う)

$ wget https://github.com/agentzh/lua-redis-parser/archive/v0.10.tar.gz
$ tar xzf v0.10.tar.gz
$ cd v0.10
$ make install LUA_INCLUDE_DIR=/usr/local/include/luajit-2.0
$ make install

次にNginxを入れる 下記の追加モジュールを入れるのでパッケージ管理ではなくnginxをソースからビルドする
https://github.com/chaoslawful/lua-nginx-module
https://github.com/agentzh/redis2-nginx-module
https://github.com/simpl/ngx_devel_kit/

予め各モジュールをダウンロードして展開しておく

$wget https://github.com/chaoslawful/lua-nginx-module/archive/v0.9.7.tar.gz
$ tar xzf v0.9.7.tar.gz

$wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz
$ tar xzf v0.2.19.tar.gz

$wget https://github.com/agentzh/redis2-nginx-module/archive/v0.10.tar.gz
$ tar xzf v0.10.tar.gz

Nginxをダウンロードしてビルド

$ wget http://nginx.org/download/nginx-1.5.13.tar.gz
$ tar xzf nginx-1.5.13.tar.gz
$ cd nginx-1.5.13
$ export LUAJIT_INC=/usr/local/include/luajit-2.0
$ export LUAJIT_LIB=/usr/local/lib
$ ./configure \
    --add-module=/path/to/lua-nginx-module \
    --add-module=/path/to/ngx_devel_kit \
    --add-module=/path/to/redis2-nginx-module
$ make -j2
$ make install

※ソースからなので起動スクリプトは自前で作成する必要がある
※起動時にlibluajit-5.1.so.2が無いと怒られた時はシンボリックリンクを作成する ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2

参考URL http://jsoizo.hatenablog.com/entry/2013/08/25/214920
http://d.hatena.ne.jp/toritori0318/20131112/1384278264

とまあここまで書いてきたけど、OpenRestyというのが全部入りっぽいので楽そう。

使い方


公式ドキュメントを見れば分かる通り、lua-nginx-moduleには使えるディレクティブが大量にある。
よく使いそうなのはこのあたりだろうか。
(ngx.*はcontent_by_luaやcontent_by_lua_file内でしか使えないので注意。)

  • content_by_lua_file
    • luaファイルを分けたほうがconfが長くならなくてよい。
  • init_by_lua
    • ライブラリのrequireとかはここで。serverより前に書く。
  • lua_package_path
    • 自作ライブラリはパス指定しないと見つけてくれないかも。
    • lua流の書き方で"/usr/local/nginx/lib/?.lua;;"こんな風に書く。
  • ngx.location.capture
    • 内部で別locationの結果を取ってこれる。処理を分けれて便利。
  • ngx.say
  • ngx.exit
  • ngx.req.get_uri_args
    • リクエストパラメータが取得出来る。uri decodeもやってくれている。

まあそんな感じで。

VagrantとDigitalOceanを試してみた

http://blog.glidenote.com/blog/2013/12/05/digital-ocean-with-vagrant/

このエントリーを参考にVagrantでDigitalOceanを使うのを試してみた。

Vagrant便利でよく使うんだけど、VirtualBoxMBAだと爆音激熱状態でちょっとつらい。Chefをちょっと使えるようになってきたし、ゲストマシンはAWSとかDigitalOceanにして開発環境も使い捨てにしようかと思っている今日このごろ。

やり方は上記エントリーのもあるようにDigitalOceanのアカウントを作って、 vagrant-digitaloceanをインストールして、Vagrantfileに必要な情報を書いて、
$ vagrant up --provider=digital_ocean
するだけでよい。
export SSL_CERT_FILE=/usr/local/opt/curl-ca-bundle/share/ca-bundle.crt
はVagrantfileに

provider.ca_path  = '/usr/local/opt/curl-ca-bundle/share/ca-bundle.crt'

こう書いてもよい。

Vagrantを使う理由の一つにSynced Folerがある。サーバーにsshで入ってVimで開発してもよいのだけれど、使えるんならローカルのIDEGUIのツールやらを使いたい。VirtualBox以外ではどうするんだ?と思っていたらRsyncでいい感じに出来るらしい。
http://www.1x1.jp/blog/2014/03/vagrant-rsync-synced-folder.html

さすがに少しタイムラグを感じるけど勝手に同期してくれるのは助かる。 rsync_autoはデフォルトtrueと書いてあるけど、なんか動かなかったのでVagrantfileにきっちり

config.vm.synced_folder ".", "/vagrant", type: "rsync"

のように書いて、$ vagrant rsync-autoを実行するのがよさげ。

あとはChefなりPuppetなりでprovisioningして環境を整えて作業開始。そして
作業が終わったらすぐに消す
$ vagrant destory