2015年9月27日日曜日

Excel系SEがISUCON5に参加してみた



ISUCONなる面白そうなコンテストがあったので、同僚を誘って計三人で参加してみた。
やったこと、感想などを残しておく。

1.ISUCONとは

お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトル。 詳しくはこちら

2.準備編

今年6月ぐらいからISUCONが開催されることを知ったので、三週間に1回ぐらいみんなで過去門をやるぐらいのまったりペースで練習開始。普段こういうチューニングはやらいので、みんな手探りの状態からとりあえずスタート。最終的に5回ぐらい集まって練習会を実施し、行ったのは大体以下の内容。

  • 1回目・・・ とりあえずISUCON4予選過去問をやってみる。AWSの設定やら試行錯誤でみんな好き勝手にいじる。模範解答を参考にnginxやRedisを入れてスコアをあげてみる。
  • 2回目,3回目・・・ ISUCON4予選問題を各自でいじってみて、結果を持ち寄る。node + Redis構成にしてMySQLを完全に取っ払うことで、当時の予選通過スコアぐらいまで出せて満足。
  • 4回目・・・ ISUCON3予選問題をみんなでやる。そろそろ本番はどういう構成で望むのかを議論。みんなそれほど得意な言語はなかったので、最大公約数的にRubyを選択し、DBは部分的にRedisかもしくはSQLite(インメモリ)で行こうという方針で検討。
  • 5回目・・・ ISUCON4予選問題をRuby+Redis+nginx で構成するように模擬本番形式で実施。Google Cloud Platformで動くISUCON4予選イメージが配布されていたので、そちらを使用する。スコア送信用本番サーバ1台と、各自の開発用サーバ1台*3の構成で実施。ファイルの受け渡しはGithub上のリポジトリでやり取りするように取り決め。SSH鍵の作成やRuby, Redis, nginx の設定ファイルテンプレをリポジトリに登録。
# レギュレーションを見て、予選終了までリポジトリ公開は禁止だったので、慌ててgithubアカウントをプライベートに変更(合わせてGithubアカウントをアップグレード)

また、予選をチーム名"本業:Excel職人" で登録。

3.本番当日編

10開始予定だったので、9時に集合して買出しなど済ませ、準備に入る。
その後アナウンスがあり11時開始に変更となったので、それまで待機。ISUCON4のイメージを上げて復習。

11時からポータルサイトにアクセスが解禁され、VMイメージが公開されたので、早速展開して接続。その際に"uname -a" を打ったときに衝撃が走る。

Linux isucon5-production 3.19.0-21-generic #21-Ubuntu SMP
Ubuntuだと・・・(´゚д゚`)


ISUCON4予選も3予選もCentOSだったので、Ubuntuはノーマークだった。しかも普段CentOSしか触っていなく、Ubuntuをサーバ用途でいじったのは何年ぶりかわからない。
しかもサービスはsystemdで管理されているし。。これログどうやってみるんだっけ。。
※(追記) レギュレーションにUbuntuって追記されてましたね。。恥ずかしい。。

学生のころの期末テスト開始直後で問題用紙を裏返して見た直後に"ここ出すんかい"
と試験勉強範囲を外されたときと似た思いだった。

お題はSNS系のサイトだった。過去の予選に比べかなり複雑な印象を受けた。
DBのテーブルも今まで2~3個だったけど、今回は7つ。

とりあえず1時間半程度かけてみんなでコードリーディングしながら、改善点を洗い出していく。
最終的に変更できたのは以下の内容。

  • nginxでの静的ファイルのキャッシュ。nginxやunicornの稼動プロセス数の変更。通信のgzip化
  • tcp接続からunixドメインソケットを使用するよう変更
  • 足跡の処理をMySQL -> Redisに変更
  • 日記のentryテーブルのbodyカラムにタイトルと本文が入っているために、分離
  • usersとsaltsテーブルの統合
  • いけてないMySQLクエリを粛々と改善。インデックスの検討
  • 不要なサービスの停止
上記のことをやっていたらいつの間にか8時間たってしまった。
スコアは上位陣とは程遠いもので、初期スコアよりはまあ改善は見られるものの、もう少し出せればよかった。。上位陣の模範解答が気になる。

練習でやろうとしていたことは最低限できたような気がしたが、修正スピードが遅かった。
もう少し多くの部分をRedisに置き換えたかったが、ベンチに怒られて最終的にコミットできず。
また練習ではベンチマークがまわし放題だったが、本番ではベンチの実行リクエストがキューに
たまるので好き放題まわせなくて、修正に戸惑う場面もあった。

今回の練習でsinatoraとかnodeとかRedisとかnginxとか普段触らないものを勉強できたのでいい機会だった。
前回よりお題が複雑で、運営さんも大変そうだった。

似たようなイベントがあればまた参加したい。


※上記ロゴ画像は本家より拝借しております。問題ありましたら削除しますのでご連絡下さい