毎年恒例のISUCONに参加してまいりました。
毎年今年こそは!と心に闘志を燃やして参加するのですが、今年も予選敗退でした。残念。
ISUCONとは「いい感じにスピードアップコンテスト」の略で
与えられたお題のWEBアプリケーションをできるだけ早くし、ベンチマークの出す点数で競うコンテストです。
今回は社内の方々にお誘い活動を行って捕まえたkawakattsun、luccafortと僕(cs_sonar)の3名で参加しました。
僕はISUCON1から参加していて、kawakattsun、luccafortは今回がISUCON初参加でしたので
裏テーマとして二人がISUCONを本気で楽しんでもらえたら嬉しいなーと思っていたのですが
実際はものごっつい楽しんでもらえたようで結果は惨敗でしたがそういう意味ではとても成功だったと思います。
順位は暫定55位で点数は72,285。言語はPHPです。
そういえばISUCON1は複数台構成だったなぁと思い出しました。
事前準備
業務の忙しさにかまけてあまり事前準備してなかったです。
2ヶ月前くらいにみんなでPixivのISUCON問題をじっくり解きましたので
今回非常構成が似ていたのでそれがよかったです
- とりあえずベンチ回す
- レギュレーションを熟読する
- git
- phpに切り替え
- SSH簡易接続設定
- mysqlのdata dir をコピー
- アクセスログ解析(analog)
- netdataつかってみる?
- app armor注意
- プログラムDBで明らかに重いところを潰す
- インフラ関連のチューニングを行う
- ある程度のチューニングができたら抜本的な構造変更の対策を検討
- ボトルネックを常に潰していく
- 同時に改修は行わない。
- なにがよくて何がだめだったかがわからなくなるから
という方針だけ前日10分くらいでざっくり作って共有。
本番での流れ
もうあたふたしてたので詳細は覚えてないですが・・・
- 9:30 会社に到着。会社にいた方がエナジードリンクを差し入れしてくれた。
- 10:00 開始が遅れるらしい。 これはこれで非常に有意義な時間だった。お祭り感。
- 11:30 もう今日はないのでは?と、昼から飲みに行く気に半分くらいなってた
- 13:00 開始・・・されない。このズコーー!がお祭り感がさらに加速。
- 13:10 本当開始!とりあえずSSH鍵認証。
- 13:12 初期ベンチ pythonで6189
- 13:30 各サーバーどこからでも ssh {web1|web2|db}で接続できるように設定
- 13:30 DBサーバーのID/PASSをあふあふ探す
- 13:30 PHPに切り替えてベンチで4157
- 14:00 DBが重かったので簡単にチューニング。innodb_flush_log_at_trx_commit = 0 くらいですが。6397
- 14:15 さくっとanalogでアクセス数だけ確認。loginとadd_channelとかが多い
- 15:00 slow_logから明らかに画像の部分がボトルネックなので静的に書き出し、nginxでiconsから返すように設定。8293
- 16:00 mysqlのINDEX貼る、N+1改善、php-fpmプロセス数上げる、などなどで12000
- 17:00 疲れが見え始めた所に社内の方が差し入れでお菓子とジュースをくれる。ありがたい。余ったけど。
- 17:10 nginx <=> php-fpmをunix domain socketに変更するのに僕が結構はまる。20000
- 18:00 php-fpm <=> DB をスレッドプールするようにした。mysql-pdoでいうparsistantの設定。点数はメモってなかった
- 18:30 静的ファイルの接続でエラー出るので帯域でつまってる事にやっと気づく。
じゃぁ3台から返せばいいんじゃね?という事でこの時間で大きな構成変更をした。ベンチ対象は全台に変更。
1[app1] [app2] [app3]
2web web web
3app app db
- app3への接続は静的ファイルはそのまま返し、それ以外はロードバランス的にapp1/app2 に振り分け。
- iconsの共有はnfsを使用。app1をnfsサーバーにしてapp2/app3はnfsクライアントとしてmountする形に。
- 静的ファイルを304で返せるように expire 10d;を追加。 (ここがpublicつけないといけなかったなどの話)
- これで59000
- 20:15 SQLのストリクトモード消したりして73160が出た。これが最高得点。
- 20:30 ここからベンチガチャがあって15000 ~ 70000まで大きく振れまくる・・・304レスポンスの数で変わってたのかな
- 21:00 再起動テストをする。nfsマウントしてたので起動順によってはマウントされない事態が発覚。autofs入れて対応。
- 21:10 ベンチ&ベンチ&ベンチ&ベンチで72285が出たのでやめる
僕はプログラムをまったく見ておらずインフラばかり見てました。
php-fpmのsocket化の権限関係でえらいハマってしまい、プログラム見る時間がなかったです・・・
のでプログラム部分はkawakattsun、luccafortがいろいろとやってくれていたのだと思います!
アクシデント
- gitのリポジトリのdbディレクトリを含めてしまい、復旧用dumpが含まれてしまった為にどえらい重いリポジトリに
- 画像の静的化の時にDBをやらかしてしまいdumpから復元する事態に
- php-fpmの設定ファイルのコメントが#ではない事に気づくのがかなり最後の方だった
- 開始が3時間遅れたので、後に予定のあったluccafortが途中で抜けてしまう
アクシデントを含めてのISUCON!!
感想
開始が遅れるという所で、運営側が本当に大変だったんだな、と改めて感謝です。
毎年こんなにも楽しい時間をくれて頭が上がりません。
今回の問題も本当によく考えられてて本当に楽しかったです!
メモリ1GBしかない所なんてとても素敵でした。
今年はシーズからもう1チーム出てたのですが競技終了後に「あそこどうした?」みたいな反省会は本当に楽しい
問題のリポジトリも公開されましたので、これからも社内で2次会して楽しみたいと思います!
しかし、、、とっても悔しい!くやしーーー!!!
僕はこれからブラウザキャッシュの設定で Cache-Control: public の設定をしない事はないでしょう。
ISUCONは本当に最高です!