ISUCON9に参加しました
こんにちは、Hameeの山本です。
今年もISUCONに参加したので感想をまとめます。
結論から先に言うと今年も本戦にはいけませんでした…orz
チーム全員一次試験の起床には成功し例年通りのスタイルでスタンバイして開始を待ちます。
今年はフリマアプリ「ISUCARI」というどこかで聞いたことのあるようなサービスでした。
レギュレーションとマニュアル
https://gist.github.com/sota1235/a7356a5909af264c1c1c840dd216c98f
以下時系列でざっくりやったことまとめ
前半
開始してAlibaba上にてインスタンスの起動→例年より起動に時間かかったイメージ
起動後sshできることを確認、即ベンチマークを走らせる
初期スコア2110
初期実装はgolangだったのでrubyに切り替えて再度ベンチ
ruby初期スコア2110
インフラ担当がソースをリモートリポジトリに配置するのに手こずる(git pushできないとか嘆いてた)
10:30くらいになってソースがあがってきたのでローカルにソースをpull
中身をざっと確認しローカルでbundle install、pumaを起動
DBがないので当然エラー
DBを作成しアプリからの向き先をローカルにする
sql/init.shにて初期データを構築→しかしinitialize.sqlがないというエラーになる
よく見ると.gitignoreされているsqlファイルがあるのでそれもgitに入れてpull
改めてshを叩いたら無事にローカルに環境が完成
ここまでで11:00
マニュアルを読んだところキャンペーンの実施によりユーザーの人数が変動するとのことで試しに1,2,3と実行
キャンペーン1: 3600
キャンペーン2: 4010
キャンペーン3: 2800
という結果に
ここで暫定1位を取れました(ちなみにこのあたりが既にピークです)
このあとは去年と同様にインフラ担当が計測ツールを導入、計測結果を見つつアプリ担当2人でガリガリ直していく
司令塔がアプリを俯瞰して眺め臭い部分を洗い出し、僕がひたすら修正を加えていくスタイルで行いました
まずDBとソースを照らし合わせwhere条件に指定されているのにindexがない部分に対してindex付与→点数伸びず
次にcategoryはDBに持つ必要もないためソース上に持つように修正→スコア伸びず
categoryをグローバル変数として毎回生成しないようにキャッシュ→スコア伸びず
DBのindexを単体から複合インデックスに変更→スコア伸びず
ここで13:00でお昼、スコアの伸びなさに焦りが
後半
お昼を食べながら相談、まだN+1を直していないためそこを優先で直すことに
目につくN+1を解消→スコア伸びず
ここらへんで点数が鈍化します
ローカル環境にてAPI処理まわりがうまく動かずローカルで検証できない部分が出てしまい開発が滞る…これ早めに解消すればよかったな…
計測結果から/buyのアクションが重く、for updateのトランザクションをどうにかしないとという話に
色々手をうってみるがスコアが伸びなかったりベンチがfailになったりとだいぶ心が折れてました
17:00
購入処理のロジックの特にAPIまわりは同期的にやる必要がないから非同期化をしたいという方針になった
急いでsidekiqとredisを入れて実装していきましたがさすがにこの時間からは間に合わずにタイムアップ
結果
最高スコア4900、最高順位1位、最終スコア3600、最終順位231位というなんとも不甲斐ない結果になりました
仮に最高スコア4900だったとしても160位付近…
反省
今回はリクエスト数によるスコアアップではなくイスの取引額がそのままスコアになる仕様だったため、直接影響がない部分を修正してもスコアに直結しにくい作りになっており、それに気付くのが遅かった
素振りというか力が全然足りずAPI処理の非同期化が行えなかった
17時からでもこれが十分に間に合えばスコアもガッと上がったかもしれない…力が欲しい…
まとめ
めちゃめちゃ楽しかったけどめちゃめちゃ悔しい
去年がそこそこ戦えていたので今年こそは!と意気込んでいた分意気消沈という感じでした
まぁこれも経験・勉強なのでこれをバネに来年頑張りたいと思います
ちなみにHameeからは僕が把握してるだけで3チームの出場があり大いに盛り上がりました
当日は生憎の台風だったので飲みも早々に解散しましたが
全員「悔しい!来年も出る!」と意気込んでいたのでISUCONをススメる会の者としては良かったかなと思いますw
気になった方は是非来年出ましょう!
過去の参戦記録は以下をご参照ください。
この記事が気に入ったらサポートをしてみませんか?