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

こっち→ https://brookbach.com

ISUCON6本戦に参加してきたよ

10月22日に行われたISUCON6本戦の参加記.

f:id:brookbach:20161031223735j:plain

結果

惨敗

スタートラインに立って,一歩踏み出したぐらいで終わった感じ.

初期実装より低い点,というか最終的にはFailだった.

 

本番の流れ

じっさいどんな感じでやっていったかを書きます.時系列はわりと適当.

10:00~12:00 起動

予選と同様に1クリックでAzureにデプロイ,アプリの起動確認・・・の予定が,起動確認に2時間かかる.

 

レギュレーションに書いてあった,

アプリケーションは各サーバの port 443 を経由してアクセスできます。

を正しく読み取れず,http://[IP]:443でアクセスしようとする→できないを繰り返す.

 

他のチームがデプロイに失敗してたりしたので,再デプロイしてみたりするもできず

 

2時間ぐらいたって,mayokoが「https」でアクセスしたらいけることに気づく

 

12:00~13:00 環境の確認

自分も含めてチームメンバー全員,「docker?聞いたことはあるような...?」「react?知らない子ですね?」という状態だった.

「Docker 入門」「React とは」「React チュートリアル

とかでググりながら何がどうなってるのかを確認する.

 

14:00~15:00 自分:dockerをやめる,他の二人:アプリのコードを見て明らかに悪いところの修正

というわけで実際に環境を見ていろいろ調べるも,どこに設定ファイルがあるかも分からないし,どうやってそれぞれの環境にアクセスするのかもわからずという状態.

 

ググってみたりwebapp/以下を見て,Dockerfileなどに書いてある処理を順に実行していったら環境が作成できそうだったので,思い切ってDockerをやめようと決断し,環境を作成し始める.

また,その間にメンバーにアプリの分析とかを頼む.

 

15:00~16:00 細々と修正

15:00過ぎぐらいにDockerから環境をとりだし終わりアプリの起動に成功する.

そこから自分もアプリを見て,構成とかボトルネックを調べる.

 

しかし,予選と違って明らかなボトルネックとなる場所がRuby側に無く途方に暮れる.

 

絵をリアルタイムで共有するところも,なんかアホなことやってるのは分かるんだけどそれをどう修正したらいいのか分からず,変えるとしたら全体的に変えなきゃいけない雰囲気を感じるも実装するには時間が足りなさそうと思ったり

 

それでもメンバーがちょこちょこ修正してくれたのをマージして少しスコア上がる.

 

この時間がISUCONやってるなーって感じがして,少しだけどスコアも上がって一番楽しかった.

 

細々としたところを修正した後で,アプリはメンバーに任せてサーバーを複数台に分散しようとする.

 

16:00~18:00 複数台構成にする→単機に戻す→Fail

複雑な構成にするスキルも時間も無かったので,少し考えてDB1台,Webアプリ3台,nginx1台の構成にしようと決める.

 

DBのリモートアクセスとかを手探りで設定したり,他のサーバーにアプリの実行環境を作成したり.

 

なんとか作成できたので,ベンチを回してみたところ,初期実装よりスコアが下がる.

この時点で17時ぐらい. 

時間も無く,しょうがないので単機にしようと決め,再起動しても動くようにして再起動試験を行うが,アプリが起動しない.

 

systemctlでの自動起動がうまくいってなかったりしたのでinit.d/以下に起動スクリプトおいて無理矢理起動するようにしたら今度は静的ファイルが無かったりしてベンチに落ちて途方に暮れる.

 

結局時間内に問題を解決できずFail.

 

反省

こんな感じで本番は終わった.もうちょい具体的に,いくつか色々考えたこととか反省点とかを箇条書き的に書いていく.

起動確認 

443=https, 冷静に考えてみたらそれはそうって感じだけど本番中はまったく気づかなかった.

懇親会のときにレギュレーションが不親切だったかも,とは言われたがWeb詳しくないとはいっても常識的に考えてそうだよなーと思ったので気づかなかった僕たちがアホだった.

最後の方になって,あと2時間あったらなーと死ぬほど思ったのでここで時間をロスしたのが非常に辛かった.

 

docker分離

Dockerを調べながらそのまま行くべきだったのか,分離して正解だったのかはわからないが,他にも分離しているチームはあったので悪くはなかったはず.

 

他のチームは,MySQLだけ取り出してたりとかしているところもあり,なるほどなーと思った.

 

DockerもReactも全く知らない状態で不完全とはいえアプリを取り出して動かせたところはだれかにほめてほしい

 

複数台構成

やろうとしてた構成は悪くなかったはず.

単機より点数出なかったのは,最適化が全然されてなかったせいで帯域とかがボトルネックになってしまったのかなーと思っている.

ここの分析をするべきだったが,それができなかったのを後悔している.

 

時間も経験も無いなかで一応複数台構成で不完全とはいえ動かせたところはだれかにほめてほしい

 

再起動

Failした直接の原因は,bundle.jsが無かったからだった.

Dockerからアプリを分離した時点で一回再起動してちゃんと動くか確認するべきだった.

 

役割分担

チームのスキル的に,自分がアプリを見つつインフラもやり,二人にはアプリの修正をお願いして,やってもらったのを確認しながらマージしていくって感じだった.

このスタイルで予選はなんとかなったが,本戦はそれじゃどうにもならなかった.

 

自分が諸々修正している間にアプリを見てもらったけど,結果的に他の二人に(たぶん)暇をさせてしまっていた.*1

 

せめて誰かDocker, Reactのどっちか使ったことあればなーとか,せっかく3人チームだったのにうまく動くことができずもったいなかったなーとか色々後悔はあるが,経験,実力的に今回の問題だとこうなるのは必然だったかなーとも思う.

 

その他諸々 

・ローカルの開発環境を作らず,本番をそのままいじっていた

・過去問をもっとやっておくべきだった

・もっとwebapp以下のコードをじっくり考察するべきだった 

・チーム練習ちゃんとやっておくべきだったなー

・発想自体はあってるんだけど実装に結びつかないみたいなのが多々あった

 

まとめ

というわけで,今回のISUCON6本戦は非常に悔しい結果に終わりました.

 

それでも,初参加で予選を突破し,本戦に参加できて,普段なかなかいじれないような構成のアプリをいじれて,非常に勉強になったし楽しかった.

 

来年も,もしあればぜひまた参加して賞金をもらいたいです.*2

 

謝辞

最後になりますが,ISUCON運営企業,スタッフのみなさん,お疲れ様でした&ありがとうございました.とても楽しいイベントでした.

 

それと,急な誘いと無茶ぶりにもかかわらず一緒に参加してくれたmayokoとoshiumiにもめっちゃ感謝です.ありがとうございました.

 

*1:お絵かきアプリだったので,リンゴとかみかんとか書いてた

*2:oshiumiが就職してしまうので新しくチームメンバー探さなきゃ・・・?