ISUCON5オンライン予選に参加しました #isucon
オンラインで開催されたISUCON5予選(2日目)に、ueneidさん、nakashinさんと参加しました
チーム名は「チームエイヂィ」です
言語はPerlを選択して、最終スコアは10147でした
(予選通過ラインが14000弱なので4000くらい足りない。。。)
当日の作業分担
ueneidさん、nakashinさんにはアプリ改修をやってもらい、
僕はサーバの初期セットアップとインフラを担当。後からアプリ改修作業に合流という流れ
作業しやすいようにサーバは1人1台ずつ立てて、僕のサーバに他の2人の変更をマージしていきました
当日の作業内容まとめ
- カーネルパラメータチューニング
- ファイルディスクリプタ数チューニング
- MySQLチューニング
- Nginxチューニング
- memcachedインストール
- PerlのサーバをGazelleに入れ替え
- relationsとfootprintsにインデックス追加
- relationsのN+1クエリを修正。JOINして取る
- saltsテーブルの列をusersに統合
- entriesテーブルにtitle列を追加
- ログイン時のSHA2処理をPerlでやる
- ログインユーザに対するコメント取得のN+1クエリを修正。JOINして取る
- 友達の投稿取得のN+1クエリを修正。JOINして取る
- current_userをセッションから取る
- セッションをmemcachedに保存
- 友達のリストを先にハッシュと配列に貯めておいて、友達のエントリーかどうか・友達のコメントかどうかのチェック時に使う
当日の時系列な流れ
09:30 集合
10:00 公開されたイメージでサーバ起動
- レギュレーションを印刷
- ソースコード一式を印刷
- 初期ソースコードをGitで管理
- 初期設定ファイルをGitで管理
- 画面を動かしてみる
- ソースの確認
- Perl実装に切り替えて初期ベンチ実行 初期スコア:754
- 全てのSQLをスロークエリログで出力して、実行計画を確認
- nginxのアクセスログをkataribeで分析
- チームメンバーと相談して作業内容を決定
12:00 作業開始
13:30 インフラ周りのチューニング完了
-
MySQLチューニング
-
nginxチューニング
-
PerlサーバをGazelleに切り替え
-
relationsとfootprintsにインデックス追加
スコア: 754 -> 1727
この時点でLatest Top 20のランキングで15位くらい
13:40 最初のアプリ改修
-
relationsのN+1クエリを修正。JOINして取る
-
saltsテーブルの列をusersに統合
スコア: 754 -> 1727 -> 2176
16:50 更にアプリ改修
-
entriesテーブルにtitle列を追加
-
ログイン時のSHA2処理をPerlでやる
-
ログインユーザに対するコメント取得のN+1クエリを修正。JOINして取る
-
current_userをセッションから取る
-
セッションをmemcachedに保存
スコア: 754 -> 1727 -> 2176 -> 2497
16:50 最後のアプリ改修
-
友達のリストを先にハッシュと配列に貯めておいて、友達のエントリーかどうか・友達のコメントかどうかのチェック時に使う
スコア: 754 -> 1727 -> 2176 -> 2558 -> 8781
17:35 ログ出力を止める
-
MySQLのスロークエリログ出力を止める
-
アプリログの出力を止める
-
nginxログの出力を止める
スコア: 754 -> 1727 -> 2176 -> 2558 -> 8781 -> 10147
この時点でLatest Top 20のランキングで15位くらい
終了時点では15位〜20位くらいだったと思います
個人的にハマった事
-
ファイルシステムがReadOnlyになった
AppArmorを無効にして再起動したらファイルシステムがReadOnlyになった
終了後のidobataやブログを見るとAppArmor関係なかったのかな?
早い段階だったので傷は浅かったですが、サーバを最初から作りなおしたので30分くらい無駄にしました -
entriesテーブルに列を追加するとサーバがハングアップ
僕のサーバだけALTER TABLEで列を追加すると負荷が高すぎてサーバがハングアップしてしまう現象がありました
(他のチームメンバーのサーバでは発生してないので、my.cnfで設定してたパラメータ値が大きいからかな?と思います)
このエラーメッセージがターミナルに表示されたので、メモリが足りない事がわかりましたVCS_INFO_detect_git:9: fork failed: cannot allocate memory
スワップが未設定だったので、ファイルで2GB追加したらようやくALTER出来るようになったけど
サーバの復旧とALTERで1時間くらい掛かってしまいました・・・(サーバをクローンしてスペックが高い別サーバを作り、そっちでALTERしようとしたけど、
クローンしたサーバが初期状態のままだった。GCEってそういうモノなのかな?)
その他
- GCEは再起動が早くて良いですね!
最後に
運営の皆様、本当にお疲れ様でした
今年のISUCONも最高に楽しかったです
来年も開催される事を心から願っております!!