10月21日(土)の日程でISUCON7予選に参加しました。

僕はISUCON4、5、6に続いて4回目です(本戦に行けたことはないです。。)。
去年までは当時勤めていた会社の先輩と参加してたんですが、
今年はチーム名「元pyns」として友達のegapoolと一緒に参加しました。
egapoolは初参加です。

事前準備

まずegapoolが初めてということで、ISUCONに関しては先輩の僕が気をつける点などを共有しました。

  • レギュレーションは最初に熟読する
  • 再起動してもちゃんと動くか絶対確認する
  • ソースをgitにしたり、DBのバックアプをとったりして初期状態に戻せるようにする

あとはisucon6予選の過去問をやりながら、

  • web、app、dbの負荷を見てボトルネックを探す
  • slow_queryを見る
  • access_logの解析
  • applicationのprofiling

などの基本的な部分を予習しました。
ここまででも充分勉強になりました。

当日

当日は京都四条烏丸のコワーキングスペースで作業することにしました。
10時開始ということで、9時頃に近くのマクドで集合。
朝マックを食べながら作戦会議してました。

しかし、開始が遅れるという連絡が来たので、作戦会議もそこそこにビットコインの行方を監視してました。

13時13分開始

ビットコインが70万円を超えたあたりで無事ISUCONが開始しました。
予定通りレギュレーションを熟読し、appをPHPに切り替えてとりあえずベンチを回しました。

初期スコア:5980

簡単なSQLの修正とインデックスを貼る

とりあえずパッと見て分かる select *はやめ、あとimageテーブルのnameカラムにインデックスを貼りました。

スコア:7405

画像はファイルに書き出して参照するようにする。

DBからの画像取得に時間がかかっていたので、ファイルに書き出してnginxで返せるようにしました。
appサーバーが2台あり、ファイルを共有する必要があったので画像ファイルはDBサーバーに置くようにしました。

スコア:11694

messageテーブルにインデックス

画像取得問題は解決でき、slow_queryの内容が変わりました。
messageの取得が遅かったので、channel_idにもインデックスを貼りました。

スコア:25971

ここまでで半分くらい時間経ってたかな。

あとはN+1問題を解決したりしました。

エラーが発生したため負荷レベルを上げられませんでした。icons。

残り半分はずっとiconsと闘ってました。
iconsはキャッシュで返すようにしているつもりがログを見ると200で返してる。。
304周りの知識が全然なくてもうダメでした。

ラスト1時間

使わせていただいてコワーキングスペースが20時までだったので、ラスト1時間は
朝に行ったマクドに戻って最終作業しました。
と言っても何もできず、せめてスコアは残そうと再起動後の動作を確認し、最後のベンチを回しました。

最終的にはスコアは58705
BESTは76025でした。

感想

今年はサーバーサイドのチューニングが主でしたね。
僕もegapoolもプログラマーで得意分野はアプリ側なのですが、そこがボトルネックになるところまでいけず、
ただただ力の無さを痛感しました。

終了後、discordで参加者の発言を観ながら居酒屋で反省会。
If-None-Match、If-Modified-Since、eTagなどが全然分かってなかったのと、
知識があったとしたら何を監視ししたらそこに気づけたかを振り返りました。

その内容はegapoolがまとめてくれます。

運営のみなさんもありがとうございました!

One thought on “ISUCON7に参加して予選突破しませんでした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です