予選の上位20パーセントに入る方法

藤原俊一郎氏(以下、藤原):Twitterで「優勝じゃなくて予選の上位20パーセントに入る方法が知りたい」というものが流れています。

草野翔氏(以下、草野):そうなんですよね。

藤原:優勝は何百分の1なので、そんなに多い数字ではない。

草野:でも上位20パーセントも同じことなんだよね。

藤原:20パーセントだと、チームワークとかではなくて、1人でもいきやすいじゃないですか。

草野:怪力で。

藤原:技術的なことでまだいけそうじゃないですかね。予選通過はちょっとキツイですが。20パーセント、上位100位ぐらいであれば、1人でもスコアを出せると思うんですよね。

草野:技術的なことで言うと、やらないことが増える度に点数が上がりますね。見つけたものを端からやらない。参考実装を開いた瞬間に、観光名所が出てきたりするじゃないですか。とても長いSQLクエリが出てきて、「これは絶対にやばい」ということが一瞬でわかるんだけど、その一瞬でわかったものをやらずに、ちゃんとモニタリングをして順番に効くことをしていけるか。

もしくは、初手、直すべきところがわかりきっていところは何も考えずに手が動くとか。「何をやらないか」のほうが、点に響く気がします。そういう感じはないですか?

金子達哉氏(以下、金子):付録Aにありましたよね。

草野:付録Aにそういうことが書いてあるんだけれど。

(一同笑)

金子:付録Aみたいな解き方ができると理想的だよなと思います。

藤原:順番にちゃんと重いところから倒す、みたいな感じですよね。

草野:そうそう。重いところを倒さないと次の重いところがわからないんですよね。

藤原:そうですよね。付録Aのネタばらし的な話をちょっとすると、付録Aの範囲だと最初に650点から30万点まで行くんですが、その中で、最初に追加したインデックスをDROP INDEXすると1万点になっちゃうということがあって。とにかくボトルネックのインデックスを倒さないと、いくら他のことをやってもぜんぜん上がらないという、すごくいい実例になっています。

草野:へー。

藤原:「ボトルネック以外を倒すと上がりませんよ」ということは何度でも言いたい。

草野:メチャクチャいい話。

馬場俊彰氏(以下、馬場):確かに。

藤原:ボトルネックというものは「他のアプリケーションではこれが効いたんだよな」みたいなやつをやっても効かないんですよ。

草野:あー。

藤原:ISUCONに限らず本当に見たほうがいいです。これは業務のパフォーマンスチューニングでもなんでもそうですが、「前にこれが効いたはずだ」ということをいくらがんばっても、本当に重いところじゃないと何も意味がなくて、時間だけが無駄になるので。

金子:最近のISUCONはN+1が多すぎて、時間内で絶対に全部直しきれないんですよね。だから、本当にボトルネックになっているところをちゃんと見つけないと、やはり上位には食い込めないんですよね。

藤原:これはISUCONに限らず、ISUCONはなおさら時間が厳しいからそうなんだけど、業務では「チューニングしようと思っても、一番ヤバイところから直さないと意味ないですよ」ということは、本を通して言いたいですね。

馬場:ということを1章に滔々と書いてあります。

(一同笑)

草野:すごい! すばらしい! みんな販促がうまいね。

藤原:1章にも書いてあるし、あちこちにも書いていますね。

馬場:そうなんですよね。業務でも使うから本に残したいし、みんなに読んでほしいんですよね。

草野:そうですね。それはメチャクチャそう思います。

「まとまった勉強をしておくこと」も大切

草野:僕は白金動物園の飛び道具担当で、ワンチャン「お前、今すぐこの問題用のリバースプロキシを書け」みたいなことを言われる立場にあるんですけれど。そういう人が1人チームにいると確かに便利な時はありますが、妥当なことができないと次の問題に役に立たないんですよね。

(それは)その年の問題にたまたま合致するかしないか博打の話になってきて、たぶん博打だと、上位20パーセントという、予選を突破する枠にちゃんと入り続けるのはかなり厳しくて。僕のチームの本選出場率が50パーセントなのは、たぶんそういう理由です。

正直、博打がハマるとうまく行くみたいなチームではあるので、でもそれがうまくちゃんと最適化されて、「まともなことをやるぞ」という空気になってISUCON9の優勝があったという感じがしています。

ちゃんとまとまった勉強をしておくことは、すごく効く気がします。何の問題にでも役に立つような、まともなことをちゃんとやっておくのが僕の中ではすごい効く気がしています。

中西建登氏(以下、中西):でも博打を打ってうまくいくようなパターンがあるということは、他の2人がまともなことをやって、ちゃんと博打が効くようなところまでは到達しているということでもあるので、それは前提ですよね。

草野:大前提はそうですね。

「AWSのSAがISUCONに挑戦」セッションの感想

草野:(コメント欄より)先日(2022年5月25日〜26日)のAWSサミットの「AWSのSAがISUCONに挑戦」(というセッション)。みなさん見ましたか?

藤原:見ましたね。

草野:僕は見ました。あれはすごく楽しかったです。「というセッションをおもしろく見ていたのですが、達人のみなさんの感想を聞いてみたいです」。じゃあ見た人に1つずつ聞いていきますか。藤原さんはどうでしたか?

藤原:そうですね。あれはけっこう事前準備をしていて、事前準備をした上でデプロイするのが30分の間だったのですが、何を準備したのかはもうちょっと知りたいですね。何をしたのかがわからないでスコアが上がっても、なんというか「そうだね」としか言えなくて(笑)。おもしろかったんですけど、あとでブログでやったことを全部大公開してほしいなと思いました。

草野:馬場さんは見ました?

馬場:見ました。

草野:どうでした?

馬場:マネージドサービスが使えたらいいと思います。予選とかは小さいインスタンスでみんながんばっているので。「何千円とか何万円とか、自分で払うから」と思ったことは何度もあります。

(一同笑)

草野:catatsuyさんはどうでした? 見ました?

金子:見ました。すごくおもしろかったですが、藤原さんと同じで、何をやったかはあまり説明されていなかったので、何をやったのかちゃんと見たいのと、あとはそのうち「優勝チームが実はAIでした」みたいな未来がありそうだなと思いました。

草野:GitHub CopilotにISUCONをクリアされる未来。

金子:ありそうだなと思って。

草野:みんなのコミットログが毎年上がっているので、Copilot的にはISUCONの倒し方の学習データが増えているはずなんですけどね(笑)。kazeburoさんは見ました?

長野雅広氏(以下、長野):自分は見ていないですね。

草野:なるほど。じゃあログを見たあとに感想ブログをお待ちしています。

長野:はい。

(一同笑)

草野:waitaさん見ました?

中西:はい。見ました。みなさんが言ったことで、そのとおりかなという気はします。やはり初手Auroraでぶち込むのは強いよなと思いつつ、ただ、確かそれだけでは優勝スコアにいっていないんですよね。

草野:行ってないですね。確か……あれ、いくつだったっけ?

中西:30万点ぐらいかな?

藤原:予選トップが100万点を超えているので。

中西:そうなると、やっぱりそうじゃないところにもISUCONのおもしろみはあるんだなというのがすごくおもしろかったです。

草野:ありがとうございます。僕もちゃんと見ましたが、僕はみなさんと違って、いくらかかったか教えてほしいですね。

(一同笑)

草野:つまり、我々の技術力によっていくらのコストが浮いているのかが知りたいです。「初手Auroraで巨大なものを入れています」みたいなことが書いてあったけれど「そのAuroraはプログラミング次第では使わなくていいわけなので、大変コストに効いているのでは」とか。

その資料がAWS公式から出てきたら「パフォーマンスチューニングをしましょうよ」と言いやすくなるし、うれしいんだけどなと思いながら見つめていました。いくらかかったかあとで公開してほしいなと思っています。

藤原:そうですね。先ほどベンチマーカーの話があったので言いますが、ベンチマーカーはレイテンシーが長いと、次のリクエストが送れないので回転しないじゃないですか。なので、何もしないでAuroraの大きいインスタンスを使っても、別にレイテンシーは変わらないので、例えばインデックスがなかったら、並列には耐えられるけど、1発の速さは遅いじゃないですか。

だから、ベンチマーカーはそんなに上がらないんですよね。大きいAuroraでインデックスを使えないクエリのフルスキャンが速くなるわけじゃないから、やはりお金だけでは絶対解決できないなという感じはします。

草野:とは言え、本選でお金を積んで使えるなら積みますけどね。

(一同笑)

金子:N+1クエリとかは速くなるから最高ですね。

(次回に続く)