ISUCONに初参戦して砕け散ってきました
初ブログということで、テーマは先日初参戦したISUCONについて。
ISUCONはWebサービスを限界まで高速化を図るチューニングバトルです。
クライアントからサーバサイドに転向して約1年が経とうとしているので、力試しも兼ねて参加しました。
チームは自分含め3人。メンバーのdo7beが書いたブログは以下になります。
ISUCON5予選で最高スコア1万弱を出しました - do7be.exports
役割
役割はそれぞれ分けて、
- ミドルウェア
- DB
- アプリケーション
として、自分はミドルウェアを担当しました。
特段ミドルウェアの領域に強いという訳ではないのですが、他のメンバーの実力を最大限発揮できることと、自分自身もっと強化したいと思っていた領域なので丁度よいかなと。
やったこと
時系列で以下のようなことをやりました。
開始前
- 自社オフィスに集合。みんなかなり早く集まったようで、メンバーから生存確認の連絡を受ける。
- 設定ファイルやソースの運用方法を確認。
- 鍵やインスタンスの確認。
10〜12時頃
- インスタンスを他のメンバーが準備している間にレギュレーションを読み込む。
- 鍵がうまく登録できずトラブル。作り直して無事入れるようになる。
- 言語の設定確認。PHPでいく方針だったので、systemdに戸惑いながらも初期のRubyからPHPに切り替えて、benchを流す。
- 各種設定ファイルをリポジトリの管理下に置く。
11〜14時頃
- kataribeをインストール。nginxのアクセログを収集し分析する。重いアクセスにあたりをつける。
- pt-query-digestをインストール。DBのslow queryを全クエリ対象にしてログを収集。分析してDB、アプリケーション担当に共有してやばそうなクエリにあたりをつける。
- nginxの設定をチューニング。
- メンバーがコツコツクエリやアプリケーションを修正してじわじわスコアがあがりはじめる。2000点くらい。
14〜16時頃
- ページレベルでnginxのキャッシュができないか試行錯誤する。結局今回のシステムでは決定的な改善ができそうになく断念。かなりの時間を使ってしまった。
- その間にもメンバーがクエリ改善。6000点くらいまであがり、暫定10位前後で遷移。
16〜17時頃
- 改めてDBのログを収集し、最後の調整に入る。
- sysctl.confでTCP周りの設定を調整する。
- メンバーがクエリを結構大胆に変更したりして、10000点弱までスコアが伸びる
17〜18時頃
- 再起動テストをするとスコア激減してあせる。my.cnfが反映されていなかったことが発覚するが、反映しても再起動後スコアが落ちる。
(終了後にmysqlのウォームアップが原因と知りとても悔しかった) - php7を入れたくなる衝動にかられるが、メンバーに止められやめる。
結果
最終スコアは7000点ぐらい(詳細は記録し忘れました)
最高スコアが10000点弱いってるだけに悔しかったです。またやたらと「タマキ」が表示されてbench結果が伸びない事象に遭遇し苦しめられました。ほかのチームも結構でててたみたいですね。
まとめ
ISUCONに初参戦し、見事に砕け散りました。
個人的にはWebに対する知見があまりないなか思ったより戦えたように感じ、少し自信がつきました。
もともとは3,4ヶ月前にくらいから同じ社内のメンバーの呼びかけで過去問を解いたりして勉強をしてきたのが予選で大きく役にたったと思います。
めちゃくちゃ疲れましたがとても楽しかったです。来年もあるなら参加して予選突破を目指したいと思います!