そーだいなるらくがき帳

そーだいが自由気侭に更新します。

失敗から学ぶISUCONの正しい歩き方 - 葬送のPostgreSQL

 ISUCON13に参加した。 我々のアプローチ、当日の話なんかはチームメイトが書くだろうから自分はざっくり、ここまで1年間チームを組んでくれたチームメイトとの歩みについて書いて行こうと思う。

 とはいえ、気になる人もいるかもしれないから置いておく。

github.com

チームの始まり

 2022/07/23 ISUCON12に出場した自分と @tetsuzawa はFailでscore無しとなり予選敗退した。 新卒1年目の@tetsuzawaが「来年も出ましょう。準備、できることは全部やるんで。」と言って来年も出るか。ってことが決まった。 二人で出たチームの課題は自律したガンガンコードを書けるGoのプロフェッショナルが足りないこと。 だからその日のうちに、ISUCON 12では出題側に回っていて、絶対来年のチームが決まっていない @mackee_w を誘った。

 そして当日の反省会をしていた田中屋でmackee_wにDMして即、承諾してもらい、我々のチームの歩みはここから始まった。

PostgreSQLに移行するという決意

 2022/09/03 我々のチームでの初めての素振りが始まった。 集まった時、我々のチームのコンセプト、大方針を決めよう。という話なった。 結果、2つのことが決まった。

  1. どんなデータベースが来てもPostgerSQLに移行する
  2. 予選突破、そして優勝を目指してやっていく

 その大前提から素振りを始めたが、PostgreSQLの移行の難しさ、大変さを味わいながら、8時間の素振りの時間延長しながらscoreを高めていった。

github.com

 ここからほぼ毎月、チームで集まって8時間の素振りを過去問で始めることになる。

決勝問題に弱いという弱点

 予選問題はかなりの高い確率でハイスコアに行くことができた。 これは「データベースのボトルネックを解決するとscoreに直結する」ということが多く、アプリケーション側の負荷は複数台構成にすることで解決することが多いからだ。 我々のチームはPostgreSQLに移行した上で、DBの問題をスムーズに解決する。というのが強みのチームなので相性が良い。 例えばISUCON10の予選問題の素振りではとてもスマートな生成列と配列型、GIN INDEXを活用して改善している。

github.com

 しかしISUCON本戦の問題はまず、問題のサイズがめちゃめちゃ大きい。 我々はPostgreSQLに移行する都合上、MySQLから移行する手間が発生する。 問題のサイズが大きければテーブルの移行もデータの移行も時間がかかる。

 更に優勝するためには「データベースにアクセスさせない」方法が効果的で、PostgreSQLの強みを活かせないシーンも多い。 つまりキャッシュを如何に使うか、データベースの移行を如何にスムーズに行うかというのが直近の課題になった。

ひたすら準備と素振り

 素振りをやればやるほど我々のアプローチはISUCONと相性が悪い、という結論になる。 だからと言ってMySQLを使いましょうというのは筋が違う。 MySQLからPostgreSQLの移行を短縮するためにmackee_wは移行ツールを作り、tetsuzawaはVARNISHを覚え、自分はDDLを置き換えるChatGPTを育てるなどした。 実際に観測周りはかなり質が上がり、問題を解くことは過去問に置いてはかなり良いレベルに到達した。

 それでもまだ、過去問の決勝問題では優勝スコアに届かない。8時間という時間の壁と手数の少なさを課題に抱えたまま本番を迎える。

そして本番と現実

 結論、PostgreSQLに移行した。 PowerDNSからもMySQLを剥がした。 しかし、Scoreを伸ばすことはできなかった。 地道にそこそこのScoreを目指すのではなく、ガッツリ改善してScoreが上がると予想したアプローチでDEAD or ALIVEでDEADした。

 DEADした理由はキャッシュの導入の失敗と手数の少なさなのだけど、これからわかるように実装の正確さ、改善速度の遅さ、つまりは単純な実力不足だった。 直すべきところはわかっていても、実装しきれないと意味がない。 普段からどれだけコードを書いているか。それが出来ていない自分への現実を突きつけられた結果だった。

感謝

 この一年、ほぼ毎月1回以上、今月に至っては本番含めて3回も土日を潰してISUCONと向き合ってくれたチームメイトには本当に感謝している。

 tetsuzawaは本当に1年頑張ったと思う。去年よりも明らかにできることも増えたし、知識も増えた。 そして何より、有言実行として毎月の素振りの準備も改善テンプレートの作成も全てやりきった。 これは自信を持っていい。このやりきった経験は財産になる。

 mackee_wはtetsuzawaのメンターとして、メインプログラマーとして圧倒的なValueを出した。 たぶん、今自分たちはMySQLの独自文法とSQL標準に移行するのが日本で1番上手いと思う。 tetsuzawaにソフトウェアエンジニアとして、足りないツールは自分で作る、問題をコードで解決するための筋力とはなにか、と言うことを伝えられたのはmackee_wの実力があってこそだ。 当日もPowerDNSのMySQL剥がしをサクっとやってくれたし、PostgreSQL移行が出来たのもmackee_wのおかげだ。 チームとしてのレベルを1段も2段も上げてくれたことに、素振りの度に鎌倉から荻窪まで毎回来てくれたことに、そして実装力という圧倒的なValueを届けてくれたことに感謝している。

運営へ

 今年もISUCONを開催してくれた運営の皆様、本当にお疲れ様でした。 日の目を見ない苦労も沢山あったと思うし、当日も様々なトラブルがあって本当に大変だったと思います。 本当に本当に毎年感謝しています、今年もありがとうございました。

 そんな中、無理を承知で運営にお願いがあるとしたら、コード内やDDLSQLで独自文法を使う分は仕方ないと思います。 ですがinitial dataを作成するSQLSQL標準に準じてくれると助かります。 INSERT文でなくても、データはCSVにしてMySQLにはLOAD DATAで取り込む形でも良いです。 今回のようにテーブル数やデータ数が多いのであれば、「そういえば他のデータベースに移行する人もいるかもな」と思い出してくれると幸いです。

最後に

 まだ限界だなんて認めちゃいないさ。