こんにちは!株式会社adingoでエンジニアをしている前田(@brtriver)といいます。
3/24(土)に弊社のパンゲアで開催された "第3弾!いろいろチューニングしてパフォーマンスを競うバトルイベント「チューニンガソン」" に
弊社の岩川(@hogehiko)とペアで参戦し2位に入賞することができました!
TOPのスコアは本当に僅差でしたので、運も味方に付けた結果なのですが、簡単にレポートしてみたいと思います。
事前準備
前日に作戦会議といいつつドイツビールがおいしいお店で二人してただ呑んだくれるという状態で何も準備せずに当日を迎えました。
もしかして、緊張せずに寝れたことが大事だったかもしれません。
もしかして、緊張せずに寝れたことが大事だったかもしれません。
作業分担
お題はblojsomというJavaアプリケーションのチューニングでした。
PHPのアプリでなかったことは想定内でしたが、JavaでTomcat縛りというのは予想していませんでした。
Javaまわりは岩川が詳しいので私はMySQL周りを担当とある程度分業してチューニングをすることに
参考スコアが63だったので、この値を目標にがんばることに。
開始
スタート時のスコアは以下のとおり
Score: 17.844 (get=16.900, comment=0.944(1), check=1.000)
アナウンスでは初期ベンチが23ぐらいと聞いていたのでかなり低いなぁという印象。
最初の準備
設定を色々変更し、アプリケーションの再起動もかなりの回数を重ねるだろうということで
restart.shというシェルスクリプトを用意し、再起動やDBのコメントデータのtruncateなどをあらかじめ用意。
また、どの設定や変更が有効なのかを把握するために、一度の多くの変更は行わずにこまめにベンチを取得するようにしました。
当たり前のことなのですがこのおかげもあって、突然スコアが劇的に下がった場合に原因がわからないということもなく安定していたと思います。
サーバーの状態はtopとvmstatで確認というレベルでした。
チューニングの記録
MySQLの設定は最初からある程度行われている状態でした。
メモリ周りの設定を増やすことでスコアは24.377に。
まだまですね。
そして、スロークエリなども確認したのですが全く出ていないのでボトルネックにはなっていない印象。
java周りでは、Tomcatのメモリを増やして調整することで一気に48.278に!
この時点の中間発表で2位になっていたので、「もしかしたら...!!」という期待をもちつつ気合が入りました。
さらに、Tomcatのスレッド数を減らしたり、MySQLのバージョンを5.5に上げる+スレッド数を調整した結果スコアも60近くになりました。
このころに自身のベンチで最高値を叩いていました。
Score: 63.246 (get=49.400, comment=13.846(14), check=1.000)
しかし、このあと何故か60台を超えることなく、50台をさまようことに....
だいたい思いつく施策はやった感があったので、あとは本番の計測でベストな値を出すためにはどうすればよいか?という点を相談していました。
ベンチ結果は複数回実行するとスコアに変化が見られました。
作業開始当初はアプリケーション再起動後に複数回ベンチを叩くことでスコアが上昇する傾向だったのが、
JVMを6から7に上げたあたりから再起動後最初のベンチが一番良いスコアを叩く傾向に変わって来ました。
直接の原因はわからないですが、本番で一番よい結果を出すには、終了直前にアプリケーションを再起動させて何も触らない状態で終わることだろうと判断。
ラスト15秒ぐらいで一番最初に用意したrestart.shを叩いてあとは神に祈るのみという状態でした。
一番最後に自分たちでベンチした結果は
Score: 59.477 (get=58.499, comment=0.977(1), check=1.000)
結果
2位 hogehiko & brtriver ペア / 59.486
今回のチューニンガソンはJavaの環境設定をどこまで最適化できるかが大きかったと思います。
nice値の調整などまだまだできることがあったことを考えると優勝できていた可能性があっただけに悔しいです><
nice値の調整などまだまだできることがあったことを考えると優勝できていた可能性があっただけに悔しいです><
5時間という時間制限は想像以上に短く、疲労感もありますが、充実感が半端ないので是非皆さんには参加してほしいイベントです!