ISUCON8 オンライン予選に参加してみて、あらためて Web の世界は広すぎると実感した話

ISUCON8 オンライン予選に参加しました。

isucon.net

コードベースさんに場所をおかりしました。いつもありがとうございます!

結果

どこがボトルネックになっているかほとんど気づけず、何もできませんでした。ボトルネックの探し方をもっと勉強したい(rack-lineprof を使って、get_event と get_events のとこの処理が遅いってことはわかったので、そこだけでもどうにかしたいという気持ちでやったけど、結局何も速くできなかった)

やったこと

以前、Okinawa.rb に参加したときに教えていただいた ISUCONのはじめかたを思い出しながら進めました。(今回は、Rails のお勉強を一緒にやってるメンバーで参加したので、 Ruby を使いました)

shimabukuromeg.hatenadiary.jp

ISUCONでやることのざっくりした流れ(ボトルネックを探して改善を繰り返す)

  • sshの設定で公開鍵はgithubにあげとく作戦(サーバーにすぐsshできるように使う)
  • ssh config 設定(セッションが切れないようにするなど)
  • アプリケーションのコードをgithubにアップする
  • githubにあげたコードをローカルに持ってくる
  • ローカルでアプリを動かすようにする
  • ベンチマーク実行する
  • ブラウザから操作してみる
  • ボトルネックを探す
  • ローカルでコード改修する
  • 環境にデプロイ
  • ベンチマーク実行する

環境構築(10:00 - 12:00)

以下、環境の準備でおよそ2時間程度かかってしまいました。ここでは、ISUCONの本筋とは関係ないところ、事前に準備していればスムーズにいけたはずのところでつまずいてしまっていたので反省。(例えば、ローカルのmysql になぜかアクセスできなくなっていたり、サーバーから githubにコードあげるのに戸惑ったりで、全然ダメダメだった。本来なら30分ぐらいでやっておきたいなと思いました)

  • sshの設定で公開鍵はgithubにあげとく作戦(サーバーにすぐsshできるように使う)
  • ssh config 設定(セッションが切れないようにするなど)
  • アプリケーションのコードをgithubにアップする
  • githubにあげたコードをローカルに持ってくる
  • ローカルでアプリを動かすようにする

ベンチマーク実行/ブラウザから操作/どんなアプリなのか触ってみる(12:00-13:00)

ローカル開発環境の準備が整ったので、ようやくベンチマーク実行して、サーバーのリソース状況やログをみたり、ブラウザから操作してみたりの作業を進めました。なるほど チケットを購入するシステムなのかーだったり、h2oというwebサーバーが動いてるっぽいとか、mysql と bundle のCPU高そうとか、そういったことを考えてました。

h2oをnginxに置き換えてみようと試みる(13:00-13:30)

h2oが何者なのかよくわからなかったので、nginx に置き換えようと思ってやってみましたが、ベンチマーク実行した際に、admin.css あたりで401エラーになってるっぽいというバリデーションエラーが発生してしまい、いまいちどう対応すればよいか、わからなかったので、h2oをそのまま使うことにしました。(nginxはyumでインストールして、webppへ振り分けるように修正しただけだったので他に何か足りなかったのか。。。)

ボトルネックを探して改善を繰り返す(13:00-18:00)

このあとは、ボトルネックを探して、コードを書き直したり、構成を見直したりして、ベンチマークを実行する作業をひたすら繰り返して、スコアを上げていく流れになるはずなのですが、全くもってボトルネックの探しかたがよくわからんという状況におちいって、何もできませんでした。

サボさんの書いてくれてる記事をみながら、とりあえず rack-lineprof の使い方はわかったので、ここで処理が遅い部分のコードを修正しよう!というような感じで進めていきました。

saboyutaka.hatenablog.com

このツールを使ってみると、get_events の中で get_event が繰り返し呼ばれてて、その中で以下のSQLが負荷をかけてるっぽいことに気が付いたので、get_event が繰り返し呼ばれなくても処理できるようにするためにはどうすればよいのか???など考えて、色々コードをいじってみたのですが、結局よくわからず、時間切れになってしまいました。

reservation = db.xquery('SELECT * FROM reservations WHERE event_id = ? AND sheet_id = ? AND canceled_at IS NULL GROUP BY event_id, sheet_id HAVING reserved_at = MIN(reserved_at)', event['id'], sheet['id']).first

まとめ・感想

プログラミングの勉強を今年から始めて、800時間ぐらい学習時間積んでるけど、本当に何もわからないなあと感じました。あらためてWebの世界は本当に広い。この人たちと同じ土俵で会話できる日は来るんだろうか、という気持ちになった。

今回、ISUCONに参加してみて、すごく勉強になったし(勉強になるようなきっかけをたくさんいただけた)、もっとWebのことを知りたいと思いました。運営してくれたチームの皆さま、本当にありがとうございました!来年開催されるんだったら絶対にまた出たい!