isucon
isucon8

ISUCON8本戦で5位になった話

2018/10/20に行われたISUCON8本戦に「チーム人間性」として出場し、5位という結果に終わりました。。

チームの顔ぶれとしては

  • ocadarumaさん(リーダー、デプロイなど足回り&計測&全般)
  • sushioさん(競プロガチ勢、アプリ中心)
  • 私mshibuya(インフラ寄り)

といった感じで、職場であるオプトつながり(ocadarumaさんはOB)のチームです。
去年のISUCON7にも出場していたのですが、帯域不足を超えられずに予選敗退していたので、今年の予選を見事通過できたことで大いに湧き上がりました。

使用言語はGoです!(ISUCON以外での使用経験なし…)

事前対策

本戦を前に

  • そろそろ10台構成とか来て手作業での設定変更が厳しくなるんじゃね?
  • インメモリ化できないと勝てない問題とか出そうじゃね?

あたりヤマをはって練習でそのへん取り組んだ上で臨んだのですが、見事にどちらもヒットせず…。
(まぁ難しいですよね)

本戦でやったこと

自分がやった打ち手のみです。残りはあとのお二方がそれぞれ振り返ってくださるはず…!
→ocadarumaさんのエントリ
→sushioさんのエントリ

ordersのタイムパーティショニングをやめる

MySQLのパーティショニングはあまり使った経験がなく、「パーティショニング無意味じゃん」と確信を持つに至らなかったのですが、少なくともordersについては時系列でクエリする局面がなかったので外して問題ないと判断しました。
スコアは725→845になったやつだと思う…。

tradeの非正規化

sushioさんがロウソクチャートのキャッシュを実装した後だったのですが、まだGetCandlestickDataが重いのでGROUP BYをしなくて済むようtradeを時・分・秒でサマったテーブルを作り、INSERT時に更新するように。
スコアは5,275→5,316あたり?あんまり効かなかったけど、害はなさそうなので入れることに。

/infoのN+1問題解消のデバッグ

sushioさん作のN+1解消(尊い)がベンチ通らない問題の調査。エンティティをscanしてるところでpriceにamountを代入しちゃってた、みたいなやりがちで気づくの大変系のやつでした…。

ロウソクチャートSELECTをREAD UNCOMMITTEDに

非正規化でロック待ちがかなり増えて伸び悩んでいたので、分離レベル変更したらロック待ちなくなったりしないかな?と思ってやってみたやつです。まぁダーティリードしちゃっても問題ないだろうと踏んでいたので…
この時既に17時も過ぎており破れかぶれでやったのですが、これがちょっと効いてスコアは6,177→7,202へ。

振り返り

最終的にocadarumaさんの「確率的にenable_shareを有効にする」というブレイクスルーがあり13,914というスコアを残すことができました。

  • 「シェアを完全trueに→ベンチ失敗して『まだ我々には早かったんだ…』となり戻す」を繰り返していたので、もっと確率的シェアに早めに気づけてればなーというのはある
  • 今回の問題はとても規模が大きかった。こんなに仕様盛り盛りでくるとは
  • 仕様書やコードを読むのはかなりできていて、Loggerのバルク化の必要性に気づけたりもした。ただ、気づいたポイントを全部着手できたということもなくて(TODO対応とかトレードマッチングの非同期化とか)、時間がもっとあれば…!というのが正直なところ

あたりが感想でしょうか。

優勝したかったなーというのはもちろんあって悔しくはありますが、今の我々の実力は出せていたんじゃないかな…と思ってます。

ついでに予選でやったこと

予選のエントリは書かなかったので、ここで予選で自分が打った手も振り返っちゃいます。
チームとしてはスコア41,195の全体11位での突破でした。

reservationsに雑にindex追加

開始直後だったので、ジャブって感じでreservationsにあったevent_id, sheet_idのインデックスにcanceled_atを追加。ちょっと効いたかな?

テンプレートエンジンをHeroに

全然効かず。SPAなんでそりゃそうですよねという感じ…。

ORDER BY RANDをランダム値オフセットに変換

まぁORDER BY RANDの書き換えの定石パターンってことで…。

複数サーバ化

16時過ぎまでは1台でチューニングしていて、そこそこのスコアになったので複数台化。
「3台にしてぶっちぎりでスコア伸びるっしょ」と期待していたのですが、DBロック競合が圧倒的に大きかったようでスコア的には変わらず〜微減程度に。。。

って感じで、予選はあんまりチームの役に立てた感はなかったです:sweat_drops:

まとめ

去年のISUCON7から初めて挑戦しはじめて2度めになるわけですが、正直ここまで楽しめるイベントとは思ってなかったですね。。
来年以降も絶対参加しますよ!

すばらしいイベントを提供してくださった運営の皆様、本当にありがとうございました!!