53rd Tsuzuです。
ultra_fast_gopherというチームでISUCON8予選に参加しました。もちろんGoで参加しました。(名前はultra fast parrot というSlackのreactionで見かけるやつから取ってます。)
私以外はMIS.Wじゃないのでここに書いていいのか悩んでいたんですが先輩のお許しを得たのでここにあげます。
前日までの準備
3人のうち私を含めた2人は初参加で、ISUCONに出たいという思いはあったものも何も知らなかったので過去問を解きました。
が、MySQL/nginxのチューニング何もわからん・・・という思いで終わりました。とりあえず本戦出場者のブログを読んで、方針はあってたっぽいなぁー、とかこういうツールがあるのかぁとか思いながら特に初動をどうするかを練りました。その後もSlackで連絡を取りつつ諸々を決めていきました。
予選4日前になってチームメイトから「どこで参加するの?」というメッセージが来て場所が決まっていないことを思い出しました。ひどいですね。結局新宿の貸し会議室(という名のマンションの一室)を借りました。(9時間9000円だったので1人3000円でした。思っていたより安かったです。)
当日(土曜日)
午前(初動)
朝からSlackに「寝坊した」「排水溝詰まった」など不吉なメッセージが飛び交う中、なんとか9:30ごろまでに全員が集合しました。(初めて貸し会議室を借りたためトラブルが怖く私は9時ぐらいに到着したのですが、鍵の開け方がわからなくてかなり最初焦りました。皆さんもお気をつけください。)
細々とした準備をしつつコンテストが始まりました。最初は細々としたセットアップ作業をやりつつ問題を把握する作業をしていました。(なんだかんだ長引いて1時間ぐらいやっていた気がします。具体的にはサーバ名の変更、鍵の登録、Gitリポジトリの登録、ツールのインストールとかです)
問題概要のGistを見てh2oという文字がチラッと見えてまさかな、とか思いましたがh2oでしたね・・・結構想定外でした。nginxに変更するか悩んだのですが今回はネットワーク周りのボトルネックがなさそうだったため変更することはせず、alp で解析するためにログフォーマットをLTSVにするだけに留めました。(ただ、h2oにalpに対応したLTSVを吐かせるためには自分でログフォーマットを書く必要があり、公式ドキュメントを読みつつ書きました)
ベンチを回していると明らかにデータベースがCPUをバカ食いしているのでこれを2番目のサーバに切り出そうということになりました。ですが、単に移動しただけだと/initializeでの初期化が1番目のサーバに対して実行されてしまうため、init.shを書き換えて対象のサーバを変更したりしました。
ここで時間がお昼になったので気分転換でコンビニに昼飯を買い出しに行きました。(ファミマ行くと必ずトルティーヤを買ってしまうんですよね・・・なぜか好きですアレ)
午後
糖分を補給しつつコードを眺めている中でgetEvent/getEventsというのは明らかにやばい、というのがわかり、またSQL文とデータベースを眺める中でsheetsテーブル貴様はなぜいるんだという気持ちになったのでとりあえずgetEventを大きく書き換えることにしました。
具体的にはsheetsテーブルのselectをやめコード内で処理し、reservationテーブルへのselectを1度にしました。バグを取ったりデータベースへのコネクションの本数を調整しながらベンチを投げるとスコアが一気に13000ぐらいになり順位も7位ぐらいになってかなり驚きました。
ただ、何度か投げなおしているとfailすることがわかりバグ修正をしようとしたのですが、探してもバグの原因がわからず、これは排他処理の問題っぽいな・・・とだんだん気付き始めました。ですが、SQLの仕様にイマイチ疎くてどこが問題かわからなかったため一旦諦めました。(今思うとなんでここで諦めたんでしょうね・・・意味わかりませんね)
その後チームメイトが予約を乱択しているコードをchannelを使うように書き直していたもののバグを修正したり、他の場所でのsheetsテーブル依存も減らしたりしていました。(結果としてここら辺はそこまで意味がなかったように思います)
終了直前
ここらへんで大分時間が辛くなってきたため、全部をmergeしたのですがconflictしまくっていてめちゃくちゃ辛かったです・・・。アレは時間がないときにやるとほんと辛いですね。
mergeを終えて投げたらある程度の確率でfailするけど成功すればそれなりのスコアは出るという現象が当然のように残っていたのですが結局原因を突き止めることができず、運よく成功したところで終えて、神頼みをしながらコンテストを終えました。(終了後にも正常に動くかどうかの確認が入るため、もしそこでfailすると失格になります)
翌日(日曜日)
日曜組がISUCONに出ている中GAME3というイベントに参加していたのですが、初日全体3位学生1位を取られたNaruseJunチームのうちの二人とお話することができ、感想戦で盛り上がりました。すごいなぁと思いました。(語彙力皆無)
GAME3の参加記は52ndのべるさんが公開されているのでよろしければご覧ください
普段なかなか話し相手のいない話題をできて非常に満足して帰る途中でISUCONの結果が公開され、我々ultra_fast_gopherは無事ガチャを引き当てて本戦に出場することができたとわかりました
感想
結果論になってしまうのですが、もっと良い動きができたな、と思うところがかなりありました。といっても大部分はgetEventのバグを完全に放棄してしまったことです。このバグを潰せていたら安心して本戦に行けていたのに、と悔しく思います。
ともあれ、なんとか本戦に勝ち進むことができたので作戦を練り直しつつ挑んできたいと思います💪 ここまで読んでくださりありがとうございました。