CubicLouve

Spring_MTの技術ブログ

isucon3本戦に参加して見事に玉砕してきました

また、この季節がやってきました。

本戦は@sonotsがRubyConfに参加しているため、@niku4iと二人での参加になりました。
今回は寝坊せずにちゃんと会場に到着してます!!

お題

お題は"リアルタイム画像コミュニケーションサービス"

お題が発表された瞬間、思わず唸ってしまった。。。
言語はRubyを選択しました。

とりあえず覚えてる限りで書いていきます。(あとで推敲していく予定です)

当日前半戦

  • GitHubの有料に登録
  • 会社のVPNつないでたら、sshが繋がらなくてちょっとハマる
  • ruby環境のセットアップ
    • supervisorの設定やbundle installやらgem install
  • ベンチ一回目 -> 1800位だったかな。結局failせずに通ったのはここまででした。。。
  • サーバー構成の検討

    • 下のような構成にすることにしました
      • CPUを食う画像処理の部分を切り出し
      • 初期画像は予め画像処理しておく -> ここで後々はまる

        アプリ構成の検討

        サーバーNo 役割 詳細
        1 app GETのみ受ける。画像へのアクセスが来た場合、ユーザーの認証をした後に、サーバー2にreproxyするように設定
        2 app POST(画像の作成と保存)と1からreproxyされた画像へのアクセスを受ける。画像ストレージの兼ねる
        3 DB MySQL 5.6を使用
        4 空き 空き(リソースが足りない所に投入しようと思ったが時間がなく結局セットアップもしていない。。。)
        5 リバプロ Nginx。1と2のサーバーへの振り分けと、reproxyをする
  • 上記の方針で、セットアップ開始

    • まずはサーバーのセットアップ
      • DBはrpmからいれて、基本的な設定だけで終了
      • nginxはyumで入るのが1.0だったのでsourceからコンパイルしてインストール
      • あと、iptable止めるとか
  • DBのアクセス先が変わるのでアプリの修正や、データ流し込みなど
  • ココらへんでベンチを一回取ろうとしたら、ベンチマークツールのバグに遭遇
    • すぐに修正してもらいました!

豪華な弁当有難うございました!

当日後半戦

  • reproxyのためのアプリ変更とnginxの変更
    • 画像GET時のreproxyの設定
    • POST時に3種類の画像を作るようにして、reproxyするときに、s、m、lが判別できるように画像のパスを#{image_id}_#{size}.jpgとかにして保存するように変更
    • nginxでreproxyするために、/reproxyのlocationを設定
  • 初期画像の変換
    • s m lのサイズの画像を予め作って2のサーバーに保存
  • この2つでハマって時間が過ぎていく。。。。
  • 17:20くらいにwebがちゃんと見れるようになって投稿も上手く行ったが、ベンチでコケる。。。
    • 画像のサイズチェックで引っかかって、ベンチが走る前に落ちる -> 結局初期画像の変換でロジックが間違ってた
  • 結局、ベンチが通らないままタイムアウト

反省点

  • 試行錯誤の時間取れなかったので、この構成で本当にパフォーマンスが出るかどうか確認できなかった
  • 画像確認ツールとかあったのに使う余裕なかった -> ちゃんと落ち着いて対応しないと。。

エラーが発生時の対応って、日頃の積み重ねがでますね。。。
去年のisuconのブログでも書いたのですが、はじめの一歩の鴨川会長のお言葉が思い出されます。

毎日の積み重ねがキサマらを弱くする!
漫然と日々をすごすなっ
四六時中ボクサーであることを自覚しろ
自分に足りないモノ、
必要なモノを常に考えて行動せよ!!

まだまだ精進が足らないです >_<

最後に

@941@fujiwara、運営スタッフの皆様本当にお疲れ様でした。 サーバーの手配、懇親会の手配をして下さった株式会社データホテル様、また会場を提供してくださったLINE株式会社様、本当に有難うございました。

楽しい時間を過ごすことが出来ました! 本当に有難うございました!!!