myfinderの技術や周辺的活動のblog

2011年8月28日日曜日

#isuconの結果を反省 または私は如何にして心配するのを止めてパラメタ設定を細かくいじるることに終始したのか

なんでもありのWebアプリケーション高速化バトル、#isucon に参加してきました。
まずはこのような機会を設けていただいたLivedoor並びに技術部会の皆様に感謝申し上げます、良い刺激を受ける事ができ、本当に楽しい一日でした。

さて、藤原組長が圧倒的だったのは誰しもが知るところですが、我々 [真夏のサイクロンウェーブ] はノーバリューでフィニッシュと相成りました。
この結果をバネに次へつなげるためにも、成功したやり方を実際に手を動かして検証することがなにより重要だと考え、このエントリを書いた次第です。

このエントリを書けるのも、id:tagomorisさんがソースコードとベンチツール一式を公開してくれているからです、Livedoorは勉強会のアフターケアまで完璧ですね。

  • まずはisucon環境を手元につくろう

id:riywoさんが手順をあげてくれているので、それにならうのがよいでしょう。
最近のPerl環境はとても手軽で手早く準備できるようになったので、快適に作業が進められますね。
ただ、上記ページの手順や記述は抜けがあるので、直してひとまずベンチが実行出来る状態まで直したものを https://github.com/myfinder/isucon にあげてます。
(直したのはtoolsとPerlアプリのみですが)
この差分を見れば直さないといけない箇所がわかると思います。

この状態でベンチを走らせても、環境によっては多分遅すぎて妙なfailが出てしまうなどあるかもしれません。
(このあたりは実装を見つつtagomorisさんに相談してみているところです)
手元のMacBook Air(C2D, RAM4GB)ではどうしてもfailしてしまっている状況で、チューニングしたらテストが通るようになりました、謎。

  • 取り急ぎクエリの改修を試みる

藤原組長のやったとおり残念なクエリをどうにかするためのテーブル変更をします。

alter table article add comment_created_at datetime;

create index article_comment_idx ON article (id, title, comment_created_at);
update article set comment_created_at = (select max(created_at) from comment where comment.article=article.id);


  • 結果

手元のMacBook Airで60前後な上に(多分)遅すぎて通らなかったテストが通るようになりました。
素のApache(mod_proxy), MySQL5.1で、更にそのすべてが1台に乗っている状態で、60前後->1300前後まで改善されました。
更にキャッシュを効かせたりしていけばさらに10倍以上は高速化できそうです。

引き続きいろんな方のアプローチを参考に、チューニングしていってみようと思います。
第2回は懇親会でどこかのISPの方が手をあげていらっしゃったので、開催されるのであれば再挑戦したいと強く思っとります。

それでは。

0 件のコメント: