時計を壊せ

駆け出しWebプログラマーの雑記

#isucon 3予選を運良く通過したはなし

予選通過、かなり高い壁だと思っていたので通過出来て大変喜んでおります。


ちなみに、当日記録できた最高スコアは10846.599609375でした。workloadは8です。
これ、結果がブレた原因はなんとなくわかってるので後のほうに書きます。

今回気を付けた事

既に2回参加したisucon、これで3回目の参加となりますが、
流石に3連敗とはいかんのでせめて予選通過をというのが今回の個人的な目標でした。*1
なので、ある程度は確実に作業をすすめるために幾つかチームとして動くためのささやかな作戦を用意していました!
作戦と言えば聞こえは良いですが、チームとして動く上である程度当たり前のことだと思います。

ざっくりとしたスケジュールを決めてとりかかる

マイルストーンが無いと十分に調査が終わらないまま、チューニング作業に入ってしまい、無駄な作業をしてしまう為。
業務でチューニング作業などは殆どやる機会が無い為、勘と経験で乗り切るとかスーパーな事は出来ないので、
なんとなくでやらずに時間に区切りを作って調査を行った。


具体的には以下のような感じ。

時間/時刻 やること
10:00 ~ 12:00 初期状態/ボトルネック調査
12:00 ~ 13:00 お昼食べながら作戦会議
13:00 ~ もくもく
15:00 おやつ
17:30 再起動テスト
18:00 終了

初期調査の役割分担

前回、前々回と同じ作業をみんなでやるなど無駄な事をやりまくっていた為、
ある程度は無駄をなくしたかった為、ある程度決まりきっている作業は事前に役割分担を行い、
調査が終わり、お昼を食べながらチューニング指針を検討し、再度作業分担を行う作戦で行った。


具体的には以下のような感じ。

  • 自分
    • ssh鍵,git化,deploy,restartツール等足回り系を整える
    • ログ調査
    • 各人の突発の役割分担の指示
  • id:masasuz
    • ログ調査(主にMySQLまわり)
  • id:kfly8
    • アプリ仕様調査
    • ログ調査(主にアクセスログまわり)

同時に実行するとマズい作業はロックを取る仕組み

ベンチマークの実行やデプロイは同時に実行すると結果がぶれ、再度計測し直しになったり、タイムロスに繋がります。
今回は1人だけをベンチマークを実行する役にし、他のひとは原則的にベンチマークを実行しないという事にしました。
ただ、これは反省が多く、今回はスクリプトによるベンチマークの実行が可能だったので、スクリプトの実行をwrapしてデプロイツールと共通のファイルで排他ロックを取ってやる感じでシステムでカバー出来たら良かったなと思いました。

ぼくがやったこと

本格的なチューニングはアプリ側は id:kfly8 に、DB側は id:masasuzu におまかせしつつ、
サーバーと足回りの。

  • ツール等足回り系を整える
  • 定期的に「落ち着け」言う
  • nginx入れる
  • bin/makrdownをsystemで呼び出してたのをText::Markdown::Hoedwonに置き換える
    • これと id:kfly8 によるtotal_memosをキャッシュ/incrする変更で2000くらいから5000くらいまで一気にスコアが上がった
    • 提出AMIから起動してrevertしてみたらスコア半分になった
  • StarmanからStarletに変更しkeep-aliveを活用出来るように設定をチューニング
    • max_workersもいくつか試した末、最終的には80にした
    • 冷静に見ると誤差に踊らされた感が否めない
  • deployツールやrestartツールが動かなくなるバグを調査しつつ修正していく
  • やっとこさtoolchain系が安定したと思ったら、時間がなくなってきたのでCache::Memcached::Fastなどのインスタンスをstateに入れるようにするコソドロチューニングを行う
    • ついでにCache::Memcached::Fastのserialize_methods/compress_methodsなどをData::MessagePack/Compress::LZ4に差し替える
  • recent_memosをキャッシュする作戦
    • アプローチがあまりにもあほで失敗に終わる
  • 再起動をかけるも急にスコアが落ちて混乱する
    • supervisordを見落としてデフォルトのStarmanが立ち上がってました!!!111
    • すみませんでした!!!!!!!!!!!!1111
      • 再起動できてボーナスポイント入ってたら最高スコア更新してたはず!!11
    • 設定は直したけど再起動してる時間が無かった為これが最終スコアに
  • 時間切れ間際にボーナスポイントを見付けて対応する
  • 時間切れ


はい!ぼくほとんどなんもできてないですね!!!

今回の反省点

推測するな計測せよ

焦るなつってんだろ!!!!!!!!!111 > 俺

tool chain系は事前に整えておく

すみませんでした!!!!!!!!!!!!1111

リーダーシップを発揮する役目を誰かに

すみませんでした!!!!!!!!!!!!1111

感想

workloadオプションの調整やってなかったチームの事考えると、
ふつーに予選落ちだったんじゃないかとガクブルしています。
準備すごい大変だと思いますし、全員ぶん見るのもっと大変だと思います。
これほど大変なイベントを開催して頂きありがとうございました!!楽しかったです!!

本戦への意気込み

生きて帰れるように頑張ります!!!1111

*1:あと、ITエンジニア平成会のメンバーにスコアで勝つのも目標でしたが、id:mackee_w のチームに負けました。本戦では勝ちにいきます。

*2:推測するな計測せよ違反