こんにちわ、エンジニアのタテノです。
8/21 に ISUCON11予選 が開催され、ミラティブから私とかずたかさん、stakmeさんの3人でチームミラティブとして参加しました。
3人ともISUCON参加ははじめてで、各々事前準備しつつ、当日、一時30位くらいまでスコアが伸びる場面もあるなど健闘しましたが、残念ながら予選敗退しました。 ミラティブからは、牧野さんが別チームで参加しており、見事10位で予選通過しました!おめでとうございます!
本記事では、チームミラティブでのISUCON予選を振り返っていきます。
参加表明
5/28 にISUCON11 の予選受付日程がアナウンスされ、牧野さんからエンジニアチームに対して、ミラティブチームでも出ませんかとお声がけがあります。
私は、これまでちょくちょくISUCONの話を聞いていたものの参加したことはなく気になっていました。 牧野さんは本戦出場経験もあり、後にコンテスト中にどんなことをやるといいのかをシェアしてくれるのですが、やはり経験者が近くにいて話が聞けて心強かったですし、いい機会だなと思えたので参加することにしました。
ISUCONはメンバー3人までのチーム制です。かずたかさんは、もともとISUCONに参加してみたいと思っていたとのことで、お誘いしました。 stakmeさんは、普段一緒に業務をすることも多いのですが、陽気で冗談が好きな人で、きっと一緒に楽しくがんばってくれそうだと思って、お誘いしたところ、快く引き受けてくれました。
予選受付
6/28 予選受付。昨年は当日に参加枠が埋まったとのことでみんなで予約開始を待機。当日16:00開始に変更になりつつ、無事登録done。開始2時間で600チームの枠が埋まります。来年もきっとすぐ埋まりそうなので、参加する場合はすぐ登録したほうがよさそうです。
ISUCON11 参加上限の600チームに達しましたので、申し込みを締め切りました!新規チーム作成は停止しますが、辞退やチーム編集は継続して可能です。チーム登録の重複などもありそうなので、ある程度の期間をあけて後日あらためて追加募集をかける予定です。 #isucon https://t.co/fxF1GAN7n3
— ISUCON公式 (@isucon_official) 2021年6月28日
予選まで
各自ISUCON対策をやります。カッコの名前は記載者。
- 入門書や過去のISUCONに関する投稿を見て、ざっくりの感触を掴む(タテノ)
- 過去問をやる。ISUCON10 のログ出力とサマリ出力、見方を確認。負荷分布を見て、mysql, go を修正してみる、あたりまでやってみた。正味 10時間くらい。(タテノ)
- AWS予選環境作成など(タテノ)
- とりあえず当日にisuconできる状態まで持っていくことを念頭に準備(かずたか)
- AWSを使って過去問の環境構築(かずたか)
- alp, pt-query-digestのインストール手順・ログ周りをDocsにまとめる(かずたか)
- deployスクリプトの準備・過去環境で調整(かずたか)
- 2週間くらい前に去年の過去問を見る(stakme)
- あんまり深く考えず寝る(stakme)
日々の業務の結果として成績が上がる面はあるものの、コンテスト特有の要素もあるわけで、そのための準備に十分な時間を充てるのはなかなか難しかったですね。
当日
9:30 くらいに集合し、みんなでオンライン予選ライブ中継をみながら軽く流れを確認するなどウォームアップします。
10:00 予選開始。最初のbenchmark のスコアが3000点くらい。もろもろ準備するなか、早いチームはどんどんスコアを伸ばしていきます。 私達のチームも12:30くらいにクエリ改善したあたりで2万点台のスコアがでて、順位も30位くらいになります。このときはみんなとてもテンションがあがりました。楽しい!
ただ、その後はうまくスコアを伸ばすことができず、最終的にスコア35578 で順位でいうと100位くらい。また動作確認のためにAWSのセキュリティポリシーを変更していたのですが、それがレギュレーション違反。いろいろ振り返ることの多い予選参加となりました。
以下、振り返りです。カッコの名前は記載者。
開始時
- マニュアル&レギュレーション内容をみんなで読み込み(タテノ)
- とりあえず何も考えずにbenchmark実行し、初期状態確認(タテノ)
- Deployスクリプトを事前に準備していた。それを使えるようにした(かずたか)
- alp, pt-query-digestのインストール等の手順を事前に準備していた。それに沿って各種ツールの導入をスムーズにできた(かずたか)
- 安心して作業・更新できる基盤を欠いているので、その整備をやった(stakme)
- 主要なファイルをrsyncで引っこ抜き、手元でgitにぶちこみ、作業後GitHub経由で送りつけてsshでスクリプト叩くだけ。そこは変に凝らずに整頓できた(stakme)
- alp を使って、呼び出されているエンドポイントの分布を確認、負荷が大きいもののあたりを付ける(タテノ)
- slow-log, pt-query-digest を使って、クエリの負荷状況を確認(タテノ)
スピードアップポイント所感
- isu テーブルと isu_conditionテーブル周りで負荷大きいところを潰していく(かずたか)
- isu.imageをなるべく見ない (アスタリスクでSELECTしない)(かずたか)
- n+1 insertやめる(かずたか)
- 謎のトランザクションをやめ、Begin/Commit消せるだけ消す(かずたか)
- isu.imageをDBではなくWebサーバーに置きたかったが、そう思ったときには時間的に手が出せなかった(早くやればよかった) (かずたか)
- 不要なレコードをSELECTしている処理あるな〜と思ったが、そう思ったときには… (かずたか)
- slow query見るだけでシュッと直せそうなクエリは1本しかなさそう(その後すぐindex貼って計測した)(stakme)
- 妙にCommit多くね?不要なトランザクションありそう(stakme)
- ログ吐く処理でファイルIO出て重いかもしれない、それは最後に撤去すればよさそう(stakme)
isu.image
でかい、DBから不用意に取り出すとネットワーク食い潰しそう(stakme)- forのなかでクエリを打つn+1結構あるけど、パッと見であきらかに直せるのはbulk insertくらいしかなさそう(stakme)
- システム(あるいはベンチマーク)の要件が妙に細かい(stakme)
- 「最新のisu_condition」を取る処理がリファクタできると改善できるところが多い(stakme)
- WebサーバとDBサーバの振り分け。とりあえずWebサーバとDBサーバは分けた。最終的にinsert量が大きいtableをDBサーバx2で処理するようにした。(タテノ)
困ったこと、改善点
- alp, pt-query-digestを導入したがほとんどみなかった(かずたか)
- どういうサービスかも見ず、コードだけでボトルネックを探そうとした(かずたか)
- チームでの予習ができなかった。当日にgithubにどのファイルを保存するか等の話になってたりしたのは勿体なかった(かずたか)
- クエリについてはslow queryログで計測できるし、CPU/メモリの使用状況も継続的に報告をもらったが、goの具体的なネックを探すツールを準備できなかった(stakme)
- 勘でボトルネックを探していくことになり大変だった(stakme)
- ISUCONDITIONの説明書をじっくり読み込む係がいないため、サービスの解像度が低いままだった(stakme)
- リファクタしたところがバグってしまい、結局入れられなかった(stakme)
- (なぜか自分の手元だけsshセッションが不安定だったり、ログがtailできなかったりして普通に困った)(stakme)
- 誰かの修正を反映している間は環境が専有される。サーバ3台をすべてサービスに使わず1台はトライアンドエラーできる環境として残しておいてもよかった(タテノ)
あれやっとけばよかった的な、トライ
- Go言語のプロファイラとわかり合っておけばよかった(stakme)
- 競技のドキュメントをじっくり読み込む係が必要だ!と叫べばよかった (stakme)
- もろもろのセットアップが完了して最初の修正をいれてbenchmarkを実行できるようになるのに2時間くらいかかったが、それはもっと短くできそう(タテノ)
- ログ集計結果を自動でslackにポストするツールまで準備できていれば、分析結果のシェアがよりスムーズにできた(タテノ)
総括
チームミラティブとしてISUCON11予選に挑み、予選敗退となり残念でしたが、予選当日はみんなであれこれ言いながらプログラムやサーバをいじりたおし、スコアを伸ばしていくのはとても楽しい経験でした。予選を経験したことで、確実にISUCON慣れできましたし、そこで得られたことは日々の業務でも活かせることもたくさんあると感じました。
来年、またリベンジし、本選に出場したいと思います💪
最後に
ミラティブは今年のISUCON11に協賛しており、社内にもISUCON部ができました。
エンジニアを積極採用中なので、ISUCONが好きな方の応募をお待ちしております!