ISUCON10 予選 参加記
結果
WIP
個人でやったこと
New Relic の導入
入れて config 書くだけで各リクエストのメトリクスがわかるのは便利でした。各リクエストに紐づく MySQL のクエリが見えると思っていたんですが、結局当日までやり方がわかりませんでした…。
最後 New Relic を無効化してベンチ回したら 500 ぐらいスコアが伸びました。
nginx で bot 対策
レギュレーションに書いていて、手が空いていたのでやりました。nginx.conf の書き方全然知らなかったので結構手間取りました。
nginx で 静的ファイルを cache
いつものやつ。けどベンチは API しか叩いてないし、さばけた GET リクエストの数でスコアが変化するわけでもないので、意味があったのかわかりません。
insert を bulk insert に変更
自明な改善点だったのでやりました。nodejs の mysql の nested array をいい感じに bind してくれる機能の挙動がわからずかなりハマりました。
これはその時の様子です。
様子です pic.twitter.com/aaMEHsOOVf
— odan (@odan3240) September 12, 2020
nginx をロードバランサーにして app を 3 台に増加
夕方ぐらいからそろそろやるかとなって取り掛かりました。やり方は理解していたので楽勝だと思っていましたが、色々ハマって時間を使いました。具体的には次のとおりです。
- 最初から用意されている MySQL の isucon ユーザーは localhost からしか接続を受け付けていない
- mysqld.cnf の
bind-address
のデフォルトは 127.0.0.1 - nginx.conf の
upstream
は http 以下にしか書けない - nginx.conf の
location
は server 以下にしか書けない
最初は app/MySQL/nginx を server1 に同居させて、server2/server3 は app だけの構成にしていました。しかし New Relic のコンソールを見ていると、server1 の CPU 使用率が 100%なことに対して server2/server3 の CPU 使用率が 50% 程度なことから、server1 で app を動かすのをやめる構成にしました。
再起動チェック
いつものやつ。systemctl enable
を実行するのを忘れていて、再起動したら golang の app が動いていたので危なかったです。
トピックごとにテキストチャンネルを分ける
会話が脱線しないようになるかなと思ってやってみました。8 時間という短い時間なので、あまり意味がなかったかもしません。
トピックごとにテキストチャンネルを作って文脈を追いやすくしてみていた、あまり効果なかったかも #isucon pic.twitter.com/weMCwPdH3u
— odan (@odan3240) September 12, 2020
チーム的にやらなかったこと
/api/estate/search
のOFFSET
をWHERE id
に置き換える- nginx のログから
OFFSET
に実際に渡される値の統計をとってもらったら、高々 100 だったのでやりませんでした
- nginx のログから
/api/estate/search
のfeatures
を正規化する- これも nginx のログを見て、
features
が含まれるリクエストはそこまで多くないことからやりませんでした
- これも nginx のログを見て、
出来なかったこと
思いついたけどやる時間がなかったものを簡単にメモっておきます。
- HogeRangeId 系を DB に id として持って where で等号で比較する
/api/recommended_estate/:id
をいい感じにする- ベンチマーカーの裏設定で GET 後のコンバージョンが良いように設定されていたりしない?とか勝手に考えていました
- ちょっと頭を使ってクエリを書き換えたけどベンチが失敗しました
- 凸多角形の内包判定を app でやる
- 大学生の頃に競プロのためにこれを判定するライブラリを持っていたので頭に浮かびました
- チームの人が空間 Index でいい感じにしてくれたので手を出さずに住みました
感想戦で知ったこと
Discord の感想戦を眺めてなるほどって思ったものを書いておきます。
- テーブルごとに DB を分ける
- たしかに今回 JOIN がないのでこれでできる
- UPDATE の前の SELECT FOR UPDATE は不要
- たしかに!
- クエリキャッシュ
- 思いつかなかった
- SET 型がある
- Generated Columns
- etckeeper
感想
去年より問題はかなりシンプルになったにも関わらず、やることがたくさんあって楽しかったです。
改善しそうな何かをする前に、それって本当にやる価値あるの?と考えてしまい、そのための調査にメンバーの時間を使うことが多かったです。8 時間しかない ISUCON だとやる価値がありそうなことを順番にやるよりも、ある程度の効果が期待できそうかつ、手数がそんなに多くないものから取り掛かるのが正解だったかもしれません…。
去年より問題に対する解像度や手札の数が増えてきたのを感じるので、来年も参加したいです。