「お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトル、それがISUCONです。過去の実績も所属している会社も全く関係ない、結果が全てのガチンコバトルです。」(公式説明)であるISUCON5のオンライン予選に参加してきました。
メンバーは、CTFの時のメンバーと同じく、チーム竹田氏の、
- @__math
- @misodengaku
- @chibiegg (自分)
で参加しました。3人参加が上限なので、いつものメンバのきひろちゃん (@aki33524) も含めた4人のうちから3人で出場しました。
ISUCONは Iikanjini Speed Up Contest の略で、Webアプリケーションがデプロイされたイメージを渡されて、その上で何をしてもいいからとにかくパフォーマンスを上げることが競技内容です。
オンライン予選
今回はイメージと競技マニュアルをもらった時点で次のことがわかっていました。
- Ubuntu 15.04
- フロントはNginx
- アプリケーションは次の言語で実装されてる (どれか好きに選んでもいいし、書き直してもいい)
- Ruby
- Perl
- Python
- PHP
- Java (正常に動作しない)
- GoLang (正常に動作しない)
- Scala (正常に動作しない)
- DBはMySQL
- インスタンスはGoogle Cloud Platformのn1-highcpu-4 (vCPU x 4、メモリ 3.6 GB)
今回パフォーマンスを上げるアプリケーションはこちら!
その名も ISUxi!足跡機能もあって、どこかでみたことあるアプリケーションです。
これが超絶重い…特にトップページなんかかなり待たされます…これを最適化してくわけですね。
大まかにやったことは以下のような感じです。
- 設定関係
- gunicornをUNIXソケットに
- MySQLへの接続をUNIXソケットに
- 静的ファイルはNginxで提供
- ファイルディスクリプタ数の上限変更
- 各種プロセス数の調整
- MySQLの一時ディレクトリをRAMディスクに移動
- MySQLの各種パラメータ調整
- アプリケーション関係
- ユーザーテーブルを全てオンメモリで持つ (変更が無く、5000レコードしかなかったため)
- 各種SQLの最適化
- ロジックで判定しているところをSQLで判定させるとか
- 1レコードずつ取得するようなことが無いように
- あしあとテーブルのスキーマ変更
- etc…
ISUCON4は結構設定まわりのチューニングだけで本戦出場できる感じだったのに対し、今回はアプリケーションの規模も大きく、実装の方にも手を出さないと本戦出場できなさそうな感じになってました。
途中はMySQLのクエリログを全て取得して、スコアのために測定される1分間でどこのクエリが時間を占めているのかを調査してそこから潰していきました。
特にトップページがLIMIT 1000とかのSQLを3回も吐いてるのでかなり重く、トップページを改善するだけで1万点以上上がったのではないかと思います。
あとはあしあとテーブル。記事にアクセスがあるたびにレコードが追加されるのですが、これを日付、アクセスユーザー毎にGROUP BYしてSELECTするのでとっても重いのです…
こちらは (ユーザーID、アクセスユーザーID、日付、最終アクセス日時) の形にスキーマを変更し、あしあとは INSERT…ON DUPLICATE KEY UPDATEにすることで、 SELECT時のパフォーマンスをかなり改善することに成功しました。
こんな感じで進めていくことで、最初はもたついていたISUxiもとっても快適に動作するようになり、スコアも16000点以上出すことができました。
最後に再起動テストをしたのですが、なぜかスコアが下がってしまって、最終スコアは14795点になってしまったのですが、無事263チーム中12位で予選通過することができました!
たぶんPython+MySQLのデフォルト構成のままではこれぐらいのスコアが上限なきがしますので、かなり健闘した方だと自負しています。
ほんとはRedisにデータを載せ替えたり、もっとオンメモリで処理したかったのですが、それは本戦で頑張ることにします♪
コードはGitで管理していて、ブランチ切って作業して、テストケース通ったらmasterにマージってしていたのですが、最後のほうはもう直接masterにマージしちゃってますね笑 (コミットユーザは合ってません)
おまけ (準備編)
去年の傾向から、MySQLを使うのだろうなとは思っていたので、事前に別のインスタンスでPHPMyAdminを用意してました。
これがデータ構造を把握したり、ちょっとSQLを試したりするのに超便利で、準備しておいてよかったものNo.1かもと思ってます。
コメントを残す