いやぁ、、ほっとした。予選はこっちのblogに書かないぐらい惨敗した気分だったのでよかった。勝たなければ「LINE選抜大した事無い」とか「元出題者wwww」とか言われるし、勝ったら「#茶番」とか言われる立場でしたが、まじほっとしました。やったぁぜぇぇえぇえ!!!
(写真は http://isucon.net/archives/33919770.html から引用)
チームは、@tagomorisさん、@sugyanさんとの「LINE選抜チーム」です。お疲れ様でした!!
isucon3本戦いってきた&勝ってきた!
#isucon - tagomorisのメモ置き場
#isucon
2013で優勝しました - すぎゃーんメモ
最終的なコードや設定などはこちらのリポジトリ
予選で学んだこと
予選のときは、開始直後からアプリケーションをみて明らかに重そうなところから手をつけていって、序盤からスコアをあげていくことが出来ていたんだけど、最終的なスコアにそれを結びつけることができませんでした。
その反省から、本選ではまず最初にプロファイリングやコードの把握をしようということで、開始から1時間はコードに手をいれない時間を設けた。これが大事だったのかも
予選から本選までにやっていたこと。
予選AMIを起動していろいろ試していて
までやってたり、perlの初期スコアがかなり悪いのでそれを改善するためにいろいろやっていたわけなんですが、もちろんそれだけではなくて、必要なミドルウェアのセットアップをスムーズに行ってアプリケーションの改善に集中できるように準備をしていました。例えばnginx(openresty)であればこんな感じ
cd /tmp
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.33.tar.gz
tar zxf pcre-8.33.tar.gz
wget http://openresty.org/download/ngx_openresty-1.4.3.3.tar.gz
tar zxf ngx_openresty-1.4.3.3.tar.gz
cd ngx_openresty-1.4.3.3
export PATH=/sbin:$PATH
./configure --with-luajit --prefix=/usr/local/openresty --with-http_gzip_static_module --with-pcre=/tmp/pcre-8.33 --with-pcre-jit
make
sudo make install
sudo mkdir -p /var/log/nginx
sudo chmod 755 /var/log/nginx
sudo /etc/init.d/httpd stop
sudo /sbin/chkconfig httpd off
nginx、mysql、memcachedやProcletを使ったアプリケーションの起動などについてこういうのをgithubのwikiにまとめておいて本番に備えておいた。
本選のアーキテクチャ
@tagomoris @sugyanが既に書いているので図で。
252から255の4台がベンチマークツールからのリクエストを受けるようにして、251にproxyしてます。はじめ全台に画像を配るかーとか言ってたんだけど、この方がシンプルだしコストも低いのでこうなった。
やったことと言えば、
- 元からある画像のリサイズ
- 新しい画像をリサイズしてPUT
の2点ぐらい。あとは、iconを252-255のフロントでキャッシュしたり、SQLをちょっと直したり、timelineでやっていたsleepを消したりしたぐらい。ぎりぎりまでバグ対応してたので詳しく見る事が出来てないんだけど、たぶん勝因は
@tagomorisがやっていた画像の圧縮。quality
40%とか本番ではやらないけどファイルサイズ1/3になって処理できるリクエスト3倍とかになったのかなと思いました。
そうそう普段の画像配信のパターンとしては、ストレージ側の容量やIO負荷を押さえるために元画像のサイズはひとつで、リクエストが来たときにリサイズして、その結果をキャッシュして配信するのがよくある戦略だと思うのですが、今回まったく逆ですね。
あと、sleepを消したtimelineのpollingの効率はどなたか調査してくれると嬉しいやも。
あれこれ
- 準備は大切。自分たちのパターンを持つ事は重要
- だからといってそのパターンにこだわりすぎないこと。新規画像を非同期で処理する戦略をとったけど、難しいことに気付いてそれを捨てれたのもよかった
- 困った時はすぐに相談する。目の前にいるんだから話すの大事
- 間抜けなnginxの設定ミスをいっぱいしたので、マスタリングnginxは買おうと思った。internal redirect。まじinternal
redirect。
- Furlで、PUTしたあとのkeepaliveに問題がありそうなので、あとでみる
- もっと性能を出す為に必要なことを考えて、日々の業務に活かすこと。そしてオープンソースに貢献する事
最後に
@fujiwaraさん、@acidlemonさん、@941さんをはじめ運営のみなさまお疲れ様でした。ありがとうございます!
あと、途中で応援に来てくれた奥さんと、息子と娘にも感謝!
ダンボーは頑張って組み立てます
マスタリングnginx、あってよかった
Dimitri Aivaliotis
オライリージャパン
売り上げランキング: 3,552