サバフェス日記まとめ #サバフェス

#サバフェス のまとめ

順位はまだ出てませんが、上位がfailしないと自分が1位は難しいかなー、という状況。 とはいえやったことを公開してみます。

アクセスパターン確認

tcpdumpやアクセスログでアクセスパターンを確認しました。 これが対策のベース。

  • 最初の60秒は GET / 祭り
    • GET祭りなので内容は全て同じ
  • 残りの120秒はPOST祭り
    • POSTの内容は定型文
    • POSTのレスポンスに動的要素は1つ(commentのid)
  • POSTの最後と30秒後くらいに GET /?p=5
  • 画像等のアクセスはなし

極めて機械的な感じ。 POSTの最後と30秒後のGETは最初はなかったけどレギュレーション改訂後から発生してたので、これでチェックしてるのしてるのは確定。

構成

  • keepalived + nginx + php-fpm(PHP5.5) + MySQL5.6 + memcached
  • 全部入りを1台用意して、その他に nginx + php-fpm なworkerを4台用意
  • 各サーバのnginxは自分のphp-fpmにアクセスするように設定。keepalived、MySQL、memcachedは1台に集約
  • インストールはremiとかのリポジトリを使ってyumで入れました。MySQLだけは公式rpmでインストール
  • nginxのアクセスログに $request_time を追加して応答時間を確認

GET対策

ざっくり構成したのみで深い追求はしてない

  • GETとPOSTが入り混じらないし動的要素がないので、全部同じレスポンスを返しておけばok。 →nginxでfcgi_cacheして90秒はcacheを返すように
  • GETのボトルネックはトラフィックだったので、DSR構成で5台に分散して力技配信
    • クライアントからのアクセスにAccept-Encoding: gzipがなかったので圧縮はしてない

POST対策

最初のボトルネックが解消しきれずタイムアップしました…

  • ボトルネックはPHPのCPU(usr)だったのでAPCを導入
  • xdebugでプロファイリングしてqcachegrindで確認 →ファイルのloadがほとんど →APC効いてない!
  • PHP5.5はopcacheらしいので、APCを消してそちらを有効に →ブレークスルーでスコア3倍 (最終日の22:30頃)
  • MySQLがボトルネックになるところまでいけなかったのでDBはあんまりちゃんとみてない。何も考えず適当に設定したのみ
max_connections = 2000
thread_cache_size = 500
innodb_log_file_size = 1G
innodb_buffer_pool_size = 512M
sync_binlog = 0
innodb_flush_log_at_trx_commit = 0
tmp_table_size = 256M
max_heap_table_size = 256M
tmpdir = /dev/shm/mysqltmp
skip_innodb_doublewrite

まとめ

あんまり凝ったこととか深い追求はできなかったのが残念でした。
あまり深く考えず意味のない設定とか入ってそうな気もする。

レギュレーションがブレましたが、他のチューニンガソンとかISUCONに参加したことがある人が運営にいなかったのかな?
ベンチ側の作り込みの程度は初期チューニンガソンくらいの感じで、ISUCONを見習って面白くなってくれるといいなって気持ち。
チューニンガソンと同じく インフラのみアプローチの限界 が見えて残念さが増す展開になったので自称インフラのみんなでもっとコードを読むきっかけになればいいなと思う次第。個人的にはnginxとかPHPの設定を真面目に見返すいい機会になりました!

運営の方々、参加されたみなさま、お疲れさまでした!


ちなみに、私が著者で参加してます

ちなみに、私が校正で参加してます



See also