あんパン

こしあん派

ISUCON11予選参加して敗退した

敗退した。一番高いスコアが42296で、その後ずるずる落ちて最終的には33586で終えた。

という話をしてメンバー募集したところ、 id:papixid:stefafafan といっちょやりますかということになり、天下n品というチームでISUCON11に参加した。お二人は同僚かつ友人であり、関係値マックスの状態から走れたと思う。早速来年どうやっていきますかね〜という話もしている。

練習とか

ツイートの通りこれまではお祭り的な気分で参加してたけど、ちゃんと動き方とか考えて改善していけるといいだろうなーということを2,3年前から思っていた。なので、今回はチームを組んでからちまちま練習して初動を決めたりツールの確認とかをしていた。

  • 定時後に過去問の環境を作って初動〜作戦考えるくらいまでをやる
  • 土日のどちらかで集まって8時間かけて完走する
  • ドキュメントを整備する・今後の動き方を考える

みたいなのをそれぞれ何度かやった。まだ粗はあるものの、初動はかなりうまく動けていたと思う。ドキュメントはScrapboxに残してて、GitHubのIssueとかは使わなかった。repoは練習ごとに作りたいので、チーム固定するならScrapboxに残す方が一覧性が高いと思う。

過去問の環境整備するのはTerraformの定義用意してくれてるrepoがあり、これを使った。

数分で環境が出来上がるのでたいへんありがたく使わせてもらった。本番もAWSだったので、AWSコンソール触る練習にもなったと思う。まあ業務で毎日のように使ってるのでAWSコンソール使ってて新たな発見があったかというとそうでもなかったけど、、

使ったツールとか

言語的には全員Perlの習熟度が一番高いのだけど、APMを使いたくなったときに他の言語の方がライブラリが充実してて都合がよかろうし、Goでいきますかね〜ということでGoにした。いま考えるとPerlでも良かった気もする。というのも、最終的に両方とも使わなかったため。Goでmake通ってればまあいけるやろという気持ちになれた点は良かった。

最初はNew Relicを使ってみようということで入れる練習をしていたのだけど、Goの習熟度がそこまで高くなくどんなフレームワークがやってくるか分からない(echo以外が来たら太刀打ちできなそう)、Segmentとか切れるのは便利そうだけどあんまり時間がないISUCONでそこまで見られるかというとそうでもなさそうということで、本番3日前くらいに相談してalpとpt-query-digestだけで挑むことにした。なので、あまり凝った解析はしていない。せいぜいログ取りを自動化してホスト名、時刻、ブランチ名、コミットハッシュが分かるファイル名にするくらい。

あとは生成したらS3に置いて、Lambda@EdgeでBASIC認証をかけたCloudFrontを通して確認できるようにした。S3にログを送りつけるとLambdaでSlackに通知が飛ぶ。

f:id:masawada:20210822183516p:plain

作るのはCDKでやっていて、repoは以下に置いた。

デプロイスクリプトもある程度自動化していまいるブランチをデプロイしたり、mainブランチが更新されてたらデプロイ前に落ちるようにしたりくらいはしていた。

他のメンバーがどうかは知らないけど個人的にはtmux-xpanesを便利に使っていて、MariaDBのconfigをsymlinkにしてrepoに置いて動かなくなったのでsymlinkをやめて直接tmux-xpanesで全台書き換えてデプロイとか、全台で sudo journalctl -f とかしていた。

github.com

当日やったこと

  • 10:06 CloudFormationで環境構築完了してSSHの情報(Public IP, Private IP, ssh_config)をScrapboxに転記、ベンチ投げる
    • 初期スコアは1718
  • 10:30 ログ取りまわりの設定
  • 11:00 マニュアル読み終える
    • この時点で理解はしてない、というか今もしてなくて今年のマニュアルめっちゃ丁寧だったけどめっちゃ難しかったと思う
    • それとも日本語読んで理解する力が落ちてるのか…?
  • 11:30 デプロイスクリプト用意してデプロイしたら全台アプリケーションが落ちたので直してベンチ入れた、alpとpt-quer-digestかけた
    • Makefileがなくてmakeできてなかったり、なぜかバイナリが書き変わってなかったりしたのでMakefile作って make clean && make するようにした
  • 12:10 作戦会議してざっとあたりをつける
  • 12:50 1, 2をバックエンドにして3をDBにする
    • スコアは27312
  • 13:00 このあたりからMariaDBにアイコン画像を保存するのやめてファイルに書き出すやつやりはじめる
    • ついでにassetsもNginxから配信
  • 16:00 ここらへんで画像の分離完成
    • アイコンの配信と POST /api/isu だけNginxが載ってる方に寄せて片方のホストだけでファイルを保存するようにして、配信はX-Accel-Redirectを使ってユーザ認証してからNginxから画像を返すようにした
    • 最初ホスト上のRubyで書き出すかと思ってやったところ久々すぎてGemfile.lockがないとbundle installできない?? みたいなエラーが出てよくわからなかったりMariaDBだからなのかlibmysqlclient-devがなくてnative extensionsがビルドできなかったりして大変だったので手元にデータもってきてDocker上で書き出してホストに戻すみたいなことやってた
    • あとjia_isu_uuidが使えない?のか椅子の登録時にInternal Server Errorが返ってきて10分くらい悩んでたけど、マニュアル見たところ開発ではホストの5000番で立ってるJIA API Mockを使えと書いてあったので手で初期化したら登録できるようになった
    • ここでやったのはあんまり伸びなくて、なぜかというとアイコンのGETリクエストがそんなに多くなかったから…
      • ちゃんとalp見ようなという話だし、ちゃんとマニュアル読もうなという話でもある
  • 16:30 このあたりでやっぱりgetConditionなんとかしないとねということになってジョブキューに逃してみる? みたいな話をしてfireworq使い初めた
    • スコア全然上がらないし正直1.5時間くらいでできる気がしてなかったので諦めモードに入りつつ、まあやってみるかということで開始した
    • が、Goの習熟度が低いことが仇となってJSONをMarshalするときにうまくいかずタイムアップしてしまった
      • 普段全然使わない言語でいくとダメなことが分かったので慣れていく必要がありそう

感想

本番でも初動をしっかりできたのはよかった。Goの習熟度が低かったところと、うまくボトルネックを見つけられなかったのは引き続きという感じで、特に後者が一番重要な競技だと思うので来年はいろいろ手札を用意して臨みたい。まずは11の復習をどこかでやりたい。

競技そのものとしては事前準備(CloudFormationと環境確認など)から当日までとても快適だった。ベンチでごたついていた? ぽいけど、幸か不幸か終盤はみんな伸び悩んでゴリゴリ実装していてあんまりベンチ走らせてなかったので煽りをうけることがあまりなかった。オープニングとクロージングがあったり、VTuber企画があったりとコンテンツ的にも楽しめてよかった。開催に関わっているみなさまありがとうございました。

追記: チームメンバーのブログ記事

stefafafan.hatenablog.com