カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

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だけの改変スクリプトを、計測前にしばらく走らせておいてもよかったかもな。こういう地道な対策がやっぱ上位との差になるのかなと。

某ばばさんには勝ったものの不完全燃焼すぎたので、勉強して再度チューニンガソンリベンジできたらと思います。