Subscribed unsubscribe Subscribe Subscribe

@kyanny's blog

Write down what I learnt. Opinions are my own.

#isucon 2013 予選通過

isucon 2013 予選通過した。チーム名は :ok_woman: 選んだ実装は Ruby (Sinatra)

ISUCON 本戦出場者決定のお知らせ : ISUCON公式Blog

予選二日前に @banyan から誘われ急遽参戦を決めた。予選当日までは十分な準備期間はとれなかったが、三回連続参加と場数だけは踏んでいるので振り返りという名の反省文を private repo の issue に書いて共有したりした。

当日の流れ。なんとなく役割分担したほうがいいねと事前に打ち合わせていたのもあり、チームリーダーの @m4i がデータベースを中心にパフォーマンス計測とチューニングの方針決定担当、 @banyan がデプロイ、開発環境整備、フロントエンドなどの足回り担当、残った僕がアプリケーション担当でひたすらコードを書く、という感じだった。

はやい段階で git pull によるデプロイ、各人のローカルマシンでアプリを動かす手順の整備、 MySQL のパフォーマンス計測体制の準備などが済み、スムーズな出だし。行ったチューニングはごくごくふつうのことばかりで、飛び道具的なことをする余裕は無かった。

  • まずログ出し enable :logging
  • `markdown` を redcarpet に
  • alter table add index
  • @m4i 「users テーブルって不変だから丸ごとキャッシュできそう」初回引いたら全部 memcached にキャッシュ
  • static file を nginx でサーブ
  • count(*) をキャッシュ
  • @m4i 「sinatra のログ集計して path 別に所要時間出すスクリプトできた」 /recent が一番遅いので他後回しでここに集中
  • String#split の多用を無くそうと --init 時に別カラムに入れてしまう改造をしたが投入できず
  • String#split 遅そう、の確証が欲しく各種 profiler を試すが不慣れなため導入・計測できず
  • --workload を増やしたり unicorn worker 数を増やしたりして計測して最適値を探る
  • @banyan 「Sinatra のページキャッシュを試す」終盤十分な検証時間が無く投入断念
  • last_access 消すとかも気づいてて Pull Request まで出してたけど投入し忘れ

他にもありそうだったけどだいたいこんな感じで、あっという間に八時間が過ぎた。ラスト三分で走らせた最後のベンチで最高スコアを出せたので良かった。

三回目だけあって戦い方がわかってきたおかげか、明らかな悪手は打たずに済んだと思う反面、課題も多く見つかった。

  • 中盤、キャッシュ周りの実装を投入したらベンチが安定せず三たび Revert して時間を無駄にしたのはもったいなかった。 configure ブロック内でキャッシュすればアプリ起動時に終わるからスコア伸びそうだと欲張って不安定な実装にこだわりすぎた。はじめから素直な「初回 GET 時にキャッシュ」アプローチをとっておけばよかった(それによってその部分が一番遅い部分でなくなるのならそれ以上最適化せずもっと遅い箇所をいじるべき)
  • --workload の調整などを中盤にやったのは無駄だった。アプリケーションをチューニングすれば最適なパフォーマンスを出せる負荷の値も変わるわけで、傾向を見るだけなら序盤に足回りを整備している間にやっておくべきだし、終盤にアプリの最終版が見えてきた頃にぎりぎりまで実装をいじらず条件変えてベンチに徹する、などすれば十分だった
  • レギュレーション上は複数インスタンスを起動することは禁止されていない(はず、明示的に許可もされていないが)各人がそれぞれインスタンスを起動してテストベンチを実行すれば並列にチューニングの検証ができて効率が良かったはず。レギュレーションの読み込みが甘かった。発想の転換みたいなのも足りなかった(--workload オプションはさすがにおや?と思って運営に尋ねるくらいのことはしたが)
  • 腹が減っては軍は出来ぬ。ろくに昼食を食べずぶっ続けでやっていたので夕方くらいに集中力を欠いてしまった。

Pull Request ベースでの開発(レビューを経るので凡ミスが見つけやすく計測の手戻りを減らせた) IRC の活用(URL を貼れる場所は必要)など基本的なツールは使いこなせているので、本戦に臨むにあたり、パフォーマンス計測やログ統計などの実用ツールにもう少し習熟しておきたい。今回の敗因はアプリケーションエンジニアとしての自分の実装力不足だと痛感しているので、手の遅さをツールで補えるよう予習に励みたい(べつに負けてはいないのだけど)

余談だが Quipper からは @kyanny @banyan (:ok_woman) @hakobera (Noder) と三名が参加して全員予選通過。地球の裏側にいる Director of Technology の @masatomon からは「本戦はワンツーフィニッシュしてこい!」と激励の言葉をもらった。それはさすがに無理かなぁ...