stefafafan の fa は3つです

"すてにゃん" こと id:stefafafan のブログです

ISUCON14 に参加した (5259点くらい) #isucon

今年も参加しました。いつもありがとうございます!
isucon.net


これまでの

分担

  • うちのチームはこれといった決まった分担はなく、初動だけ誰が環境をセットアップして誰が計測ツール入れてという割り振りは決めていますが、それ以降は作戦会議しつつやっています
  • 今年は大きく3つほど取り組んだことがあって、こういう感じになりました:
    • stefafafan: chair_locationsテーブルのクエリをなんとかする。その他細かい改善
    • papix: マッチングアルゴリズム見たり、他メンバーの壁打ち
    • masawada: 通知のServer Sent Eventsのやつを見たり

自分目線でどうだったか

  • 初動はまぁまぁ悪くはなかった、11時の時点でベンチも回し済みでコードもGitHubにプッシュしていて計測結果も出ていてMySQLの負荷が高いことはわかっていた。手でアプリケーションの動作確認も軽く終えていた
  • そのあと取り組むべき課題もわかってよかった
  • ただそれらの課題をやっていくのに手間がかかりすぎていつの間にか終わってしまった..
chair_locationsの件

chair と chair_locations をJOINして距離を出しているクエリあまりにも遅かった (3秒とか) のでなんとかしようとなって、段階的に色々ゴニョゴニョし続けていた..

1. chair_locationsにtotal_distanceカラムを足しつつ、椅子をポストしたタイミングでこのカラムを更新。初期データはpostInitialize時にどうにか更新する
2. 1をやってみた結果、total_distanceの値は明らかにおかしなことになってしまい (本来200とかであるべき距離が2000になっていたり) したので、「前の座標との差分を足し続けるのはなんか実装おかしそう」と気づいて、データの初期化ロジックをどうにかできないか模索
3. 初期データがgzipされた状態であることに気づいてそれを解凍してその中身のchair_locationsをshellscriptを使ってがちゃがちゃやって、chair_locationsそれぞれに距離をカラムとして持てる状態に変更 (chair_locations.total_distanceという名前のままだったけど実体は chair_locations.distance みたいな感じにしました)
4. 3をやった結果重いクエリは若干簡略化できて (JOINは残っているが chair_locations.distance の sum を取るだけで距離がゲットできるようになった)、INDEXも足した結果、このスロークエリの順位が1位から3位くらいに下がった
5. 一旦満足して他のクエリのINDEXを足したりbinlogを無効化するなどした結果、やはりchair_locationsのクエリが再び1位に戻ってきた
6. chair_locations.distanceを合計すればchairのtotal_distanceがわかるなら、chair.total_distanceとchair.total_distance_updated_atをはやしてそれを更新すればええやん、とやり始めて、大体動いたのでベンチを回したらなぜか sql no rows が出るようになり、「え、ErrNoRowsのハンドリング漏れているところなくね?」となってあちこち眺めている間に時間切れになり、根本的なクエリの改修を入れられなかった..

sql.ErrNoRows の解消ができないまま終わるなんて、という感じでつらみがありました。DB分割ももちろんやれず1台で終わり。

他メンバー

マッチングアルゴリズムと通知でめちゃくちゃハマっていそうでした。これらの内容もうまく入れられずに終了しました。

感想

他2人が苦戦している間に自分が適当なINDEX追加などをやっておいた結果5000点くらいにはなったのはよかったけど「やってやったぜ」みたいな改善はチームとして入れられずに終わり、つらみ。プロファイラの無効化も忘れていたし再起動試験通るのだろうか..

以前はチームメンバーみんなで素振りをなんどもやっていましたが、今年はみんなやや忙しく、1度もがっつりとした素振りはできなかった(前日に初動の動き方認識合わせのみやった)ので、普通に練習不足という感じでした。

大会として

毎回反省ポイントがあってつらくはなっているもののISUCON自体はとても楽しいイベントで今年も開催されて本当に嬉しかったです!ありがとうございました!!

今回題材のWebアプリケーションも触っていて出来がすごくよくてびっくりしました。フロントエンドもちゃんとReact (Remix Framework) 使っているんだな〜と思ったりしました。おつかれさまでした。