Whimlog

寝るまでが一日

Isucon8 予選に出場した

9/15 に参戦した記録を残しておきます。

今年は道玄坂旅情というチームで @kitak, @konpyu のお二人とチームを組み参加しました。

順位とスコアは 147位 (3,097点) と去年より健闘したものの、10,000 点の壁は超えられずといった結果でフィニッシュです...負けたのは悔しいですが、とても楽しかった、あっという間に 8h 過ぎました!

準備

去年は php で参加したのですが、今年はメンバーも変わり ruby で参加することに。

本番2週間前に集合し、ISUCON7 の問題を解きました。去年、参加した時の知見をベースに戦略を立てました。いかにキャッシュをするかが勝敗を決めそうだということで、「Redis 入れるぞ〜」という流れになりました。

当日の話

当日は、僕がミドルウェア周りの設定を担当し、メンバーにはアプリケーションチューニングに集中してもらうという体制にしました。 初っ端から ssh ディレクトリの権限設定を忘れて公開鍵認証できないとか、nginx の設定忘れて静的コンテンツが配信できないというやらかしがありました。

デプロイスクリプトは別のディレクトリにデプロイして、アプリケーションの symlink を貼るようにしていたのですが、もっと雑な感じで更新してよかったなと思いました。シムリンクが原因でアプリケーションが動かない状態になったので、提供されたディレクトリ構成を保ちつつチューニングしたほうがロスがなさそうです。

予選問題では想定していた nginx ではなく h2o だったのがインパクトありました。h2o を lb としても使いたかったですが、どうやらそういう機能は提供されておりませんでした。(/etc/hosts で dns ラウンドロビンさせるらしい)その結果 nginx に proxy して他のサーバの nginx と webアプリにバランシングする構成になってしまいました。今思えば h2o をサッと捨てればよかったのですが、 前述した nginx の設定忘れによりこの構成で終えました。

アプリケーションのチューニングに関しては、ボトルネックになってる部分は直ぐに特定できたものの、根本的な対処ができませんでした。 キャッシュ戦略も実行していたのですが、完成後にイニシャライズ時にキャッシュしてないからベンチマークでスコアが出ないという、まぁそりゃそうだという問題が起きたため、Redis の出番が完全になくなりました。僕は無駄なクエリ(* でとってるやつ)を調整したり、インデックスを見直したりしていましたが、あまり効果が出ず。こういう細かいところは後々効いてくるのかもしれませんが、最初のボトルネックが解消されないとベンチマークのレベルが上がらないので無意味になってしまったように思います。

最後の1時間前くらいまで 2000 点も超えられずなんでや〜となってたところ puma のスレッドとワーカー増やしたら 3000 越えしてそのままフィニッシュです。

よかったところは、去年より気持ちに余裕がもてたところ、1年かけて視野が広がったところなどがありましたが、結果に結びついてないですね!去年の反省点は克服できたかなと思います。

以下、来年に向けてのメモです。

scrapbox.io

前回の記録は以下になります。

asuforce.hatenablog.com

まとめ

今年は今まで以上の参加チーム数だったのにもかかわらず、素晴らしい問題、素晴らしい時間配分、素晴らしいダッシュボードを提供していただいた運営メンバーには感謝しかありません。とても楽しかったです。

チームメンバーのみなさんもありがとうございました。大変勉強になりました! チーム内でもリベンジするぞという声が上がっており、早く予選を通過したいです。 去年より成長を感じることはたくさんありましたが、それ以上にもっといけるという気持ちがありますので、来年も必ず参加します!