オンラインで開催された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も最高に楽しかったです
来年も開催される事を心から願っております!!