- 2013/10/7 月曜日 2:41:23
- ISUCON
毎年でているISUCONに今年も山形組として参加しております。
今年からオンライン予選があり、10/5の一日目に参加し結果は現在のところ暫定で3位で予選通過の予定です。
暫定なのは使ったサーバの運営側による検査が残っているためです。
で、今年は何をやったか、というとあいも変わらず去年と同じことをしておりました。去年と同じ方式でかくと
やったこと
アプリ全書き換え
1fileなPSGI
https://gist.github.com/nihen/6852251
feersum(1プロセスマルチスレッド)
データはすべてオンメモリ
スレッド間でシェア
永続化はテキストファイルへjsonで追記
html renderのキャッシュ(といってもmarkdownぐらいか)
リバースプロキシをnginxにして静的ファイルもそこでserve
やれなかったこと
benchmark –workloadの試行
さらなるhtml renderのキャッシュ(メモリストの各liとか)
POST後に与えられている1秒間の猶予の活用
nginx embedded perl
Plack::Handler::Nginx
二年ぶりにnginx,perlそれぞれ現在の最新バージョンでやろうとしたらまったく原因不明のbugった挙動になっており、断念
コンテスト中の流れ
まず始まる前から決めていたのは、外部要件をブラウザで丁寧に確認するということでした。
予定通りこれを時間をかけて行い、その後それに対応したコードの読み込みを行い予め取り決めていた11:30にそれを打ち切って作戦会議。ここまでコードやサーバに変更は一切なし。ベンチマークは初期状態で実行しました。
作戦会議の結果、前回と同じ手法が使えるはずと決まり、実装開始。今回は前回よりアプリケーションとして複雑というのもあり途中少し諦めかけるも、14時ぐらいには完成。意気揚々とtestを実施するもFAIL。まあ一発で成功するとおもってもいなかったので出てきたメッセージを元にひたすらデバッグ。しかしだいたいめぼしいバグとれただろう…という段階になっても原因不明なFAILがまったくとれなくなり、ここでひたすら時間を浪費する。
2013/10/05 16:58:11 [FAIL] Post http://localhost/mypage: EOF 2013/10/05 16:58:11 [FAIL] Post http://localhost/mypage: EOF 2013/10/05 16:58:12 [FAIL] Post http://localhost/memo/41324: use of closed network connection 2013/10/05 16:58:12 [FAIL] Post http://localhost/memo/41326: use of closed network connection 2013/10/05 16:58:12 [FAIL] Post http://localhost/memo/41325: EOF 2013/10/05 16:58:12 [FAIL] Post http://localhost/memo/41328: EOF 2013/10/05 16:58:12 [FAIL] Post http://localhost/memo/41327: EOF 2013/10/05 16:58:21 [FAIL] Get http://localhost/recent/35: EOF 2013/10/05 16:58:41 [FAIL] Get http://localhost/recent/89: EOF 2013/10/05 16:58:45 [FAIL] Get http://localhost/recent/31: EOF 2013/10/05 16:58:46 [FAIL] Get http://localhost/recent/60: EOF 2013/10/05 16:58:56 [FAIL] Get http://localhost/recent/168: use of closed network connection
出てたエラーはこんな感じ。ログに書かれている時間を見ると分かるように、この状態で残り1時間を切るという状態に追い込まれておりました。もうこれはだめかもわからんね、という話をし、ここから1時間王道チューニングで足掻こう…と既存アプリのチューニングを始める。
計測はしていないものの全要件をコーディングしていたおかげでボトルネックはなんとなく把握していたので、ボトルネックの解消自体は順調に進められたのだけれども、いかんせん時間が足りそうになくその頃既に1位は3万点台を計測しており、もうこれはやはりFAILを取ることに全力を傾けたほうが後悔はないだろう、と再度17:30ごろにFAILをとることに舵を切り直す。
で、実はFAILをしていたときはテストがしやすかろう、とFeersum単独で80ポートをlistenしていたのだけれども、Apacheからリバースプロキシというもとの構成にもどしてみる。しかしまだFAIL。ここで静的ファイルをApacheでServeをやっていないことに気づくもAliasの書き方等をぐぐる時間も無かったので、豊富にローカルに設定を持っているnginxに切替え、静的ファイルのserveをしたところ…Success!。急いで本番用のbenchmarkコマンドを実行し、32270点を出したのがたしか17:45ごろ。あとはちょこちょこアプリを修正しつつ終了。正直いまだにFAILの原因は分かっておりませんのでベンチマークツールが公開されたらじっくりしらべてみようと思います。
というわけで長々と書いてしまいましたが、つまりギリギリまでスコア提出をほとんどしていなかったのは高度な情報作戦でもなんでもなく単純にFAILしていたからなのでした。
感想
前回参加からのこの一年の間に、幸運にも負荷を要因としたスケールアウトが必要になるような案件に携わらせていただいており、そういった王道チューニングもいいだろうなぁと思いつつも、いまの自分の実力的にはやはりこの飛び道具を使わざるを得なかったというのが実情ではあります。
今回はKlabさんのチームも似たようなアプローチで2位にはいっており、運営のfujiwaraさんも対策すると言明されているので、本戦でまったく同じアプローチが通じるとは思っていません。本戦まで本業のほうも含め王道チューニング的な経験値、やはり増やして臨みたいところですね。
主催されたfujiwaraさんをはじめKayacの皆様、LINEの皆様、いつもこんなに熱く楽しいイベントを開催していただきありがとうございます。
本戦の出場が正式に決定しましたら、その際はまたどうぞよろしくお願いいたします。
- 新しい: #isucon 負けてきました
- 古い: #ISUCON2 で特別賞を頂いて来ました
コメント:0
トラックバック:0
- この記事のトラックバック URL
- https://blog.everqueue.com/chiba/2013/10/07/617/trackback/
- トラックバックの送信元リスト
- #isucon 3 予選総合3位でした - へぼい日記 より