チーム「さばかんちゃーはんかれー」でISUCON10に参戦してきました。
今年もこの時期恒例のISUCONに参戦してきました。ISUCONの参加記事しかこのブログで書いていない気がします。
さて今回でなんと5度目の参加です。結果は残念ながら予選敗退で、念願の本線出場とはなりませんでした。 途中までは割と良いペースだったんですが後半伸び悩んでしまいました。
また今回はメンバーで一ヶ所に集まらず、Googleハングアウトで常時繋いでコミュニケーションをとっていました。 意外とスムーズにやりとりできたのですが、細かい確認がしにくかったり微妙にタイムラグが発生したりしていたので、 わずかな時間も貴重なISUCONでは、できるだけ集まってやった方が良いなと思いました。
それではやったことを振り返ってみたいと思います。
開始前まで
当初は10時開始予定でしたが12時予定に延期されたため、会社から参加する予定だった私は家を出る時間を調整し、子供の世話などをしていました。
また、開始まで少し時間がありそうだったので、メンバーと協力してSlackに各種メトリクスを通知できる仕組みを整えていました。
pt-query-digest
や kataribe
、 pprof
あたり分析結果を飛ばせるようにし、最後まで重宝していました。
開始(12:20) - 14:00
開始が12:20に延期になり、開始直後もポータルの不具合でサーバリストが見えなかったり、ベンチが走らせられないような状態でした。
とはいえまずはレギュレーションの読み込みから開始。どこかで聞いたことがあるような名前の不動産のサービスが舞台のようでした。 今まではあまりみたことのない bot からのアクセスの記述があり、未実装機能とのことでした。
サーバにも入れないのでこいつを nginx ではじくことを想定してnginx.confの調整を開始。 しばらくするとポータルは依然として見えないものの、自チームのIPが特定でき、sshできることを確認。 3台目だけなぜかsshできませんでしたが、運営が諸々対応中とのことだったので一旦放置。
ソースコードや各種ミドルウェアやOSの設定をgitにあげ、ビルドやデプロイ環境を整えていました。 とりあえずブラウザからアクセスしてみて機能を確認。 なぞって検索ってこれはヤバそう…となりました。(最後まで苦しめられました)
13:30頃にポータルも復活し、初回ベンチを実行。スコアは472でした。
14:00 - 16:00
とりあえずpprofをみてみたところjsonエンコードが重そうということでエンコーダを入れ替え。
またpt-query-digest結果の上位のクエリに対してとりあえずインデックスを貼りました。(estateのrent, chariのprice/stockあたり)
ちなみにインデックス効果のチェックのため、ローカルのDBにinit.shでデータを突っ込み、explainしながら確認していました。
このときのスコアが629。
16:00 - 18:00
search、特にnazotteが異様に遅い。とりあえずestateの緯度経度のインデックスを貼ったりしていました。
また前回の反省を踏まえ、AppとDBのサーバの分離を開始。1台目はそのままリクエスト受け、2台目をDBサーバとしました。 この時、別IPの接続をDBが受けれなかったため、bind-adressを外したり、DBユーザにIP許可を追加したりしました。
この時のスコアが713。
18:00 - 20:00
引き続きnazotteと格闘。クエリを削ってアプリケーションを改善し、スコアが1000台にのる。
ここで負荷はDBが支配的だったためレプリケーションを組むか検討。しかし残り時間で組み切るにはリスクが大きいため断念。 またsshできなかった3台目がまだつながらなかったため運営に問合せ。すぐに修正して頂きました。 (終了後、他チームの方がそもそもテーブル別にDBを分割してたと聞いてなるほどなーって感じでした)
20:00 - 21:00
最後までnazotteと格闘。DBのバッファサイズを調整したり、ログを切ったり、アプリケーションを細かく調整したりしてベストスコア1397まで行きましたが、 逆転の一手を打つため試行錯誤するも届かずフィニッシュ。
感想
今年もめちゃくちゃ疲れましたが、非常に楽しかったです。 例年よりもコード量が抑えられている割に思ったようにスコアをあげるのが難しい素晴らしい問題でした。
また今年は参加チームも非常に多く、運営の皆さんがすごく奮闘しておられました。大変にありがとうございました。
そして @matsukaz と @kz_morita は三度も一緒に戦ってくれ感謝の限りです。本戦に連れていけないのはひとえに自分の力不足を感じて申し訳なく思います。
また腕を磨いて挑戦したいと思います!