blog2015-09-28ISUCON5予選に参加しましたまえがき2015/9/26にISUCON5予選に参加しました。この記事は読んで役に立つようなことはない、ただの感想記事です。ISUCON5予選に参加するまでISUCONの存在自体は去年ぐらいから気になっていたのですが、参加したいとかはなくて、「すごい人たちがいるなー」ぐらいに関連記事などを眺めている程度。さんとISUCON出るんだけど、一緒に出ませんか?」的なお誘いをいただいた。Rails」の著者の一人でもあるsugamasaoさんと組んだとして、そこそこいろいろやってるけど、これといって強みもない自分に何ができるんだろう。悩みつつ、この機会を逃したくないという思いでチームにいれてもらった。参加が決まってからはSlackでのやりとりが中心で、チーム名「忠で焼酎を飲んでいた人たち」を決めたり、予選の日程を調整したりしていた気がする。いえば決起会と称して一度飲みに行った。この時点でお二方に会うのはまだ2回目。終盤はなぜかkoemuさんにSHIROBAKO見ろと迫っていたsugamasaoさんの姿を鮮明に覚えている。当日までとりあえず予習しなきゃということで、過去問環境をVagrantで作って、ベンチ流すぐらいまではしたのですが、Vagrantだとスペック的にまともなベンチが走らなそうな気がしたので、そのまましばらく放置してた。そのあとは業務が一気に忙しくなったりで時間が空いてしまい、結局まともに触ったのは予選の一週間前ぐらいで、ISUCON3予選のAMIをm3.xlargeでたててやってみた。無力感を感じた予習だいたい3時間ぐらい時間をとって、アプリには手を出さずにミドルウェア周りだけでいろいろやってみたが結局2452->3348が限界。koemuさんが予習でかなりのスコアを出していたのも知っていたので、自分の結果の出なさ加減にかなり焦った。sugamasaoさんがいるのでRubyだろうということで、言語はRubyを選んだところ、Gemのバージョンがいくつか古かったのが問題だったらしく、初期実装がそのまま動かなくてインターネットの優しい人に助けられた。当日の初期実装がそのまま動かないことはないだろうと思ってたけど、こういったトラブルで時間を持ってかれているうちに作業時間が減るんだろうなと感じつつ、この程度のRuby力でどうするんだ自分。思っていたら、その晩は夢でISUCONにうなされた(夢の内容は覚えてない予選の前々日あたりに、koemuさんがGCPのプロジェクトなどを作ってくれていたので、個人アカウントでGCEのクイックスタートだけやっておいた。初GCEだったので、クイックスタートはやってよかったとは思うけど、gcloudコマンドがわからなすぎた。結局予選でもgcloudコマンドはほとんど使わずsshしていた。開始まで当日は9:30にkoemuさん宅で集まってやることになっていたので、平日よりちょっと早起き。早起き成功したというか、楽しみなのと緊張であまり寝れなかった。早起きしすぎたので、少し早く家をでて移動したら、電車の乗り換えに失敗して遅刻しかけた。乗り換えるつもりの駅を颯爽とスルーしたときの風景は忘れまい。なんだかんだで集合して、さーやるぞーみたいな雰囲気だったところで、運営から初日の予選は予定より遅れて11時開始という連絡が入った。1時間空いてしまったけど、この時点でお二人に会うのはまだ三回目、待ち時間でいろいろ話せたのは、自分にとってアイスブレイクになったので良かった。スピード勝負なので共有重要。upgradeしたら再起動後にディスクがroでマウントされるとか、いろいろ混乱もあった。idobataもほとんど息してなかった。手順に従ってインスタンスを起動して、アプリがブラウザで確認できたのは11:18だった。この時点でkoemuさんはetckeeperやChefの準備をしてたし、sugamasaoさんはアプリケーションコードをGitHubにpushするところまで手際よく済ませてた気がするベンチのキューが詰まっていたので、待ち時間で各自いろいろ調査。自分はDBのテーブル構造とかデータ量あたりを調べていた。最初のスコアは210でFAIL。ベンチマーカーに問題があるという連絡もあったりしたけど、このFAILがベンチマーカーの問題だったのかどうかは不明。そのあとはSlackのログを見るともろもろの秘伝のタレ、nginxアップデート、unicornのプロセス数調整などをしつつ、エラー無しのベンチ結果は766。秘伝のタレってすごいなとつくづく思った。それからはkoemuさんがミドルウェア周り、sugamasaoさんがアプリ周りを見始めたので、自分はログからベンチマーカーがどんなリクエストをどれぐらい投げてるかを見たりしてた。この時点ではあまりアプリケーションに手を入れてなかった気がする。13:16あたりに2188を出して、一時的に累計、最新ともに1位になったのがうれしかった。MySQLTuner,pt-query-digestと、MySQLのパフォーマンススキーマを見つつ、ベンチが流れたらhtopでCPUとメモリの使いっぷりを眺めて対応箇所を決めていった。いえば、うちのチーム内でAppArmorが猛威を振るっていたのはこのあたりのことだったかもしれない。14:30ぐらいにN+1問題が各所にあることにようやく気づく。ISUCONはインフラチューニングコンテストじゃなくて、Webエンジニアの総力戦なんだってことを感じつつ、tagomorisさんいい問題作りますねー。みたいな話をしていた。このあたりからアプリにごりごり手を入れていく。詳細は問題がまだ公開されてないから書かないけど。あるある」みたいなものから、「それはないだろw」みたいなものもあって面白かった。重たい処理やSQLを、実装の変更やインデックスの調整で潰しつつ、とあるタイミングで結果だけ言えば2日通しで見ても予選突破レベルのスコアが急に出て湧いたけど、たぶんこれはベンチマーカーの隙を突いたなにかだよねという話になり、その変更は元に戻した。ある程度、N+1を潰したあたりで頻発するSQLをMemcachedやRedisで捌こうかという話になった。Memcachedは触ったことあるけど業務でほとんど使ったことなかったし、Redisは使ってるけどセッションストレージとしてしか使ってないし、しかもElastiCacheだから設定もよく知らないしで不安は少しあったけど、20-30分やってみてダメそうだったら相談すると宣言してやってみた。Rubyistのsugamasaoさんがいたので、Gemの選択などで迷わなくて済んだし、実装のアドバイスとか、改善のPRとかももらったりしてとても助かったし、なにより勉強になった。1時間弱かかったけど実装できて、その間各自作業をしていたものも含め、18時あたりでスコアは4500前後まで上がった。最後の30分は再起動してテストと決めていたので、18:30まではあまり激しい変更はせず、ちまちまと小さな改修をして、18:30ちょっと過ぎてから再起動テスト。もれず再起動したらうまくいかないところがあって、koemuさん調べつつガーッと直していくのをみて、この人底力あるなーと思った。なんとか再起動問題も解決したけど、確か最後のベンチは流すことができずに時間切れ。「このテンションで8時間も作業するのって年に一度あるかどうかの大障害ぐらいでしょ」とか「やること多すぎてトイレ行くの忘れた」とか話したりしてた。終わってみると、あそこはもっといろいろ改善できたなーとか思ったけど、裏を返せば、参加するのを決めたときは何もできないんじゃないかという不安でいっぱいだったので、何かしらチームの結果に貢献できたような気がしてよかったと思っていた気がする。そのあとは3人で焼肉食って、ビールとか飲んで、いろいろ話をして帰った。おわりに得体の知れないシステムを相手にするというのは、Webの世界で仕事をしていればきっと誰にでもあるし、パフォーマンスの問題を突き止めてインフラとアプリをうまく使って解決するというのも、それなりに真面目(?)にやっているエンジニアにとってはよくあることだと思う。これを8時間という限られた時間で、しかも改善結果をベンチマーカーが数字として明確に出してくるような機会はISUCONぐらいしかないんじゃないかなと思った。個人的にはkoemuさん、sugamasaoさんと一緒に参加できて、お二人のアプローチの仕方を間近で見ながら作業できたのも、エンジニアとして刺激になったし、いい意味での焦りも感じた。お二人にはとても感謝してます。圧倒的なスコアで差を見せつけてくれた本戦出場者のガチンコバトルがとても楽しみ。運営のみなさまありがとうございました。最後に、やたらに楽しげにとれた写真を貼っておこう。環境を構築する3行のコマンド使われていない、を知る月別アーカイブはてなブログをはじめよう!ariarijpさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。