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

鉄分は大事。(特にヘム鉄)

研究とか開発とかプログラミングとか趣味とかを備忘録的な感じで気が向いたときに.

ISUCON6予選に参加して学生枠7位で通過しました

きっかけ

参加しようと思ったきっかけは8月の終わりに見たpixivの記事

インターンで知り合った仲間と一緒にISUCONを戦ってみませんか? - pixiv inside

インターン生向けのISUCON CM - Qiita

 

 去年, 一昨年ぐらいからこの時期にISUCONやってるのは知ってて, でも自分のスキルじゃなぁとか一緒に参加してくれる人がいないなーとか考えてて面白そうだと思いつつスルーしてた

 

 今年は上の記事を見て, せっかくだから参加しようと思い, 誰か誘ってみることにした.  去年ぐらいからいくつかインターンにいってて, 一番長く(2週間)やったインターンのメンバーが今もtwitterで交流あったので, 思い切って誘ってみた

 

 二人とも, 興味はあるけどwebは全然詳しくないよーとのことだったので, なんとかなるよとか適当なことをいって参加決定した.

 ちなみにみんな学年は同じだが大学はバラバラ, 得意分野もmayokoが競プロでoshiumiがゲームプログラムで自分が広く浅くやってたりでバラバラ

前日まで

 上記の感じから, ミドルウェアとかデータベースまわりは自分がやり, アプリの遅い部分についてみんなで考えながらやっていくのが良いと思った. また, 相談して言語はRubyで行くことにした

 

ので, ちょろちょろと測定の仕方とかを去年の過去問とかブログから情報収集した

 

 学生枠なら, 必要最低限の設定と運営側が用意した一番のボトルネックを改善できれば通過できるんじゃ無いかなーと見積もっていて, これは実際正解だった

 

 1週間前ぐらいからmatsuuさんが作成Azureに過去問をワンクリックでデプロイする神ツールを使って練習してた

github.com

 

 他のチームメンバーはRubyは軽く使ったことあるぐらいだったので, App.rbのコードリーディングを行い, とりあえずどんな感じかわかるようにした.

 

 3日前ぐらいから, 測定ツールの結果から改善するところをみつけて, 解説を見ながらどうすればいいか理解する練習をした.

 

前日はpixivのisuconを立てて練習した.  ボトルネック見つける→どう改善すればいいか考える, っていう流れを練習できたので良かった

本番

 8時半ぐらいにヒカリエに集合して軽く打ち合わせ, 大体の流れとか, インターンの景品もらってない話とか, TGSどうだったかとかそんな話をしてた

 

10時~

Azureにデプロイ, 初期設定を行う

デプロイ後, 初期設定を行い, その間にメンバーにアプリを見ていてもらった

なんか2つあるっぽいけどなにこれ?どこ見れば良いの?みたいな声が飛んでいた

とりあえずベンチを通し, 0点だったけどPASSはしてたのでたぶんどっかが遅すぎて点数とれてないんだろうなと思った

 

その後, 諸々のログ設定を行う.  練習はしといたんだけど, スロークエリログが生成されなかったりstackprofのログが生成されなかったりして詰まってた. 

 

11時~

11:20分頃にnginxのアクセスログとstackprofがとれたのでSlackに流す, ルートページがめちゃ重でやばいと認識, さらにhtmlifyが9割ぐらい時間消費してたのでここやーと見つける

 

その後, コードを一通りながめて何やってるか理解, SELECT * 消しとかクエリ大文字にしたりとかをチームメンバーに頼み, nginxの静的ファイル配信をちゃちゃっと書く. この時点でベンチ回したら正の点が出て一安心した

 

htmlifyどうするよみたいなのを相談し, とりあえず何やってるか理解しようと思いpryを使って一行ずつ追っていった

 

キーワード見つけてハッシュしてリンクに置き換えをやっているので, リンクに置き換えた後のテキストをカラムに保存してしまえばいいのでは, となり実装を開始

 

12時 ~

12:40分頃に, 置換したテキストをカラムに保存する実装が完成, デプロイ

ベンチを回してみたところ, 12000点ぐらい出て暫定五位になった

方針間違って無くて安心, ここでもう終わりで良いよとかみんなでいってた

 

13時~

スロークエリログは結局あきらめてmyprofilerで簡単なログを取ることにした, データベース小さかったので今回はあんまりデータベースメインじゃ無いんだなとか思ってこれ以上ここで頑張るのをやめた

 

キーワードが追加されたときに, 他のエントリの置換されたテキストを更新しなきゃいけないことに気づく

どうするか相談して, 置換されたときのエントリの総数を保存しておくことにする

 

14時~

とりあえず15000点ぐらいで安定したので, タスクを振り分けながら自分は諸々のconfファイルを拾ってきた秘伝のタレで置き換える作業を始める

 

その後ベンチを回してみたところ, ある時点でユニコーンワーカーが落ちてFAILするという現象にぶち当たる.

 

助けてくれーと叫びつつ原因を探り, ユニコーンUnix domain socketで接続しているのが原因と特定, いろいろいじってみても治らなかったのであきらめてホストとポートで接続するように切り戻し

 

16時〜

htmlifyについて, 自分たちの実装だと初期状態で置換されたテキストを生成する必要があったので, /initializeでそれを行う処理を書いたが5秒以内に終わらずあきらめる

 

17時~

再起動テストを行い, 18000点ぐらい出るのを確認して引き上げ作業を行う

 

ログの設定消し忘れてアプリが落ちたりして, 助けてくれーと叫びながら5分前ぐらいになんとか引き上げ終わる

 

置換されたテキストを生成するため, 終了するまでブラウザからページの更新を行う

 

 

反省点

・htmlifyの解決方法についてもっと考えるべきだった, 他のチームはキャッシュを利用したり, そもそもの置換アルゴリズムを変えていたりしていて, 自分たちのチームはその発想は無かった.

 

mysqlの設定がきちんとうまく反映されなかった. 結局あやふやなままスルーした.

 

・confファイルの設定で時間を取られすぎた, 想定では秘伝のタレをコピペして終わりにするつもりだったのでかなり焦った.  ここで時間を取られてhtmlifyに集中できなかったのが悔やまれる.

 

・合わせて, そのせいであまりタスクを抽出できず, 後半に他のメンバーがやることあんまり無い状態になってしまっていた. 

 

良かった点

・自分が詰まっている間に他のメンバーが諸々を改善してくれていた, チームプレイできて良かった

 

・つまったとき, 悩んだときに, ここは諦めようとか, 妥協しようとかの判断ができた.

 

・一応最低限の改善ができて, 予選を通過することができた. 2万点だと学生枠としてはギリギリかなーと思っていて, 結果が出たときは嬉しかった

 

感想

初めてのISUCONで, とても楽しかった. 予選通過できて良かった.

 

参加したいけど一緒に参加してくれる人がいないみたいなつぶやきは結構あって, その中で自分は一緒に参加してくれる人がいて良かった.

(興味はあるけど・・・みたいな人は多いので, 迷ってる人は勇気を出して誘ってみるといいと思う. 基本的に誘うより誘われたい人の方が多いし, スキルが足りなくても協力すればなんとかなると思う)

 

本戦はさらにグレードアップしたアプリに対して闘うことになると思う,

一ヶ月あるので, 今回の反省を活かし, 足りないところは勉強して, 練習して, 本戦ではもっと良い点が取れるようにしたい.  目指せ100万円