社内で開かれたISUCON(問題は本家のISUCON9を使用)に参加してみて、自分なりに考えたISUCONのコツ?について書いてみた。
前回の予習編はこちら。
①モニタリングツールを入れてボトルネックを発見し、まずはインパクトが大きいところから改善
限られた競技時間であることを考えると効率的にスコアを伸ばす必要がある。
これは元々考えていた方針で、過去問会でも本番でもある程度のスコア改善が行えた。
発見と改善の実例
-
コードを見ると、ループの中でPOSTが行われておりN+1的に外部APIが実行されていることがわかる。
https://github.com/isucon/isucon9-qualify/blob/34b3e785ebdd97d5c39a1263cbf56d1ae5e3ef91/webapp/nodejs/index.ts#L699 -
キャッシュ化できないかなど考えるが、よく考えたらそもそもこの外部API実行で取得できる結果はDBで腹持ちしていることに気づく。単純に外部APIの実行をなくす。
②アプリケーションの性質からあるべき論から修正する
今回のISUCONでは計測ツールからボトルネックを探す方針としていたが、①に書いたようなわかりやすく無駄である実装以外は改善点を見つけることが少し難しかった。
そこで他にどんな修正ができたかISUCON9 オンライン予選 関連エントリまとめ : ISUCON公式Blogを読んだところ、あまり労力をかけずにできそうなことがいくつか見つかった。
例えば...
- DBから取得するカテゴリー情報はマスターデータなのでキャッシュ化する
- ログインユーザーの情報はログイン以降再取得する必要がないためキャッシュ化する
- 商品別のユーザー・カテゴリー情報の取得をN+1にせず複数まとめて取得する
- データ量の多いテーブルの絞り込み条件やソート条件のカラムにインデックスを貼る(ORやNULLなど、インデックスが聞かない書き方に注意する必要がある)
この辺りは計測ツールから見つけなくても、あるべき論で考えれば見つけられると思う。
比較的修正も軽微なので、改善インパクトがあまり大きくないとしてもサクッと直すのをコツコツ積み上げれば効率的に確実にスコアが伸ばせそう。
結局のところ、既存実装を短い時間で読み取って、効率的だが同じ意味に翻訳するという作業が重要そう。
終わりに
小難しい専門知識がなくとも、①②を愚直に行うだけである程度のスコア改善はできると思う。
とはいえ、インフラ周りの改善には一切触れていなく、本家の予選突破ラインとなるともう一押し必要だと思おう。
次回はインフラ周りの改善の知識も少しつけた上で、冷静に速やかに①②を進めることでまた頑張りたい。