恒例行事となっているISUCON予選に今年も参加し、無残な敗退を喫してきた💀
去年のブログ
チーム紹介
チーム名は毎年見直していて今年は2時間にも及ぶ激論の末「 牡蠣食えば 金が無くなり リボ払い 」 (5-7-5) に、チームリーダーは怪しい野良抽選ツールによる厳正なる抽選(?)の結果 @nekodaisuki が務めることに。
nekodaisuki
- リーダー
- SQLの魔術師
cureseven
- 歌手
- 分析隊長
pinkumohikan
- 肩もみがかり
振り返り
予選当日
記録: github.com
序盤は極めていい感じに動けており、遅いクエリのindexを調整したり、アプリ・DB分離を行ったり、データの使われ方に応じてテーブル設計を見直すなどして瞬間ランキングでは1位になったこともあった。「練習通りだ、今年は本戦行けるぞ!」このときは誰もがそう信じて疑わなかった。
中盤に差し掛かり、MySQLサーバの負荷が5%以下となった段階でSQLiteについて思いを馳せ始めた。 SQLiteは単体での性能は高いがスケーラビリティに欠けるのと単純に我々は慣れていないのでMySQLへ移行することにしたのだが、ここが難所だった。
不慣れなSQLiteとの対話、終わらないMySQLへのローディング...一進一退の攻防を繰り広げながら、最終的にはinitializeが時間内に終わらない問題を倒しきれずMySQL移行は失敗した。着手段階でMySQL移行が上手く行かない可能性はありそうだなと思いつつ、SQLite固有の施策を進めてMySQL移行完了後に2度手間になるのがやだなーと思ってSQLite周辺にあまり手を入れなかったのが良くなかった。さらに言えば、SQLiteで何ができるのかをしっかり調査せずに「SQLiteってtx使えなかったよね〜」などと勘違いしたまま進めてしまったのも良くなかった。
競技終了1.5時間ほど前の時点でMySQL移行が時間内に終わらない可能性の高まりを感じ、SQLiteのまま行くことことにやっと前向きになった。SQLiteで実行しているクエリのindexやクエリのチューニングをはじめたところすぐに4,000点ぐらい上がった。あと1時間あれば予選通過ラインには届いていそうな伸び率だっただけに、この判断をもう少しはやく出来ていれば...と思うなどした。
最終結果:
練習
練習には十分に取り組めた。 今年も10回近くの練習会を実施し、他チームとの合同練習会は背筋がピンとなるとても良い機会だった。 来年も同様の練習をしていきたい。
リーダー業のローテーション
いつチームが解散してもそれぞれがリーダーとして新チームを引っ張れる状態にしたいので、リーダー業をローテーションをしていきたいという思いがある。
これに関しては練習時はいい感じだったが、予選当日は (予選通過がかかっている事もあり) 進行や意思決定に少し口を出しすぎた感覚がある。 来年はもっとリーダーにリーダーらしい振る舞いをしてもらうための配慮をしたい。
課題
今回もめちゃめちゃ唸らされるおもしろい問題だった。 毎年毎年、そろそろ課題を出しつくたんじゃないか?って思うのに新たな唸りポイントを作れるのは本当にすごい。
技術的にもSQLiteはそれ自体は歴史があるが使われる箇所でいうと組み込みやネイティブアプリなどいわゆるWebエンジニアリングからはやや距離があるイメージだったが、最近ではCloudFlareがエッジコンピューティングに採用したりで注目度が上がっているので触れられてよかった。ファイルにすべての状態が閉じているので参照偏重なワークロードならアプリケーションとSQLiteと同梱して配布するなどすればコスパよくスケールさせられそう。
来年も対戦宜しくお願いします 🔥