isucon10の予選に参加したお話

はじめに

2020年9月12日に開催されたisucon10の予選に3人チームで参加しました。isucon10でやったことや反省点などについて書いていきます。結果ですが、初期スコア400点だったのを最終的に900点ぐらいまで上げて終了になりました。まだまだ改善の余地があったのかなと思っています。

事前に準備していたこと

事前に以下のことをやっていました。

  • isucon9の予選問題を解く
  • new relicを使ってみる
  • デプロイ用のスクリプトとかを準備する
  • nginx秘伝のタレ作成

当日の構成

こんな感じの構成にしてがんばりました

サーバ 用途
1台目 nginx+app(nodejs)+mysql
2台目 app(nodejs)
3台目 app(nodejs)

appはエンドポイントごとに分けました。

mysqlの負荷が凄かったので1テーブル1サーバみたいな構成にするべきでした

当日の流れ

以下の順番でやっていきました。

  1. new relic導入

  2. nginx.conf秘伝のタレ導入

  3. スロークエリのログ設定

  4. botからのアクセスが来たら503を返す設定

  5. sqlの order by id を消して popularity にインデックスを貼った

  6. sql の条件文を between に書き直した

  7. nazotte の n+1 を修正 (sqlで内外判定していたのを アプリで判定するように修正した)

  8. 同期sqlを非同期化

  9. features正規化

  10. appのエンドポイントごとにサーバを振り分ける設定

反省点

思いついたことを適当に箇条書きで並べます。

  • new relicを有効活用できなかった気がする
  • DBのチューニングが全然できていなかった
    • DBを複数台構成にしていればスコアもっと上がった気がする
    • 降順インデックスや空間インデックスを使う
      • DBの勉強不足を痛感しました。。。

最後に

とても楽しいコンテストでした。運営の皆様本当にありがとうございました。

来年も多分出ます。