読者です 読者をやめる 読者になる 読者になる

初めてのシステムと日記

システムも日記も初めてです。

ISUCON予選2日目に初参加してきた #isucon

http://isucon.net/

ISUCONとは
お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトル、それがISUCONです。
過去の実績も所属している会社も全く関係ない、結果が全てのガチンコバトルです。

ということでISUCON予選2日目に会社の後輩2人とチームを組んで初参加しました。

事前準備と決め毎

  • アーキテクチャ
  • 担当
    • DB・サーバサイドは私
    • インフラ、フロントエンド周りは後輩達
  • バージョン管理
    • もちろんGit
    • bitbucketのプライベートリポジトリ用意
    • チームアカウントで共通リポジトリ作成
    • 個人アカウントで上記フォークして作業を行う
    • 作業する際には課題を作成しログを残す
    • PRは必要に応じてレビューする
  • 本番反映フロー
    • 面倒なので本番環境で直接git pull origin masterする
  • コミュニケーション
    • オフラインで集まるので基本は口頭
    • 重要な事はChatworkで残す

当日開始前

  • 作業環境
    • 会社の会議室借りる
    • MBA + 縦型ディスプレイでのディアルディスプレイ
    • iPad Airも持ってきたけど結局使わなかった
    • プロジェクターと共有PCでやるべき事を常に表示
    • お菓子大量購入

開始してから12:00くらいまで

  • サーバ構築
    • 運営からAWSの$25クーポン貰えたので以下構成でインスタンス作成
      • 本番環境
      • 各自開発環境3台
  • リポジトリ構築
    • 本番環境の構築を先にしてもらい、bitbucketのチームリポジトリにpush
    • 各自の開発環境が準備出来たら、forkしたリポジトリをcloneして作業
  • スコア出し
    • ひとまず本番環境からデフォルト状態で叩いて1300くらい
  • ソースレビュー
    • プロジェクターにコード映しながら対応方針考える
    • 対応方針
      • Nginx化
      • 外部ファイルのキャッシュ化
      • SQLチューニング
      • MySQLのmy.cnf設定
    • (今思えば、DBのデータ件数が20万件くらいの時点でDB周りのチューニングを優先度低くすればよかった・・
  • 16:00に一旦対応した物でスコアだそうと決めて作業開始
  • ここまでは比較的順調

12:00から16:00くらいまで

  • sloq_query設置
    • long_query_time=1で設定したけど初期化のバルクインサートくらいしかのらない・・
    • long_query_time=0にしてmysqldumpslowコマンドで解析すべきだったと後に反省
  • my.cnf設定
    • 最大接続数周りを400にしたら200くらいスコアあがった
    • innodb周りのメモリを潤沢に振ったがほぼ効果でず、むしろスコア下がった
    • top見るとメモリよりCPUが喰っていたのであまり効果でない
  • Nginx化
    • 詳細な設定は後輩が対応したので把握してない
    • これでスコアが2000くらいになった
  • add index
    • ALTER TABLE login_log ADD INDEX (user_id, succeeded, ip);
    • 後輩が複合INDEXを貼った
    • これでスコアが4000くらいになった
  • フロントエンド
    • 後輩と2人でソース見た
    • JSもCSSもほぼ使ってなかったのでチューニングする所なし
    • 今回の課題はフロントエンド殺し・・

16:00時点でのスコア

  • 4030くらい
  • 他のチームがだいたい10000オーバーしていて何してるんだと疑問

16:00から17:30くらい

  • my.cnf設定引き続き
    • sort_buffer_sizeなどをチューニング
    • 200くらい上がったが思ってた以上のスコアでない・・
  • Nginxでのexpires、gzip対応
    • ヘルプに入ったがNginx初めて触ったので結局対応出来ず・・
  • アプリ
    • 複数回呼び出している処理を整理
  • この時点でベンチマークでworkload指定する事を知って発狂した

17:30時点でのスコア

  • 4200くらい
  • 万策尽きてきた
  • 会社から他に2チーム出場してるので物理的妨害しようとしたけど失格になりたくないと諦め

18:00まで

  • workloadを調整しながらベストなスコア算出
  • 最終的には4300くらい

良かった事

  • bitbucketのプライベートリポジトリ便利
    • 無料でほぼGitHub変わらず作業出来た
  • MBA + 縦型ディスプレイでの開発
    • 縦型ディスプレイの前にMBA置いて縦長なディアルディスプレイにしてみた
    • MBA:チャットや調査専用
    • 縦型ディスプレイ:ターミナル専用
    • 横置きでのディアルディスプレイより見る範囲が狭くなったので作業し易かった

f:id:boss_sato:20140929144414j:plain

※写真は実際の作業環境とは違うけどイメージ

反省点

  • Nginxのチューニング
    • 今回の課題はアプリチューニングよりいかに接続させないかが重要
    • Nginxをもっと勉強していればもっとスコア伸びた
  • 1つの事に固執過ぎた
    • 役割分担を決めた事で変にそれに固執過ぎてしまった
    • 早い段階で諦めて別の手段を考えるべきだった
  • アーキテクチャの選定
    • Redisなど、他のミドルウェアの知識が乏しく乗り換えができなかった
  • ネットワーク
  • SSHの設定
    • SSHもよく切れたので事前にクライアント側で設定すべきだった

まとめ

もともと軽いノリで参加したので順位に拘りはなかったですが、ここまで差をつけられるとさすがに悔しいものがあります。ただ、エンジニアで集まってわいわいしながら開発するのはとても楽しかったですね。次回はもっとミドルウェアや判断力を身につけてリベンジしたいと思います。

運営、参加者の皆様、お疲れ様でした。