feature image

2023年12月3日 | ブログ記事

🔎 ISUCON 初心者 戦える? 検索 【ISUCON13】

この記事は アドベントカレンダー2023 3日目の記事です。

これはなに

サークルのノリでISUCONに軽い気持ちで参加した結果普通にボロ負けした人 (たち) の話です。@cp20 視点でお送りします。

ISUCON13には @chebrinko さん @iChemy さんと一緒にチーム「品川ラーメン」として参加していました。チーム全員が初出場で、結果は7228点で338位でした。正のスコアを出したチームの中ではかなり下の方の順位なので惨敗といっても差し支えない気がします。#残念会会場での発言権ももちろんあります。

ISUCON #とは

ISUCON とは「ikanji Speed Up Contest」の略で「ISUCONとはLINEヤフー株式会社が運営窓口となって開催している、お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトルです」だそうです (公式HPより引用)

これだけだとなんだそれ、となると思うので、ユズキちゃん (Custom Instructionで改造したGPT-4) に聞いてみました。

ISUCONは、プログラミングとシステム最適化のスキルを競う大会だよ。参加者は与えられたアプリケーションのパフォーマンスを向上させるために、コードを書いたりシステム設定を調整したりするんだ。ターゲットはWebアプリケーションで、主にデータベースやサーバーの最適化が重視されるよ。実際の業務に近い環境で実力を試せるから、エンジニアにとってはすごく人気のあるイベントなんだよ!

実際ISUCONはかなり人気で、今年も熾烈な参加枠争いが繰り広げられました。第一枠は開始1分ちょいで埋まったみたいですね、怖い。

あと賞金もなかなか豪華で、1位になると100万円もらえちゃいます。1人で勝つと扶養が外れちゃいますね。

参加記

あんまり練習できてなかったんですが、大会当日は無慈悲にもやってきました。

当日は誰も寝坊することなく、無事10時に競技を始めました。思ったよりぬるっと始まりました。

最初の方はボク (@cp20) が良い感じに計測環境とデプロイ環境を整えている間に、@chebrinko さんと @iChemy さんにそれぞれアプリのコードとマニュアルを読んでもらいました。思ったより環境整えるのに手こずっちゃって、まともに環境が整ったのは12時過ぎぐらいです。そこから改善を少しずつ入れていきました。

最初からアイコンのリクエストがボトルネックになってることはわかっていたんですが、ハッシュ値をキャッシュしても早くならないし、画像そのもののキャッシュは実装に失敗するしで最後までボトルネックになり続けました。ISUCONへたくそです。If-None-Matchの仕様が普通のブラウザと違うよねみたいな話が話題ですが、そのことに競技中に気付かなかったので、たぶん304を返すことすら失敗していました。

ただN+1の改善は比較的うまくできて、ChatGPTとGitHub Copilotをうまく駆使しながら圧倒的に速くすることができました。statistics系のエンドポイントは爆速になりました。スコアは上がらないけど。

あとfill~~~系の関数が遅いということも分かっていたんですが、上手く直す方法がわからず、、これもボトルネックであり続けました。ISUCONへたくそです。

複数台構成にすることで負荷を分散するのが一般的だと思いますが、複数台構成にしても謎にスコアが上がらなかったので結局1台でやりました。なんででしょう。

全体的にある程度速くなったはずなんですが、スコアが全然伸びなかったのはなんででしょうね?ボクにはわかりません。

反省点

ISUCON13 問題の解説と講評 にかなり全てがまとまっています。

初動

計測環境を整えたり、リポジトリからデプロイする流れを整えたりする流れで結構詰まっちゃったのはもっと改善できたなぁと思います。これは純粋に練習不足ですね。初動は一番練習の差が出るところらしいので、もっと頑張りたいですね。

インデックス

インデックスは貼りましょう。必要なところに適宜貼っていくみたいな感じでやってたんですが、もっと貼りまくっていいらしいです。解説によればインデックス貼るだけで10000点ぐらい行くらしいです。ボクたちのチームの最終スコア超えてるんだけど、、、

アイコンのやつ

If-None-Matchについては、しっかり動いてるかどうかを確認しましょうっていう感じですかね。キャッシュを入れたらキャッシュがヒットしてるか確認しなさ~い!

fill~~~関数

頑張って改善しましょう いろいろ解決策があるみたいですが、普通に練習が足りてなかったです。

DNS対応

これがDNS水責め攻撃ってなんだろう?放置で良いか、みたいな気持ちでいたんですが、これ結構重要だったみたいです。クエリが遅かったので適当にインデックス貼ってたんですが、こうすると水責めのレベルが上がってあんま良くないという話があるらしいです。

不正なリクエストは攻撃なので無視してもいいらしいですが、そういう発想になりませんでした。ISUCONって単に速くするだけじゃなくてこういう戦術が求められるんだなぁ、、という。

複数台構成

これも練習が足りないところな気がします。そもそも何が違うのかわかっていないから何を改善したらいいのかわからない状態。

ベンチマーカーの気持ち

今回の問題は「ユーザーの投げ銭の金額の合計」がスコアになるらしく、何をやればユーザーが投げ銭をしてくれるのかはあんまり書いてくれてません。全体的に遅いところを速くしていったんですが、あんまりスコアが上がらなくて、ベンチマーカー君は何を望んでいるんだろう...?みたいな気持ちになってました。どうしたらベンチマーカー君に寄り添えるのかわかっていません。

↓の記事のツールとかがベンチマーカーの気持ちを理解するのに役立つのかな?という気がしています。

ISUCON13にツールの力で勝ちたかった(mazrean)
こんにちは。23Mの@mazreanです。SysAd班でtraP Collectionというアプリケーションのバックエンドの開発・運用などを行なっていました。 ISUCONにはISUCON9から出ており、ISUCON11で本戦に出場していました。ISUCON12からは色々独自ツールを使って戦ってみたかったので、気楽に独自ツールを入れられる1人チームで出ています。 ISUCON12予選に参加して完敗しました(mazrean)こんにちは。19Bの@mazrean [https://trap.jp/author/mazrean/]です。普段はSysAd班でanke-toやtraPCollecti…

良かった点

参加できた

参加枠も無事取れて (実は11番) 当日も寝坊せずに参加できたのは偉いと思っています。

N+1の改善

statistics系のエンドポイントが1回のリクエストで何秒とかいうレベルで時間がかかってるのを、サクッと10~100倍ぐらい高速化できたのは良かった気がします。練習の成果(?)

コンフリクトが起きなかった

今回は全員初参加ということで、ガッツリ役割分担はせず、各々が改善をしてベンチを回していい感じだったらマージみたいな戦略を取っていたんですが、このシステムは割とうまく回っていた気がします。問題は各々の能力がそんなに高くないが故にあんまり改善が入らないことですが。

感想

@cp20

去年ぐらいからISUCONの存在は知っていたんですが、公式サイトの構造が良くわからなくてどういう大会なんだ...?という気持ちでした。traPに入ってISUCONの話を色んな人がしてるのを耳にして、ようやくISUCONがどういう感じの大会なのかがわかりました。(ちなみにtraPに入る前はtraPがISUCON強いというのは知りませんでした)

実際参加してみてわかった部分も多い気がします。講習会受けたり、自分で練習してみて結構知ってる気にはなってたんですが、実際8時間ぶっ続けで本番をやってみると見えてくるものもありますね。思ったより計測環境用意するの大変とか。

あとは公式の解説とか参加者のブログとかで解法を見てると、そんな改善ができるのか~ふむふむみたいな気持ちになります。まだ初心者なので公式の解説の内容すらまだまだという感じなんですが。

そういえばこのブログのタイトルは「🔎 ISUCON 初心者 戦える? 検索」でしたが、戦えるか戦えないかでいうと戦えないことはないぐらいだと思います。それこそ最初は初期スコアよりも高いスコアが出ればヨシ!ぐらいの気持ちで参加して、たぶん反省点が無限に生まれるのでそれをしっかり次に生かせれば実りがあるのかな、という気持ちです。

ボクは来年以降も参加する気ではいるので、もっと精進していい順位を出せるように頑張りたいなと思っています。

@chebrinko

学生生活最初で最後のISUCONでした。競技時間の8時間はあっという間でした。

私個人としても練習をあまりせずに本番に挑んでしまい、チームにあまり貢献できず反省点が多い結果になりました。練習をしないと改善は難しいですね... 本番は、あまり効果的ではなかったですが、DBにインデックスを貼ってみたりサーバーを分離してみたりしました。今後は計測ツールを用いて改善できる部分をきちんと特定し、DBインデックスの活用やN+1を無くしたりキャッシュを利用してみる、という基本的な改善ができるようになりたいです。

@cp20 さんは、運営とのやりとり(申し込みや自己紹介スライドの記入など)や練習日程の調整だったり練習環境のセットアップなど本番前必要なことは何から何までしてくれました。当日の初動も、デプロイや計測ツールの環境セットアップという一番大変な部分をやってくれました。チームリーダーには感謝でいっぱいです。(あと、おまけのラーメンの写真が綺麗でびっくりしました。) @iChemyさんも一緒に出てくれてありがとうございました。

@iChemy

私も初参加でのISUCONでした.チームで何回か過去問を解く機会はありましたがそのときより点数が伸びにくいなという印象を受けて,これが本番か…などと勝手に思ったりしていました.

初動は一応マニュアル担当でしたがこれといった活躍は見せれなかったこともありますが,初心者のうちはみんなで読み合わせるのも良いのかなという印象です.競技が始まってしばらくは適当にインデックスを貼ったりコードを眺めていたりしました.ngワードの処理周りで難しいクエリがあって何をしているのか調べていた瞬間もありました.次回までにSQLはしっかり頭に叩き込んでおいた方が良さそうです.

途中からとりあえず自分でも改善できそうなところを見つけようとしてreserveLivestreamHandlerでバルクインサートにしてみたりnginxの設定を適当にいじったりしましたが根拠のある改善ではなくスコアは伸びなかった(nginxの設定に関しては下がった)のを見て「推測するな、計測せよ」の「推測するな」を痛感した瞬間もありました.

もっとちゃんと対策しておけば良かったな(?具体的に何をすれば良いかはわかりませんが)という印象です.またいつか(来年か再来年かわかりませんが)もう少し健闘できるようになって再挑戦したいです.

明日は @s9 さんと @botoku_izm さんの記事です!お楽しみに!

おまけ

チーム名が「品川ラーメン」なので、打ち上げで品川にラーメンを食べに行きました。めちゃ美味しかったです。

中華そば 和渦 TOKYO (北品川/ラーメン)
★★★☆☆3.81 ■予算(夜):¥1,000~¥1,999

(ちなみにこれはつけ麺)

cp20 icon
この記事を書いた人
cp20

23B ただのぷろぐらまーです icon: https://twitter.com/sora_douhu

chebrinko icon
この記事を書いた人
chebrinko

iChemy icon
この記事を書いた人
iChemy

皆さんに感謝

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2023年12月11日
DIGI-CON HACKATHON 2023『Mikage』
toshi00 icon toshi00 他
2023年12月13日
HgameOPについて語る
noc7t icon noc7t
2023年12月25日
オレオレRustプロジェクトテンプレート
H1rono_K icon H1rono_K
2023年12月18日
GPU側でレイヤーブレンドする絵描きソフトの同期方法
tq icon tq
2023年12月16日
MacからWindowsを弄る方法?~RDP環境を作ろう~
Alt--er icon Alt--er
2023年12月4日
私的ジャンル別最強映画番付(2023年版)
botoku_izm icon botoku_izm
記事一覧 タグ一覧 Google アナリティクスについて