概要
ISUCON12予選に初参加しました!
ISUCONという大会自体は2年ほど前から知っていたのですが、
参加チームの上限が決まっていることもあり、あまり技術力が高くない自分が出てもいいのかと今まで尻込みしていました。
今年も見送りかなーと考えていたのですが、ISUCON本を読んだことでチューニングの基礎を勉強でき、参加しようと決心できました。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にインデックスを作成(この時点で約5000点を記録)
13:30~14:00 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を書く機会が少ないこともあり、SQLの改修にかなり時間を費やしてしまいました。来年はSQLの筋トレをしてから臨みたいと思います。
勉強した内容
ISUCON本
ISUCON初心者はこの本を読んでおけば間違いないと思います。
ISUCON本の付録Aで手を動かしておけば、「ISUCONに参加したけど何もできなかった」状態にはならないと思います。
過去問
過去問は、ISUCON10の予選だけ解きました。
ISUCON本の付録Aには、複数台構成の場合の手順は記載されていないので、
複数台のサーバーを利用する問題も一つは解いておくと良いと思います。
最後に
運営の皆さん、素晴らしいコンテンツをありがとうございました。
初参加でしたが、かなり楽しめました。来年も開催されることを願っております。