読者です 読者をやめる 読者になる 読者になる

ISUCON5本選で8位と惨敗しました

ISUCON5本選で惨敗しました。去年準優勝で来年優勝するとか息巻いていたのに惨敗です。

catatsuy.hateblo.jp

とりあえずやったことを軽く振り返りたいと思います。すでに isuconで惨敗しました - walf443's blog にも書かれているので自分のやったことにフォーカスして書きます。

今までのISUCONでは自分がインフラよりのことをやっていって、アプリケーションの変更を一部やるという感じだったのですが、ここ数週間業務で自分がGoを書いていたので自分がアプリケーションをやる時間を増やして @walf443 さんににインフラ周りのことをお任せする方針でいくと事前に決めておきました。

ただ最初の作業はいつも通り自分がNginxの設定をしていくことになっていました。しかしいつも使っているNginxの設定がnginx -tしたときにコケる… 結局types_hash_max_size 2048;という設定を追加することで回避できましたが、時間を使ってしまいました。懇親会で聞いたのはNginxのバージョンが古いためにこの問題が発生するらしいです。

また今回の課題はAPIアクセスが必要だったり、不慣れなPostgreSQLが使われていることなどから手元で開発環境を作ることを断念して、3台中1台を開発機にして開発を始めました。しかしホスト間でsshができなかったためにデプロイスクリプトが簡単に書けず、結局手元からスクリプトを叩いてデプロイできるようにするしかありませんでした。この時にファイアーウォール周りを調べたり、nmapを使ってポートスキャンしてポートが見えるかどうかを調べたりしていて、ここでも時間を地味にロスしていきました。/etc/hosts.allowIPアドレスを書けば良かったと懇親会で聞きましたが、正直知らんがなって感じでした。難しい…

またベンチマークを回しているとすぐにファイルディスクリプタがなくなったので、とりあえず増やしたりとかしていました。また当初、開発環境を作れるようにポート番号を引数で渡せるように変更しましたが、その変更でデフォルトのポートを0番にしていたためにデプロイ後にプロセスが起動しなくなったりと色々初動が遅れて翻弄されていました。

そして @edvakf さんがAPIをキャッシュできるようにしていたので、その間にfetchApiで投げているリクエストを最適化できないかどうか自分は考えていました。それでこの関数が呼ばれるたびにhttp.Clientが生成されていたのでグローバル変数でhttpとhttps用で作成しておいて使い回すようにしました。Goのデフォルトだと同一ホストのコネクション数は最大で2に制限されているらしいので数回試してとりあえず6にしておきました。この値は後半で増やしたりとかしています。http.Clientは並列実行しても大丈夫なのでグローバル変数に入れておいても大丈夫です。というのを以下のサイトを参考にして実装してました。

qiita.com

そちらの実装が終わった後にずっとキャッシュできるAPIへのキャッシュは終わっていたので期限付きのキャッシュしかできないAPIへのキャッシュの実装をすることにしました。今回はExpireが必要だったのでpmylund/go-cacheを使って短期間のキャッシュを実装しました。

その後にgetCurrentUserがキャッシュできることに気付いたのですが、実装時間がなかったために一度引いたものをキャッシュする変更を @edvakf さんが行って終わりました。

また今回NICグローバルIPしかついておらず、LANのIPがないことに翻弄されて分散の方法に特別な手法が必要なのではと考えてしまい、リダイレクトのURLで他のサーバーに分散できないか試したところでfailしてしまいました。これで結局複数台を使うことをあきらめて1台だけで終わりました。普通にPostgreSQLを別サーバーに振るとかはできたはずなのですが、どうしてもグローバルIP越しにデータベースへ接続するというのに抵抗があり、踏み切れませんでした。またPostgreSQLに不慣れだったというのもあったのかもしれません。

今回のISUCONで正直キャッシュ以外のことはあまりやれていない(N+1クエリの駆逐とかもありましたが)ですが、本当はキャッシュ以外にもいくつかできることはあったなぁと今更思っています。それと今回の上位3チームすべてが出題経験者であったことを考えると勝つにはISUCON出題経験がないといけないのかなぁと本気で思い始めています。

当日はハロウィンだったので渋谷駅の治安が壊滅していました。来年はハロウィンは避けて欲しいなぁという気持ちでいっぱいです。

予選に引き続き、本選も大変素晴らしい問題でした。実は予選に近い問題が出ると考えて、それを踏まえた対策をしていたのでかなり予想外で戸惑いましたが、裏切ってくるところがISUCONという感じがします。個人的には不完全燃焼でかなりくやしいですが、日々精進して近いうちにISUCONで勝ちたいと思います。運営の皆様本当にありがとうございました。