Hatena::ブログ(Diary)

Dマイナー志向 このページをアンテナに追加 RSSフィード

2016-09-18

ISUCON6予選で敗退しましたがAzureに詳しくなれました

AppArmor Goとして @netmarkjp, @ishikawa84g, @matsuu で参戦しましたが残念ながら去年に続き予選敗退(推定)となりました。最終スコアは24000ぐらいです。

序盤

  • デプロイが終わって何も変更していない状態(デフォルトのperl実装)でベンチマーク回す
    • →スコア0
  • Go言語に切り替えてベンチマーク回す
    • →スコア0
  • MySQLに適切なインデックス追加、htmlifyの正規表現生成を切り出してentryの追加/削除があるまで正規表現をキャッシュして使いまわす
    • →スコア0

えーこれでもダメかーと思いつつ昼食で気分転換。

中盤

昼食で思いつきました。

  • 初期状態でentryごとにマッチするキーワードを予め抽出してキャッシュし、entryの追加/削除があるごとにentryごとのキーワードキャッシュをいい感じに調整することで正規表現生成のコストを下げようとする
    • →キーワード一覧を生成したものの、Goでregexp.Regexpの生成があまりに遅く事前キャッシュが全然終わらない
  • Goのregexp.Regexpの利用を諦めてPCRE実装を試みようとする
    • →実現可能性を疑ってしまいあまり手が進まない
  • このあたりから右往左往

ヤバイヤバイとこのあたりで少し焦り始める。

終盤

この時点で16:30、未だスコア0のまま。

  • Goを一旦諦めPerlに切り替え、htmlifyの正規表現生成をキャッシュするところまで実装
    • →スコア10000ちょいを記録。まじかよF***。Goつらい。
  • ようやくスタートラインだ、Perlでボトルネックを調べて潰していこう
    • 久々のPerlですっかりDevel::NYTProfの使い方を忘れてしまっており、ボトルネックをきちんと把握できないままの悪戦苦闘

最後にスコア24000ぐらいを記録してフィニッシュでした。つらい。

反省会

Goで正規表現のCompileが遅いのは事前に把握していたのですが、それをどうにかする方法が思いつかず惨敗でした。またGoを諦める判断も遅かったしGo以外も勉強しておけばよかった。複数の言語に対応できるようにしておくことは大事ですね。

あとで聞いた話によるとgolangであればstrings.Replacer が使えるらしいです。なるほどー。しかし自分の知識とググラビリティではその情報にたどり着くことはできなかったでしょう。南無。

まとめ

予習のおかげでAzureに随分詳しくなれました。今後の仕事に大いに役立ちそうな気がします。

ISUCONでは負けましたが、大きな戦果を得ることができました。ありがとう運営さんありがとうISUCON!

ISUCON6予選の過去問Vagrantも作り始めてます。乞うご期待。