先日行われた ISUCON11 オンライン予選に参加した。実は ISUCON に参加するのは今回が初。結果は最終スコアが 8062 で 342 位。
出場の経緯
もともと ISUCON 自体は 3, 4 年前くらいから知っていたが、当時はコードを全然書いていなくて「そんなコンテストがあるんだ」ぐらいに思っていた。最近になってコード書いてないヤバいという意識を持つようになり、大学含め少しずつ勉強をし始めている。
TL で ISUCON のツイートが流れてきたので、自身のベンチマークも兼ねて参加しようと決めてなんとか予選の追加募集に滑り込めた。チームは同僚 1 人の計 2 名で参加した。相棒もあまりコードが書けない人なのでほぼオレと同じくらいの力量。
準備
ほとんどしていない。お互いの時間が合わなかったので各自で過去問を解いたり過去のレギュレーションを読んだりしていた。ISUCON7 と 10 の過去問をやったが、オレのコードを読む/書く力がなさすぎて全然わからなかった。ので New Relic や Splunk のアカウント登録などをしていた。
本番
ログを残していないので記憶が曖昧だけど流れを書いていく。
- マニュアルの確認
- AWS 環境構築
- Go のままベンチ
- Ruby に変更してベンチ
- デプロイ整備しようと思ったけど時間が有限なので見送り
- サーバ上でコードを修正する方針に
- 2 人でコードをざっと読む
- サーバの構成を把握する
- Nginx -> App -> MariaDB の構成であることを把握
- EC2 が 3 台あるが 3 台とも同じ構成であることを把握(のはず
- DB は別サーバに分けたほうがいいかもねと話す
- ボトルネックの調査開始
- Nginx のアクセスログから Condition への Post リクエストで 499 Status が多発していることを確認
- この行 が悪さをしていると判断して消した
- Discord 見てると 0.9 のままいってるチームもいてよくわかっていない...
- コメント通りあえてリクエストを落としているので徐々に割合を減らすべきだったかも?
- この時点で Score 7730
- Nginx のログフォーマットを alp で見れるように ltsv に変更
- MariaDB の slow query log を出力するように変更
- 脳死で long_query_time を 1 で設定してしまった
- 1 秒だと長過ぎることが終わった後にわかった
- puma の workersや thread を変更するもスコア変わらず
- サーバの役割を変更
- 1 号機は Nginx + App
- 2 号機は MariaDB
- 3 号機はヒマしてる
- New Relic APM を導入
- trend への GET リクエストが遅いことに気づく
- trend の SQL チューニングを実施
- SELECT するカラムを絞った
- isu DB にインデックスを貼った
- がインデックスの知識が乏しく良い設定が見いだせずにスコア伸びず
- trend の SQL チューニングを実施
反省点
- もっともっとコードを読もう/書こう
- 素振りしていないので次回からやりまくる
- デプロイ方法を事前に取り決めておく
- シェルスクリプト準備しておくとよさそう
- スレッドやプロセスなどを理解していない
- DB の知識が足りない
おわりに
練習不足もあるけど、それ以前に日常的にコードを書いてないがためにほとんど何もできずに終わってしまった。大学の講義でコードを書いているけどそれだけでは全然足りなくて、より実践的なコードを書いていかないといけないと改めて感じた。となるとやはり個人開発するしかないなと。やっていこう。あと業務ではインフラというよりクラウドを多めに触るから Linux や DB の知識も全然身につけられていないので、もっと意識して取り組んでいかないといけない。
来年また ISUCON 参加するぞ!運営・スポンサーのみなさま、本当にありがとうございました!!!