詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

ISUCON5 予選通過したが若手に負けました #isucon

表題のとおり、ISUCON5 予選日曜の部にチーム「2nd party cookies」として参加し、17609点の総合10位で本選出場となりました(http://isucon.net/archives/45532743.html)。

それは良かったのだけど、実はうれしさも8割引きで、というのも同日に参加し3位で通過した「はむちゃん」、ここに勝つことが第一の目標だったからなのでした。はむちゃんははてな社内の若手エンジニアで組んだチームで、真っ先に ISUCON への参加表明をしていたので、それに触発されるかたちで自分も参加を決めた経緯があります。id:wtatsuru とともに、チーフエンジニア3人のチームでガチンコ勝負しようぜ! って言ってたら @Songmu さんがうらぎ先約のあったらしく、代わりというわけではないが、ISUCON はインフラ見られる人が2人はいるなという目論見の下、インフラもアプリもできる最高の人材 id:ichirin2501 に声をかけてチーム結成となりました。

やったこと

言語には Perl を使用。去年までの経験から、計測・計画せずに手を動かしはじめるのはキケンだと分かっていたので、開始1時間までにもろもろの環境を作ったら手を止めてアプリを見よう、と決めていて、ちゃんとその通りにできたのでえらい(小並感)。Devel::NYTProf を仕込む準備もしていたけれど、どうやら今回はクエリ改善が主だなということで出番はなく、終盤一度だけ使ったけど、収穫も特になし。予想していたよりアプリの規模が大きくて戸惑ったけど、その分やりがいがあって楽しかった。

方針は普通の改善をしていこう、ということであまり既存の実装から大きく変えることはせずに、pt-query-digest の結果とアクセス分布から重い所をひとつひとつ真面目につぶしていった。

役割分担は自分がアプリで、wtatsuru インフラ全般、ichirin2501 クエリ周りとアプリ、あと時々ぼくが適当な策を言うのをシラッとした目で見るというのをやってもらった。インフラはたつる先生に守られてるという安心感があり、いちりんちゃんは両方と話ができるのでつよい。チーム名は「もてめん」+「だぶるたつる」+「いちりんちゃん」で「もてるたつるちゃん」にしたかったけど却下されました。

  • comments に entries.user_id を持たせる
    • バッチを Perl で書いたらやたら時間かかってしまってよくなかった。要復習
  • users をメモリにキャッシュ
  • relations は one だけで引く
  • relations は一度に引く
  • トップのために 1000 件引いているのをキャッシュ
    • ここだけ memcached を使用
    • スコアは上がったが改善としては良くなかった

などなど。手を付けられなかったのが

  • footprints
    • どうしようかなー、と考えあぐねてたら手付かずになってしまった。終盤で初期データを覗いてみたら created_at が同じ日であるものが数件しかなかったので、うまいことクエリを直せそうだったが果たせず
  • UNIX ドメインソケットによる通信
    • 終盤、そろそろやるか、といってアプリと nginx、MySQL 間を UNIX ソケットに変更したがスコアが微減したので戻してしまった。ここはよく分かってないので復習

感想

予選から解きごたえのある問題で楽しかったし、ベンチマークツールが安定していて待ち時間もほぼなく、ストレスなく問題に取りかかれました。終盤のキューが捌ける速度がすごかった。運営のみなさんありがとうございました! 本選でもお世話になります!

それにしても若手に負けたのがショック。今回はアプリエンジニアの力量で負けたな、という感じなので気分はシオシオのパーです。今日は震えながら出社してます……。

はてなで一緒に働きませんか?