tuningathon 3に参加してきた
来たる3/24土曜、第3弾!いろいろチューニングしてパフォーマンスを競うバトルイベント「チューニンガソン」3月24日(土) 開催! #tuningathon on Zusaarということで、第2回に続き今回も行ってきました。
受付済まして、もらったのは自分のIDとともに書かれたIPアドレスだけ。んで、12時になり、開始ということでレギュレーションの説明がありました。
- blojsomのコメントPOST/GET回数
- 10並列で一定時間行う
- POSTはGETの10倍のスコア(成否も見る)
というものでした。 環境は以下のとおり。
- AWS ap-northeast-1
- c1.medium
- Amazon Linux 2011-02
の一台。 条件として満たさなければいけないのは以下。
- tomcatをフロントにする
- /var/lib/tomcat6/webapps/blojsomをアプリのルートとする
- RDBMSはMySQL
- webapps/blojsom以下の改変はダメ
- Java, MySQL, Tomcatの入れ替えはOK
という感じでした。
今回はbench.shというベンチスクリプトがあって、それを叩けばスコアが出たので、その点は非常に楽でした。
数日前からそろそろ題材としてPHPはないだろう、みなが使ってるものとなるとRedmineあたりは良さそうだし、Passengerをnginxに変えて、よし、みたいな調査とかしてたので、お題聞いたときはまじかーーーーという感じでした…
んで、自分がやったことですが。
- hostname, パスワード替え
- 鍵作成・登録
- まくぶの.ssh/configに設定入れる(ユーザ名とか変更したホスト名とか)
- iTerm2で3タブ開き、一番左をtopなどの統計用、真ん中をベンチスクリプト実行用、一番右を作業用する
- MySQL、Tomcatの起動停止は簡単なシェルスクリプトで。
- vim, sysstat, dstatインストール
これでまず作業環境整えました。 んで、次に調査をしました。
- メモリ
- コア数
- カーネル・MySQLのバージョン確認
- 立ち上がってるプロセス
- その他設定されたミドルウェアのオプションの調査
あたりをずらっと見て、とりあえず構成を頭に入れました。
んで、ベンチスクリプト叩いたら、TomcatのCPUバウンドのスコア16ぐらいがデフォルトという感じ。
これなら、先にMySQLをぱっとやっちゃおうと思って、クエリログ出力、スロークエリ出力、インデックス使ってないクエリの出力、バッファプールやスレッドパラメータの調整をやって、出たきたログ見る。
遅いものは一切なくて、流れてるのも当然似たクエリなので、目星つけてEXPALINして、「CREATE INDEX idx_blog_id ON Blog(blog_id);」だけやって、MySQLは出てくるログも減って平和になったので、ここでMySQLのチューニング終了。大体ここまでで1時間ちょっと。
んで、やっぱJava, Tomcatに手をつけなきゃいかんということで、やった。
最初に入ってるJavaはこんな感じで、VMも入れ替えようかなと思ってやっちゃう。
# java -version java version "1.6.0_22" OpenJDK Runtime Environment (IcedTea6 1.10.6) (amazon-52.1.10.6.41.amzn1-i386) OpenJDK Client VM (build 20.0-b11, mixed mode)
Oracleから最新版JDK落として、
# update-alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_26/bin/java 16026
こんな感じで認識させて、--configで入れ替えて、以下のような感じ。
# java -version java version "1.6.0_26" Java(TM) SE Runtime Environment (build 1.6.0_26-b03) Java HotSpot(TM) Client VM (build 20.1-b02, mixed mode, sharing)
これで一度ベンチ走らせたんだけど、全然変わらん。20台をキープし続けて、どっちにしても大差がなくて、いみねーとこの頃から嘆き始めてました。
じゃー、次はTomcatやるかーと思って、無戦略でTomcat7を入れる。最初はこんな感じで入ってた。
# rpm -qa | grep tomcat tomcat6-servlet-2.5-api-6.0.33-1.26.amzn1.noarch tomcat6-jsp-2.1-api-6.0.33-1.26.amzn1.noarch apache-tomcat-apis-0.1-1.4.amzn1.noarch tomcat6-el-2.1-api-6.0.33-1.26.amzn1.noarch tomcat6-lib-6.0.33-1.26.amzn1.noarch tomcat6-6.0.33-1.26.amzn1.noarch tomcat6-webapps-6.0.33-1.26.amzn1.noarch tomcat6-admin-webapps-6.0.33-1.26.amzn1.noarch
んで、最新版取ってきてtomcat7を動かすのはいいんだけど、blojsomのURLにアクセスすると、catalina.outにずっとJBDCよめねーーーってエラー出てて、jarをいくら動かしても、tomcat7で動いてくれず。
ぐぐったりしながら、色々やったんだけど、いまだなぜ駄目だったか分かってない…
勉強します…
ということでここでかなり時間使ってしまって、もう6でいいやーと開き直って、設定ファイルを見る。/etc/tomcat6以下にあるんだね…
メモリ割り当ててないなーということで、ヒープに1.5GB割り当てて、再度ベンチ。そしたらなんか急にスコア40台たたき出して、あぁここかーと嘆く。
MySQLはそこまで仕事することなかったので、256MBぐらいだけ使ってもらって、あとは全部Tomcatに割り当てる。
あとはスレッド数やコネクションプールの調整をして、なかなか50台にならず、うーむという感じ。
変わらないからTomcat7も何度かリベンジしてたんだけど、結果だめだったなぁ…
そんなこんなで微調整してるあいだにタイムアップ。ほとんど何もできませんでした…
終わりに
@zakiさんが@netmarkjp(ばば)さんにスコア教えてくれたみたいで、僕のスコアは「47.876」でした。上位とは10以上差をつけられ、入賞すらできなくて、反省の残る戦いでございました。
以下反省。
- nice値変えると差が出るとは一切頭になかった
- MySQLのバージョンしか確認してなくて、yumで落としたものと比較してもよかった。確認不足。
- ps aux -LでTomcatのスレッド数みてなかった… おわってる…
- Tomcatのいい感じのメモリチューニングが全然頭に入ってなかった。大体これぐらいだとこういうパフォーマンス出るって指標が頭になかった。Java触れてる身としておわってる…
- 他にもオプションとか全然頭になくて、後手後手だった。
- 外部からリクエスト飛ばして最終スコア見るのに、TCP周り一切みてなかった…
- Tomcat7でアプリ動かせないとかちょっとねぇ… という…
などなど色々反省が。
まぁ、無知で何もできなかったので、勉強しないとと思うチューニンガソンでした。今考えたら、ベンチスクリプトをコピって、JIT温めるためのGETだけの改変スクリプトを、計測前にしばらく走らせておいてもよかったかもな。こういう地道な対策がやっぱ上位との差になるのかなと。
某ばばさんには勝ったものの不完全燃焼すぎたので、勉強して再度チューニンガソンリベンジできたらと思います。