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サーバみたいな構成にするべきでした
当日の流れ
以下の順番でやっていきました。
new relic導入
nginx.conf秘伝のタレ導入
スロークエリのログ設定
botからのアクセスが来たら503を返す設定
sqlの order by id を消して popularity にインデックスを貼った
sql の条件文を between に書き直した
nazotte の n+1 を修正 (sqlで内外判定していたのを アプリで判定するように修正した)
同期sqlを非同期化
features正規化
appのエンドポイントごとにサーバを振り分ける設定
反省点
思いついたことを適当に箇条書きで並べます。
- new relicを有効活用できなかった気がする
- DBのチューニングが全然できていなかった
- DBを複数台構成にしていればスコアもっと上がった気がする
- DBボトルネックならDB分けるかという発想
- 降順インデックスや空間インデックスを使う
- DBの勉強不足を痛感しました。。。
- DBを複数台構成にしていればスコアもっと上がった気がする
最後に
とても楽しいコンテストでした。運営の皆様本当にありがとうございました。
来年も多分出ます。