概要
ISUCON12予選に初参加しました!
ISUCONという大会自体は2年ほど前から知っていたのですが、参加チームの上限が決まっていることもあり、今年も見送りかなーと考えていたのですが、ISUCON本を読んでこれなら少なくとも一つくらいはチューニングできそう!と思い参加しました。
「ブログを書くまでがISUCONです!」とのことなので、当日のタイムラインと、予選までに勉強した内容についてまとめます。
チーム名「焼肉食いたい」でソロ出場し、最終スコアは5015でした。Goで実装しています。
タイムライン
9:00 起床
9:40 ISUCONのOPを見る。テンション上がる。
10:00 競技開始
10:00~11:30 EC2構築してSSH接続&GitHubにデプロイ。システム構成を眺める。
11:30~12:30 とりあえずAPサーバとDBサーバを分離。MySQLの設定値変更。
12:30~13:30 MySQLのスロークエリ確認し、MySQLにインデックスを作成(この時点で約5000点を記録)
13:30~14:00 MySQLのADMIN PREPAREを無効化しようとしたが、エラーになってできず。一旦放置
14:00~14:30 SQLiteのスロークエリの見方がわからない。とりあえずインデックスを貼った。
14:30~16:30
Nginxのログから参加者の詳細情報取得へのアクセスが重いことがわかったので
以下の処理を1つのSQLで行うように修正。retrievePlayerは据え置き。
1. competitionから大会一覧を取得
2. player_scoreからプレイヤーの大会毎の最新スコア情報取得(SQL)
16:30~17:30 Nginxのログからrankingへのアクセスが重いことがわかったので、
以下の処理を全て1つのSQLで行うように修正。retrieveCompetitionは据え置き。
1. player_scoreから大会毎のスコア情報取得(SQL)
2. プレイヤーの重複排除(各プレイヤーの最新スコアを取得)
3. スコア順にソート
17:30~18:00 各種ログ出力停止
振り返り
APサーバとDBサーバの分離、MySQLのチューニングまでは順調だったと思います。
SQLiteに対してどうすればいいのか全くわからず、Nginxのログからとりあえず重たいURLのソースコードを眺めて、それっぽいところを修正しましたが、14:00以降ほとんどスコアは伸びませんでした。ボトルネックの計測がうまくできていなかったことが原因かと思います。
また、業務でSQL・Goを書く機会が少ないこともあり、SQLの改修にかなり時間を費やしてしまいました。来年は筋トレをしてから臨みたいと思います。
勉強した内容
ISUCON本
ISUCON初心者はこの本を読んでおけば間違いないと思います。
ISUCON本の付録Aで手を動かしておけば、「ISUCONに参加したけど何もできなかった」状態にはならないと思います。
過去問
過去問は、ISUCON10の予選だけ解きました。
ISUCON本の付録Aには、複数台構成の場合の手順は記載されていないので、
複数台のサーバーを利用する問題も一つは解いておくと良いと思います。
最後に
運営の皆さん、素晴らしいコンテンツをありがとうございました。
初参加でしたが、かなり楽しめました。来年も参加します!