ISUCON5 の予選に参加しました。
課題は、 ISUxi という「高負荷に耐えられるSNSコミュニティサイト」のチューニングです。
私は、@ytn86、@himktと takoyaki
というチームを組んで、参加しました。
方針
- 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
その他
- sysctl の設定変更 (
net.ipv4.ip_local_port_range
とか)
出来なかったこと
- erb 内で動く謎のクエリ発行を無くす
- 各種ミドルウェアのログを吐かせない
- erb -> slim(コスパ悪そうなので避けていた)
- 足あととかのクエリを非同期処理に
- ベンチマークだとユーザテーブルに変更が入らないので /initialize で RAM に載せる
- sinatra 要らなくね
- select句 のカラム指定( /view に触れたくなかった)
結果
1100 〜 1200 ぐらい
まとめ
予習しておけばよかった。
前日にGoogle Cloud SDK の導入をして過去問のインスタンス起動までは試したのですが、 アプリが起動せず(原因不明) 投げ出して CODE FESTIVAL に参加してしまい、コンテスト時間内に情報収集から始めていたのは、もう少し改善できた気がします(どちらにせよスコアは変わらなそう)
あと計測や負荷テスト用のツールを色々と知っておくべきだなと思いました。(生ログを眺めながら作業していたので)
というわけで、結果はともかく色々と知見を得ることが出来ました。ありがとうございました。
GCP のクーポンが余ってる気がするので、コンテスト時間内に出来なかったことや他の方の writeup を参考に色々試してみようと思います。