3年ぶりにISUCON予選参加しました
前職の同僚とISUCON予選(ISUCON10)に参加しましたのでその活動メモしておきます。
ISUCONとは
お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトル、それがISUCONです。
去年は別の開発合宿と日程がダダかぶりしたので断念し、その前はみんなの家族が出産イベントなどで忙しくて見送り。なので3年ぶりの参加でした。
事前準備
ほとんど準備する時間は取れず、前日に簡単な進め方のすり合わせをしたぐらいでした。今回はNewRelicがスポンサーなので競技中に使用できるライセンスが付与されたので、それを触って遊んでました。
当日のお題
今回はisuumoというイスと物件を検索する機能をもったサイトでした。
ざっくりイス検索、物件検索、イス購入、CSV入稿などが用意されていました。 その他、なぞって検索という画面がありました。
やったこと
開始時間が10時から12時に変更。 開始直後はベンチマーカーが動かなかったこともあり、みんなでコードを読んで対策を検討していました。
その後ベンチマークを実行したところ、明らかにDBネックな状態で処理が実行されていたので、DBサーバを分離しました。
その後、チーム内で手を入れられたのは以下の内容でした。
- nginx周り
- 画像のキャッシュ
- APサーバ2台にロードバランス, DBサーバを分離
- webサーバ周り
- レスポンスをRedisでキャッシュ
- DB周り
- インデックス貼りまくる
Redisで一度検索した結果をキャッシュすることで、DBサーバの負荷が下がり、スコアが向上しました。
最終スコア
やろうとしてやれなかったこと
LIKE CONCAT('%', ?, '%')
の文字列LIKE検索をカラムにバラす
ここは自分が担当していた部分でしたが、時間内にベンチマークを通せず断念.. その他なぞって検索の改良は全然手が出ず..
みんなの感想見るまで知らなかったこと
- MySQL5.7だと降順インデックスが効かない、MySQL 8.0にあげてDESCENDING INDEXにする
- そもそも降順インデックスが効かないことを知りませんでした..
- そのほか値をマイナスに変換して無理やり昇順にしたり、Generated Columnを使う方法もあったようです。
- 位置情報の検索は、SPATIAL INDEXを使うと効果的。
所感
全然歯が立っていないんですが、とりあえず無難な部分を修正してある程度スコアを上げれたので良かったです。みんな久々にインフラチューニングを8時間やって良いリハビリになったかと思います。 やりたいところ思うことがあっても、時間内にベンチマークのテストをパスできず終了してしまったので、実装力が足りないことを痛感します。(上位の人たちはなんであんなに早く直せるんだろう..) 終わった後のみんなの解説見るだけですげー勉強になるので、来年もまた参加できるなら参加したいところです。