第4回チューニンガソン 沖縄サテライトに参加してきました

『反省会、ああ反省会、反省会』
・・・という謎の句でも読みたくなった気分です。まあ、結果は後ほど。

さて、本日行われた第4回チューニンガソンは、あのIT津梁パークにある 株式会社レキサス様の会議室にて行われました。イベント概要はこちら
実はいままで行ったことがなかったので、楽しみにしておりました(むしろそれが主目的!?)。建物はすんごいオサレさんな感じで、とってもいい感じでした(周りには何もありませんでしたが)

で、やっぱり迷いました、スミマセン。最近西島はtwitterを頼りにあまり何も考えずに知らない所に行くので、皆様本当にすみません、迎えに来て頂きました。お手数かけます。。。

会場内では大きい会議室にこんな感じにこじんまりとやっておりました。特にBGM的なものもなく、各自モクモクです。

で、今回のお題は、自分の戦前の予想通り、Ruby on Railsでした。あるCMSの1ページのGET/コメントPOSTをチューニングせよ、とのお達し。
予想してたのなら勉強しておけって声が方々から聞こえそうですが、そこは大人の事情(?)で全く何もせず、いやもうこの時点で自分としては白旗ポカーン( ゚д゚)/~~~でした。

挙句の果てに、本日2012年7月1日はうるう秒が導入されまして、朝(早朝)の時点では問題ないなと思っていた面倒を見ているサーバ群のうち、新しめのサーバ(はっきり言いましょう、Ubuntu12.04のサーバです)群のCPUが100%に張り付くという問題が発生していました。
移動中は気づかなかったんですが、会場に入ってメールを見だしたら「。。。あれ?」てなことで、会場で障害対応の始まりなり、です。
いやもうどうなることかと思いました。

まあそんなこんなでグダグダで始まったチューニンガソンですが、RoRなんて起動したこともないやーと逃げ帰っても良かったんですが、それじゃ悔しい。という訳でお弁当を食べながら(いつもの吉元弁当さんです)、ボチボチと気分を立てなおして行きました。以下、やったことのメモです。

topで負荷を見ながらはじめのベンチ


[ec2-user@ip ~]$ cd /home/ec2-user/bench; sh bench.sh -c 10 -s 10
14 fetches, 9 max parallel, 57526 bytes, in 10.0014 seconds
4109 mean bytes/connection
1.3998 fetches/sec, 5751.78 bytes/sec
msecs/connect: 71.6646 mean, 1001.7 max, 0.045 min
msecs/first-response: 4405.92 mean, 6446.44 max, 904.461 min
HTTP response codes:
  code 200 -- 14
Score: 2.659 (get=1.400, comment=1.259(2), check=1.000)

初期状態はこんなんでした。いやー、ブラウザからコメント書き込みしてみたんですが、尋常ではない遅さでした(笑)
見たところ、Rubyのプロセスがとんでもなく重いようでした。なので、そのあたりを中心に検証し始めました。

設定ファイルを確認しながらのベンチ

config/environments/development.rbはほとんど唯一いじっていいファイルだったので、まずはこのパラメータを1つ1ついじって、結果を検証。必ず、1度に1つのパラメータだけいじって、結果を確認するのは常套手段。
結局、一番効いたのは   config.cache_classes = true だったのかな?
Score: 5.404 (get=3.000, comment=2.404(3), check=1.000)
くらいにはなりました。

  config.assets.compress = true
にすると、無駄にCPUを使ってしまうのか、ローカルのベンチではガクッとパフォーマンスが落ちました。

この段階で、温め(=ちょっと負荷をかけて、その後じゃないと、全然パフォーマンスが出ない)が必要という現象に気が付きました。あんまり負荷かけ過ぎちゃうとCPU死んじゃうので、あれですが。

nginx + passengerを入れてみる

で、そもそもの「rails server」ってこれ多分開発用サーバだよね?と思ったRails初心者は、普通のアプリケーションサーバを探してみます。ググって見つけたのはどうやらpassengerというものがいいらしい、と。WebサーバはApacheかnginxがあるようでしたが、いつも使っているnginxにしてみました。で、この時にRubyも最新版って新しいんじゃね?と思って 1.8系から 1.9系の最新に入れ替えてみようと思いました。
さてココからが迷走の始まりです。 gem install 諸々で入れたものが、1.9系では使えない、というかそもそもバージョンの異なるrubyをどうやってスマートに入れるのか全然知らず。。。 ソースからビルドしてsymlik切り替える、では全然動かず、一時Railsアプリが全く持って動かなくなってました。。。。

コレを何とか頑張って動かそうとするも、結局時間切れで断念、もとの1.8系+nginx+passengerで何とか動くように元に戻しました。
(皆さんやってた「AMIを元に戻してくだせぇ」をしようかと思いましたが、そこは変なプライドで自前で元に戻しました。。。コレも含めてめちゃくちゃ時間の無駄。)

nginxをフロントに、passengerを3001番ポートであげてProxy、という状態で
50 fetches, 9 max parallel, 409566 bytes, in 10 seconds
8191.32 mean bytes/connection
5 fetches/sec, 40956.6 bytes/sec
msecs/connect: 0.14534 mean, 0.55 max, 0.064 min
msecs/first-response: 1633.09 mean, 2278.07 max, 771.239 min
49 bad byte counts
HTTP response codes:
  code 200 -- 50
Score: 8.504 (get=5.000, comment=3.504(4), check=1.000)
とか、なんかそもそもpassengerの使い方がおかしいんでね?という伸び悩み。本当はモジュールとしてnginx内で動くような気がするんですが。。。よく分からず。

バックに3001/3002 と2プロセスあげて、nginxから2つにProxyしてみたものの、ほとんどスコアは変わらず、むーん、、、、と悩んでおりました。

で、最後にしようと思っていたペナルティ覚悟で nginx側でGETはキャッシュしちゃおう、という手段を終わりの10分で仕込んでみたのですが、コレも全然効かず。実際は設定がいまいちだったのですが検証する暇もなくタイムアップ。。。。
ああ、無念。

最終的にはローカルで
sh bench.sh -c 10 -s 10
53 fetches, 9 max parallel, 221074 bytes, in 10 seconds
4171.21 mean bytes/connection
5.3 fetches/sec, 22107.4 bytes/sec
msecs/connect: 0.14566 mean, 0.658 max, 0.064 min
msecs/first-response: 1562.64 mean, 2297.57 max, 747.235 min
49 bad byte counts
HTTP response codes:
  code 200 -- 53
Score: 9.135 (get=5.300, comment=3.835(4), check=1.000)
くらいでしたが、ベスト10にも入れず。。。お前は何をしに来たのじゃ、ううぅ。。。という展開に。

もろもろ大反省

  • 時間がかかる手動で何とかするプロセスを早々に諦め、AMIから元に巻き戻してもらったほうがきっと早かった
  • (上位の方の結果を聞くと)nginxでフロントキャッシュさせるという案は良かったはずだが、設定がヘボかった。精進せよ。。。
  • MySQLのチューニングまで全然手が回らなかった。クエリキャッシュは結構効きそうだったが、それくらいやっておけば良かった。。。
結果は全く持って残念な結果に終わりましたが、レキサスさんのかっくいいオフィスにも入れたし、沖縄サテライトでは一番だったし(ドングリの背比べだけども。。。)、楽しいひと時を過ごせました。運営に回って頂いた @yamanetoshi 様、ありがとうございました&参加者の皆様、お疲れさまでしたーm(_ _)m

次回はWebアプリケーションじゃないっぽいので、そのほうが俄然燃えるかも!?などと最後も言い訳して終わりたいと思いまする。。。