ISUCON10に参加しました 〜ありがとう学生枠〜
チーム「いすこんがさき、しゅうろんはあと 」で @k5342, @Pelkiraと参加して学生枠4で予選を通過しました.スコアはhighestで1359
, latestが1301
でした.
頼むからチーム三人の指導教員はこのチーム名に目をつぶってくれ. 修論が先,えぇ研究が先ですよね分かっておりますよ( ).何なら「修論は後」じゃなくて「修論はあと(ハート)」.修論大好き.
本番まで
全然時間が取れなくて2回しか練習できませんでした.1回目は試してみたいツールの確認や初動の確認を,ISUCON9-qualの講評を追いながらやってみました.
2回目は ISUCON8-qualを実践的にやってみて練習しました.
練習はDiscordでやったのですが,ずっとVCをつないで画面共有をしていると思いの外なんとかなるなぁという結論に至りました.とはいえ,
- ISUCONのあのわちゃわちゃした感じはオフラインでしか体現できない(し,私はそれが好きだ)
- 発言したときの表情とかが見えない故,緊迫した空気だと認識の齟齬が発生しそう
だなぁと思って,雨が降ってなかったら感染対策を十分にした上で家に集まるということにしました.(雨に濡れないのは,オフラインで集まる価値より大きい)
当日
雨が降っていなかったので集まりました.ありがとう雲.
自分のタスクは割と鮮明に覚えているのですが,人が何やっていたかの詳細は把握していないです(信頼しているので).なので,チームメンバがやったことの詳細のログが少ない...
レポジトリ
issueタイトルの癖が強い
序盤 (12:20 - 15:00)
\ 502 BadGateway /
.運営さんがリアルISUCONをしていた.負けないで.頑張ってくれ.そりゃ500チームも一気にリクエストきたらportalも落ちるわ.- 準備していたconfigをスルスルっと書き変えてとりあえずインスタンスに入れた.VSCodeからも入れてハッピー.
- git化してGitHubに上げたり(k5),必要なツールを入れたり(chigi),レギュレーションを細部まで読んでアプリケーションの概要把握をしたり(Pelkira)をした
- benchが30分くらい回せなくて初回のpprofとかkataribeとかができなかったので,なぞって検索すげーって遊んでた (chigi)
- benchがやっと回せるようになって初回は
450
前後.結構スコアが揺れる. searchEstates
とsearchEstateNazotte
がしんどそうということがpprofからわかったのでそこを見る (chigi)- 両者INDEXが全然なかったので適当にWHEREに入っているものとか,order byしているやつにINDEXをふったりした.
searchEstatesNazotte
N+1
がおるなぁとなった.- それ以前にループが無駄に回っていたので,適当に修正した.
- 凸包がSQLにあるのしらんくてわろてた.ここ再実装してもいいけどまあ後回しでいいかとなった.
searchEstates
- これは変なコードはあんまりなかったけどfeaturesが正規化されていなくてデータが入っているカラムに対して
LIKE
が走っていてヤバそうってなった. - とはいえslow-queryには出てこないので,放置した.
- むしろJSONのencodeとかに時間がかかっていて ?? という気持ちになった
- これは変なコードはあんまりなかったけどfeaturesが正規化されていなくてデータが入っているカラムに対して
- この辺をやってスコアは
580
-600
位 だった
- 並行してk5さんが
503
返していいUAはそもそもどれくらいアクセスが来ているのかを調べていました- サブタスクとしてkataribeをaggregationしたりしていた気がする
- 数が少ないならやる意味はないので.
中盤 (15:00 - 18:00)
- slow-queryを見ると異常に
OR
するやつ遅いなってなってたので,これサクッと直せそうだしといって直したら壊れた.(chigi)- その後も無駄にここに時間を溶かした上に,本番に入らなかったので反省
- よくよく考えると縦・横・奥行きのうち短い2つだけで判定すればよかったので,悪手だったなぁと反省
- chairsのtableに対するクエリが遅いので,INDEXを張ったりした. (chigi)
- slow-queryが吠えているけどpprofではあんまり出てきてないやつらどうしようかなぁと実装みてたけど,結局手つかず (chigi)
- nginxで特定UAからのリクエストをすべて
503
返すのが出来上がっていた . - この辺を入れてスコアは
850
-900
位
終盤 (18:00 - 20:30)
- 外が暗くなっていて電気をつけたら明るくなった.文明開化.
- dbのcpu負荷がまあまぁあったので,別インスタンス(instance2)に切り出し (chigi)
- 練習してたのに,そこそこ手間取ったので反省
bind-address = 127.0.0.1
をコメントアウトし忘れるのをやりすぎ.- my.cnfを調整したけど効いたかは不明
- cpu負荷が大体ずっと100%で高いなぁとなった(がそれに対する手法が浮かばなかった)
- cnfを真面目にいじって改善しても良かったんだけど,それを吟味する余裕がなかった.
searchEstatesNazotte
のn+1
をk5さんが直してた.- ほとんどバグることなくいけてた.
- pprofを見るとやっぱりJSONのencodeがつらそうだったので,アプリケーションの一部を別インスタンス(instance3)を見に行くようにする (chigi, k5)
- instance3のセットアップ(コードを持ってきたり,dbはinstance2を見に行くようにしたり) (chigi)
- nginxでいくつかのパスをinstance3に流すようにしていた.
- この辺
N+1
を直すのとDBの切り出しがほぼ同時にmasterに入ってスコアが1200
位,アプリケーションの一部を切り出して1350
位
最終盤 (20:30 - 21:00)
- いらないサービスを
disable
して回る. - ログを切って回る.
- 再起動試験をして,動くことを確認する.
- 最後は何回かenqueueして
1300
を超えたところで止める.
最終構成
instance1
: nginx(ここで最初のリクエストを受ける) + application リクエストを捌く君instance2
: dbinstance3
: application (/api/estate/nazotte
,/api/estate/low_priced
,/api/chair/low_priced
,/api/estate/search
)を捌く君
スコア遷移
使った言語・ツール
- Golang
- pprof
- コードに適当に埋め込むだけでいい感じにアプリケーションレベルの辛いところが可視化される.
- frameで見るとすごくいい感じに分かる.
- kataribe
- nginxのログを整形して見やすくする.
- querydigest
- slow-queryをいい感じに可視化する.
- newrelic
- せっかくもらったのに使う練習できなくて使わなかった.許してください.
- VSCode Remote
- Sequel pro
- GUIでポチポチしたらいい感じになって好き.
GRANT
とか雑に変更できて好き.
- GUIでポチポチしたらいい感じになって好き.
所感
- 学生枠があったおかげでスコア的にはそこまで良くないが本選にいけます.嬉しい.
- 職人の勘ではなく計測の結果ベースで改善→再計測のサイクルで動くようにできてよかった.
- 昔であれば初手で気になってしまってfeaturesの正規形壊れているやつを直しに行ったり,凸包の部分を実装しに行ったりしてたので(多分)
- 壊れたらすぐrevertして,fail状態を長くしないをできた.
情報共有が下手くそだった.え,そこにN+1あったの知ってたよみたいなやつの情報共有漏れとか,
estate
とchair
のテーブルjoinしてないからテーブルでインスタンスを分けられそうだったよ情報が,競技終了後に知ってあぁ〜となった.課題を洗い出して本選は頑張りたいです.これまで参加した本選は,全く歯が立たずに惨敗しているので流石に3回目の本選は爪痕を残したい.
個人的なやつ
- k5さんとPelkira大先生がだいたいいい感じにやってくれたので椅子を温める・バグを埋め込むなどの作業に徹することができた.
- プログラミングが下手くそなのでプログラミングを勉強しておきたい.
- 学生最後(予定)("""修論""")なので,勝ちに行くは意識しつつも楽しくやりたい.