廃墟

本ブログは更新を終了しました。 技術的な記事のみ、有用性を鑑みて残しておきます。

ISUCON4 予選に出てきた

去年に引き続いて今年もISUCON4の予選に出ました。

去年は学生だったので @cnosuke , @rkmathi と一緒に出てたのですが、 今年は学生じゃないので @syu_cream , @suma90h と一緒に出ました。チーム名は「SSS」 (僕の本名、彼らのアカウント、の頭文字がすべてSなので。) 僕がタイミング悪く沖縄に出張していて、合流出来ずリモート参戦でご迷惑おかけしちゃいました。

前回はプログラムの方にいろいろとバグがあったのですが、今回はコード自体は普通に動くようにできていたという印象です。 寧ろ、改変したSQLにバグがあったりして3時間ぐらいドブに捨ててしまったのが痛かったです。 8時間って短いですねぇ、やっぱり。

mysqlのCPU負荷が異常に高かったのでインデックスを貼ってみた所で劇的に解決しました。 コードの改変より先にそっちをやれば良かったですね。

16:50時点でのスコアが4426しかなくて、こりゃあお通夜だなーと思っていたら、後半いろいろ頑張ったら結果としては25348ぐらいまで向上しました。 それほどインフラ特化じゃないプログラマーのチームとしては、悪くないんじゃないでしょうか。

主にやったこと

  • nginx チューニング
    • syu_cream がやってくれた
    • 静的ファイルはnginxで返す
    • worker_processは1で同時接続数は1024ぐらいにしてた
    • gz圧縮の話もあったけど、ベンチマークがローカルで動いていることから逆効果かなと思って止めた
  • mysql のパラメータチューニング
  • mysql へのインデックス追加
    • わりと順当に login_log の ip と user_id それぞれにインデックスを追加しただけ
  • unicorn のプロセス数と mysql の max_connections のチューニング
  • puma への変更
    • 最終的にスレッド5つ、プロセス4つに落ち着いた
  • TCP(OS)のパラメータチューニング
    • "dial tcp 127.0.0.1:80: cannot assign requested address" エラーへの対処
    • sysctl -w net.ipv4.tcp_tw_recycle=1
    • (syu_cream/suma90hがやってくれたから良く分からないけどエラーが止まった)

やってみたかったけどできなかったこと

  • MySQLのvarchar(255)になっているカラムの長さを調節
    • login_log の login とか、 (24) にすれば良かった気がする
    • booleanで良い部分が tinyint(4) になっていた所も似たような話
  • ベンチマーク直前のウォームアップ時
    • MySQLのキャッシュを暖める
    • MySQLのコネクションをあらかじめ貼っておく
  • きちんとボトルネック解析
    • 結局、せいぜいtopを見る程度で、細かくボトルネックを解析できなくて、場当たり的でした

感想

去年も言ったけど、こういうパフォーマンスチューニングも面白いですねぇ。 勉強になるので、来年も参加したいなーと思っています。

一緒に参加してくれた @syu_cream さん、 @suma90h さん、ありがとうございました!