ISUCON10-finalに参加しました ~ありがとうまたあいま賞~
ISUCON10-finalに予選と同じくk5342とPelkiraと共に参加しました.途中の順位highestは5位くらいまで上がっていた気がしますが,最終的には18 / 22位.failのチームも含めると18 / 33位でした.
highestは15:43に記録した12835
で,最後は11077
でフィニッシュしました.
スコアが付いた中では下から5番目で,LINEさんから”またあいま賞”といういい感じの賞を貰えるみたいです.LINEさん大好き.
とはいえシステムがfail
するのはxsuconとしても問題ありなので,重くても動いている方が偉い(?).最後の試験failしなくてよかった〜
k5さんも本選の様子をふりかえっているので,ちゃんとした内容を読みたい人はこちらへ.
前日まで
- あまり忙しくて例のごとく練習する時間はほとんど取れなかった.しゅうろん♡を控える大学院生は忙しいのだ.
- 予選が終わった & 本戦出場が決まったときに,各々の役割をもう一度考え直して,以下のようにすることとしました.
- Pelkira先生 : 上がっているIssueからどれを取捨選択するか,実装者のタイムマネジメント,clarの情報共有といったオペレーション周り,意見を吸い上げて困ったときの道筋の最終判断者
- k5さん : 計測・実装
- わたし : 椅子あたため係 (計測・実装)
- 練習では上記役割での初動確認及び,秘伝のタレやいい感じにするスクリプトをまとめたMakefileを作ってました.後にこのMakefileが火を吹くことになりました.k5さん天才か?
当日
- 色々仕事が舞い込んできて朝6時くらいまで眠れなかった.終わり.
- ポストイットを買って会場入りする.
- 例のごとく人が何やってたかあんまり覚えてない.
レポジトリ
個人的にはこのIssueがすき.Pelkiraくんのマネージ力.
説明フェーズ (9:30 - 10:00)
- いつもの導入動画.xsuconの改善が必要になる.毎秒isuconしろ.
- 非常にメタ的だなぁと思った.
序盤 (10:00 - 13:00)
- sshする.
- とりあえず,localでもどんなWebアプリケーションなのかを確認する.
- レギュレーションを読む.
- web pushは実装する必要あるかなぁと思いつつクリティカルに問題になりそうならやるかぐらいの気持ちでいた.
- 埋め込まれている定数(
TeamCapacity
)を変更することによって,トレンドが変化しそうということを把握する.
- DBのスキーマを調べたり,構成要素を調べたり,秘伝のタレ(my.cnf)を微妙に修正しながら流し込んだりする.
- テーブルに入るitemのオーダーはどこから改善するかの指標にもつながるので,注意してみたほうがいいのだ.
- slowquery出てこないなと思ったら,
slow_query_log = ON
の箇所がコメントアウトされていてウケた.
- pprofを仕込んだりする.
git push
していたら,サーバーが壊れるなどしたので,伝家の宝刀本番サーバに~/chigi
を作って開発するのをやめて,localに開発環境を作る.- ついでに,不必要に管理してた
ruby
,nodejs
,frontend
といったディレクトリをgit管理下から外す. frontend
がそこそこデカかったから,static fileのcacheをenvoyに挟めばよかったなぁって今記事を書いていて思った.
- ついでに,不必要に管理してた
- クソデカ・クエリが支配的だったので,とりあえずindexを貼ってみる.
中盤 (13:00 - 16:00)
- 全然スコアがのびない.よく見るとインデックスの貼り漏れがあるので修正
- ついでに,Pelkiraから
TeamCapacity
を上げてみてはどうか?という話があったので,上げてみる.- スコアが
10000
位になる.
- スコアが
- この結果トレンドが変化し,ボトルネックが移った.
INSERT
が厳しいと話していたので,capacityを上げたり,writeのスレッドを増やしたりした.- この辺を調査して適当しているときに,実はindexがはられていなかったことに気がつく.
- 悲しい.
schema.sql
があるしどっかで呼ばれているやろみたいな適当な発言をしてしまったので,ごめんなさい.
- 修正するとスコアは
12000
位.その時の順位は10位以内に,学生枠では1とか2位だったので嬉しかった.ここで競技終了になればよかったんや(?)
終盤 (16:00 - 18:00)
- notification周りがずっと変な感じがしていて,
ERR: validation: critical: invalid-response: あるべき通知を受信していないことが検知されました
がでて確率的にfailするようになってきていた. - failというのは非常に心臓に悪く,順位がつかないのでこれは解決しなければという感じなっていました.
TeamCapacity
やlock_wait
の値をごちゃごちゃいじることで落ちないようにすることはできたけれど本質的になぜこうなるのかわからない状態でした.- この問題を解決しないと最悪スコアが0になるなと思っていたと同時に,依然としてクソデカ・クエリのDB負荷がしんどくこれにはキャッシュの実装が確実に必要だなあとなっていました.どっちをとるかという選択を迫られ,結果的に二兎を追うこととしました.
- 私はランダムfail問題を解決することを目指して実装を進めました.一部のトランザクションのはられ方が悪く,データ不整合を起こしているのでは?と思い実装しましたが結果的にそれは改善には繋がりませんでした.諦めて,値をチューニングすることで,一旦ある程度はfailしない状態にしました.
- 一方k5さんはキャッシュの実装をやってくれました.ごりごり実装を進めてくれてベンチに入れると,スコアはぐんぐん伸びて
18000
を記録していましたがfail
の文字が.うーん悔しさがそこにはありました.
- ギリギリまで粘って実装バグを探すk5さんの横で,いつでも再起動(
sudo reboot
)できるようにログ周りを全て切って回りました. - ギリギリまでk5さんの実装を見ていましたがある程度のところで見切りを付けて再起動試験をはじめました.あのときのk5さんの悔しそうな表情がすごく脳裏に焼き付いています.この時すでに残り15分,もともと1時間は再起動試験に時間をとりたいと考えていた私達にとっては緊張感のある時間となっていました.
reboot
でベンチが安定して通る(当社比)ところを見た後に最後にTeamCapacity
の値を上げて少しでもlatest
の数字を上げることにしました.しかし,自分のチューニングした値からすこしでもずらすとすぐに0となったため,すぐに戻しました.この15分の間はずっと本番サーバで直接masterをいじっていたので,非常に怖かったです.
- 残り2分,latestのスコアはチューニングに失敗した値である
4281
の数字,ベンチは回せてラスト一回,悔しさと次のベンチでfailしたらチームのみんなに申し訳ないという気持ち,もっと自分ができたことがたくさんあったなと8時間が走馬灯のように駆け巡る中「ベンチを入れて」とk5さんにお願いしました.結果は18時が過ぎた時間に11077
が出てきました.ひとまずfailじゃなかったことへの安堵でいっぱいでした.
その後 (18:00 - )
- Pelkiraくんはその後に予定があったため帰宅,私とk5さんは時間に余裕があったので,本選通過者に送られた出前館のクーポンでご飯を頼みました.ありがとうございます.
- 下から5位のチームに贈られる賞の枠で発表され,無事にその後のチェックもfailせずに通過したことを知りました.
- 学生が1, 2, 3位フィニッシュだったことに衝撃を受けると同時に,自分の不甲斐なさを実感していました.
最後に
- 楽しい問題をいつも提供してくださるISUCONの運営の方々には感謝です.これが毎年あるおかげで強くなっていることを実感します.
- 初めて本選に行ったのはISUCON6,このときはなんにもわからず,@orisanoと@imishinistに連れて行ってもらっただけで,真の意味で椅子を温めていました.
- 初めて自分の知識を多少生かして,編入同期である@k5342と@euglena1215と本選に進んだISUCON7では,本選問題の何のボトルネックもわからずに懇親会ではこの人達は一体何を話しているんだ?状態で放心状態でした.
- そして,久々の本選である今回のISUCON10では過去とは比較にならないくらい色々できました.感想戦で出てきた話題も「あ〜わかるわかる」,「あ〜頭良すぎか」みたいな状態になれていました.ただ,勝てなかったこと,学生として最後に*2参加するISUCONでもっといいフィニッシュをしたかったなぁと後悔も多くあります.
- そういう意味では「またあいま賞」という素敵な賞をもらえて,また頑張ろうと強く思いました.絶対本選にまた帰ってくるからな.そのときは皆さん対戦よろしくおねがいします.