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

平常運転

アニソンが好き

過去記事とかは記事一覧で見れます

ISUCON 5の予選に参加して全体5位で通過しました

久しぶりにエンジニアっぽい話題を書きます。


Iikanjini Speed Up Contestの略であるところのISUCON 5に参加しました。isucon.net

このエントリを書いてる時点では予選が終わったところですが、僕とid:ntakanashiid:y_uuki(敬称略)の3人のチーム"はむちゃん"で出場して、263チーム中5位の成績で本選に進めることになりました。isucon.net

はむちゃんのメンバーのうち、id:ntakanashiと僕が普段仕事ではperlのwebアプリケーションのコードを書いていて、id:y_uukiがいわゆるインフラ周りをやっているので、今回もそういう感じで挑みました。
全体を俯瞰しての振り返りみたいなのは書くと壮大になって終わらなさそうなので、自分のやった範囲について書きます。

作戦

言語はperlです。まぁ普段からperl書いてるので……

当初は各個人が1インスタンスずつ作業インスタンスを立てて試した上でよさそうなのをmasterインスタンスにどんどん投入していこうとしていたのですが、今回のベンチマーカはリモートからリクエストが来る都合上この作戦を諦めて、メインインスタンスにどんどん突っ込んで試していく感じでした。3人の改善ラインが別個に走っていると言うよりは、1本のメインラインに対して分担して3つの観点から変更を加えていくという感じだったんじゃないかと思います。アプリケーションエンジニア2人の分担は事前にはあまり決めていなかったのですが、相談しながら進めていくうちに結果的には

  • id:y_uuki : ミドルウェアより下をお任せ / ログ解析して改善ポイントの洗い出し
  • id:ntakanashi : オンメモリにしたりモジュールを入れ替えたり諸々チューニング
  • id:astj : クソクエリやN+1をちまちま潰していく

といった分担になんとなくなっていたという感じでした。改善ポイントについては、今回MySQLボトルネックやろということでnginxのアクセスログMySQLのslowlogを見ながら大きいところから潰していったという手順で、おおむねうまくハマったのではないのでしょうか。。。また、ログの解析はid:y_uukiが主導的だったとはいえ、3人それぞれが手元でログ眺めたりしていた( = 改善ポイントの洗い出しを投げっぱなしにしなかった)というのはよかったんじゃないかなぁと思っています。
最終的な全体の構成としては、nginx(静的ファイル配信)+perl+MySQL(+セッションだけmemd)という感じなのでそんなに面白ポイントはないと思います。僕がやってたのはだいたい、

  • スッパーンrelationsのone, anotherが交換可能だったのでanotherを始末する(みんなやってそう)
  • /を中心に面白クエリ飛びまくってるので丁寧に直していく
    • インデックス貼ったりcommentsにカラム増やしたり、N+1になってるところを事前に引いておいたり
    • globalに1000件舐めてからrelations見て弾く、みたいな面白実装かわいかった

といった感じです。最後の方でrelationsからX件引いてくる部分と足跡一覧引いてくるところが大きめの改善ポイントとして残ってしまって、足跡一覧のグルーピングをmysqlでやらずにperl側でゴリッとやるように寄せてみたんだけど、これはあまりスコアが上がらなかったのでした……
オンメモリに関しては、最終的にはベンチマーク中を通じて変化することがないレコードを事前にガッとloadしてメモリに載せるという素朴な範囲に止まった感じでした。redisなどに載せる場合に初期データに戻す手段などを相談したけどあまりいい感じにまとまらなかったなどいろいろ原因はあったのですが、その辺は事前にきちんと作戦会議しておいた方がよかった、というのは反省ですね……

感想

ISUCON出場も初めてだしGCE使うのも初めてだったのですが、出場経験のある他2人が勘所を押さえた改善をズバズバ入れていってくれた結果僕はわりと普通のクエリ改善などを進めることができて、2人にお世話になりっぱなしでした。めちゃくちゃ助かった...
個人的にISUCON4の予選問題は予習していたのですが、だいぶ問題の傾向が違ったので結構面食らったという感じはありました。(どちらがやりやすかったかというと今年の問題の方が何したらいいか分かりやすくてよかった。)まあこれに関しては1年分じゃなくてもっと広い範囲の予習をしておけという感じですね。。

今回、弊社の社員エンジニアによるチームが他に2つ日曜日に参加していて、そこに負けたくないという思いで途中スコアに一喜一憂したりもしていたので、無事(日曜日の)社内1位で通過できたという意味でも最高だったと思います。参加チームめちゃめちゃ多くてびびっていたし、お昼過ぎにMySQLの調子が悪くてしばらくスコア計測できなくて焦っていたのですが、MySQLの調子が戻ってきたらあれよあれよとスコア伸ばしていけて、また終盤に大きくスコアが落ちるようなデグレもなかったので、めちゃめちゃ焦ったりすることもなかったのはよかったですね。(その割に結構ギリギリまで実装入れてたけど……)

前日はBang_Dream!のライブを見に行っていたので、これで僕が足を引っ張って本選行けなかったらめちゃめちゃ煽られるなぁと思っていたので一安心した、というのはなくもないです

抱負

本選まで1ヶ月あるのでいろいろ修行してパワーアップして挑もうと思います。弊チームの目標は優勝賞金100万を一晩で使い切ることです。