ISUCON 7 予選に参加した話

ISUCON に学生枠で参加してきました。
チーム名「なにもしちょらんのに壊れた」で最終スコアは 40,088 でした。

メンバーは @chigichan24, @euglena1215, そして最近財布と免許証と学生証を落とした上に傘をパクられて気分が落ち込んでいる @k5342 でした。

チームメイトのエントリはこちら:

参加日は 10/22 (日) の部で、僕のおうちに集まってやりました。台風直撃の中で集まってくれてありがたかったです。部屋の湿度が一気に 30% 上がりました。また僕は次の日に中間試験を控えていて、精神的に大荒れでした。

言語は Ruby です。リポジトリの URL を貼っておきます。

前日まで

練習と秘伝のタレの錬成をしました。題材は Pixiv の private-isu, ISHOCON1, isucon4 を使った。

当日やったこと

今回は世界一高速なチャットサービスとして isubata という名前のアプリケーションがお題だった。ブラウザで眺めると明らかに世界一とは程遠い遅さで乾いた笑いがでた。

あと、ベンチが走ってるかどうか分かりやすくするために top コマンドを大画面で表示した。

初動

  • 競技開始、当日マニュアルを眺めてログイン
  • nginx.conf や mysql の秘伝のタレを入れる
  • メンバーの SSH 接続が一斉に蹴られた (13:08)
    • 開始 10 分で終了か?と冷や汗かいたが、fail2ban が悪さしてそうだったので fail2ban ban したら、なんか繋げるようになった (13:10)
  • dotfiles を適用 (13:42)
  • プロファイラ系を設定
余談ですが、謹製 dotfiles のプロンプトおすすめです。


初期ベンチは 6500 くらい。Ruby 実装に変更して 4000 くらい。
プロファイラにかけると、明らかに GET /icons/:file_name が重く、画像が DB にストアされてるらしいことが分かったので吸い出してキャッシュすることにした。
  • 画像吸い出しコードを昔書いていたのでコピペ
  • nginx の設定を画像に最適化するように依頼
  • 吸い出した画像ファイルを設置
  • ベンチ走らせる → スコア 4000 で???となる
  • 事前に用意した sysctl.conf をコピペ → スコア 3500 で???となる
画像を DB から吸い出して配信を nginx に任せてるはずなのにスコア全く変化しなかった。途中は頭をかかえて何かやったんだけど全く記憶がない。

中盤

なんか nginx の設定が効いてない気がして、秘伝のタレを一旦無視して nginx.conf を再構成。
このあたりで、明日休講のお知らせが届き、精神的に安定したのか、めっちゃ頭がまわるようになった。スコア下がってた理由が、どうやら十分に並列化できないのに中途半端に並列度が高いベンチマークが走ってたからぽいことが分かった。
worker_process の値を下げたらスコアが 6000~8000 程度で安定するようになった (18:45)。

このあたりで、mysql と puma を TCP でなく UNIX Domain Socket を使うように設定を変更した気がする。

再起動チェック。アプリケーション (Python & Ruby) が自動起動する設定になっててポートの取り合いになってたので直した。

このあたりで chigichan24 が channel_id に index が張られてないことを発見。スコアが一気に 39102 になる (18:58)。

sysctl.conf と my.cnf を再構成。スコア 35000~37000 (19:49)。

ミドルウェアはもう問題なさそうなので、コードを修正して /icons 関係をすべて DB から分離させた。スコア 43861 (20:05)。

終盤

ベンチマーク中でも CPU が遊んでたので、並列度を高めようと Nginx, Puma, MySQL の設定をいじるが、なぜかタイムアウトが大量発生して、スコアが 6000 まで落ちたので元に戻した (20:16 - 20:36)。スコアは 36000 になった。ここが今回の悔しかったとこです。サーバ 1 台のリソースを使いきれなかった。

ラスト 5 分くらいになったので再起動チェック。OK だった。

ベンチマークの振れ幅が広いことが分かってたので、ベンチガチャを回す。最終スコア 40088 で終了。

18 時までスコアが伸び悩んでいたんですけど、index 追加と今までの変更を思い切ってリセットして仕切り直したことによって、スコアが上がった。思い切った操作もときによっては大事だったと思う。


まとめ

学生枠でなんとか予選通過しました。本選まであと一か月あるので、学生の強みである時間確保のしやすさを武器に本選を頑張ります。
また今回は 3 台のマシンが与えられたんですが、結果的に 1 台のリソースを使い切れずに終了となってしまったのに悔いが残ります。
本選参加される方、11/25 に会場でお会いしましょう!

(追記:ワーカ数を増やすとスコアが落ちたのはたぶん,サーバの帯域制限に引っかかってたせいっぽい.帯域は盲点だった.)

コメント

このブログの人気の投稿

QGIS 2.14.2 Essen が「ロードされたプラグインを復元しています」で起動しないとき。