ISUCON5 の予選に参加しました。

#webapp 2015/09/27

ISUCON5 の予選に参加しました。

課題は、 ISUxi という「高負荷に耐えられるSNSコミュニティサイト」のチューニングです。

は、@ytn86@himkttakoyaki というチームを組んで、参加しました。

方針

  • nginx + sinatra(rubyでの参考実装) + mysql
  • アプリケーションコードはプライベートリポジトリで管理
  • 各設定ファイルは Gist で管理
  • 共有事項は Google Drive に集約

やったこと

nginx

  • worker_process
  • keepalive_timeout
  • static file(js, css, font) を nginx で返す
  • static file のキャッシュ
  • gzip
  • upstream との接続を UNIX domain socket で
  • server_tokens off

sinatra

  • 1件対象な query に LIMIT句 を追加
  • 無駄な処理の除去 (? true : false とか)
  • listen を port:8080 から socket に
  • worker_processes
  • static file の配信をしない
  • その他

mysql

  • query_cache
  • インデックス

その他

  • sysctl の設定変更 (net.ipv4.ip_local_port_range とか)

出来なかったこと

  • erb 内で動く謎のクエリ発行を無くす
  • 各種ミドルウェアのログを吐かせない
  • erb -> slim(コスパ悪そうなので避けていた)
  • 足あととかのクエリを非同期処理に
  • ベンチマークだとユーザテーブルに変更が入らないので /initialize で RAM に載せる
  • sinatra 要らなくね
  • select句 のカラム指定( /view に触れたくなかった)

結果

1100 〜 1200 ぐらい

まとめ

予習しておけばよかった。

前日にGoogle Cloud SDK の導入をして過去問のインスタンス起動までは試したのですが、 アプリが起動せず(原因不明) 投げ出して CODE FESTIVAL に参加してしまい、コンテスト時間内に情報収集から始めていたのは、もう少し改善できた気がします(どちらにせよスコアは変わらなそう)

あと計測や負荷テスト用のツールを色々と知っておくべきだなと思いました。(生ログを眺めながら作業していたので)

というわけで、結果はともかく色々と知見を得ることが出来ました。ありがとうございました。

GCP のクーポンが余ってる気がするので、コンテスト時間内に出来なかったことや他の方の writeup を参考に色々試してみようと思います。