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が有効っぽい。
sentinel.confの隠し(?)設定
デフォルトでは出てこない、コメントアウトもされていないけど以下は効いた。
logfile "/var/log/redis/sentinel.log" daemonize yes
ベースはRedisだし、使いまわせる設定が他にもありそう。
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
perlやreadlineなどは先に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
$ 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
- 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便利でよく使うんだけど、VirtualBoxでMBAだと爆音激熱状態でちょっとつらい。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で開発してもよいのだけれど、使えるんならローカルのIDEやGUIのツールやらを使いたい。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