標題の通り。弊社では今回のISUCONに4チームほど参加したようでしたが,われわれは自分と id:Pasta-K の二人チームで参加しました。使用言語はRubyで,スコアは4010点でした。
毎年ISUCONに同僚の人間が参加しているのを見ていいな~と思っていましたが敷居が高そうだなと思い参加できていませんでした。 今回は周りの皆が「え,参加しないの」と煽ってきたので本腰を入れて参加することにしました。チーム名は「めるぴっぴ」にしました。
初参加ということでid:Pasta-Kにいろいろと手解きをしてもらいある程度の戦い方は教わったのですが,やはり初めて参加するISUCONはけっこう緊張しました。 今回はAlibaba Cloudのリソースでの開催だったため,初めて使うクラウドサービスの勝手がわからずに右往左往しましたが,なんとか前日までにクーポン適用やインスタンスを立てるところまでを行いました。
ちなみに互いにRubyの文法があやふやで怪しい。自分はPerlが書けるがJSはあまり書けない,そしてpastakはJSが書けるがPerlが書けないので,ピジン語としてRubyが選ばれたのである。後になってから分かったことだが,自分はTypescriptは普通に書けるのでこれでNodeを動かせば良かったですね。次回からはTSで参加したい。
前日までにやったこと
- アリババクラウドのインスタンス立てる練習をした。
- Rubyのリファレンスをちょっと読んだ。
- 酒を飲んで備えた
当日チームでやったこと(おおまかに)
- 起床に成功。奇跡の起床。pastaくんとは1Fのセブンイレブンで邂逅する。カツ丼が売り切れており,しぶしぶ親子丼を買う。クレカが通らず,店員のおばちゃんに「不正利用とかがあるから気をつけるんやで」的なアドバイスをもらう。単に端子が汚れていただけだった……
- 手元で実行するタイプのデプロイスクリプトを仕込む。SSHでリモートログインして中間ディレクトリに
git pull
し,rsync -avh --delete
で稼動環境に流し込む(これが悲劇の一因になる)。各種のsystemctl restart
などをやって完了というもの。 - 作戦会議をやる。どうせN+1あるでしょ,とか,静的アセットはnginxに流しましょう,とか,いったん王道で攻めて,外堀を埋めたら飛び道具を出す戦略に。
- AWS X-Rayを仕込んでボトルネックやN+1を探る
- これは後で気付いたが,アリババにもX-Rayみたいなやつがあったのでこっちを使えば良かった。アリババはローカライズが雑で楽しい
- X-RayのRuby SDKには公式のもの(Railsにしか対応していない?)とクックパッドが提供している非公式(Rackに対応する)なものとがあり,前者と組み込んだ頃に後者の存在に気付いて入れ替える。この時点でかなり時間を食ってしまったので反省
rsync -avh --delete
のせいでなんか大事なアセット(椅子の画像)が吹き飛ばされる(!!)。このためだけにもう1つ同一イメージのインスタンスを立ててrsync
して復旧する。rsyncの--exclude
に詳しくなった- 配達弁当をデプロイする。
- rubyのブロック記法の
do |foo|
の順序を間違えて困る。Lispのラムダ式と同じことに気付き一気に加速。RubyはLisp - rubyでは数値を文字列に勝手に変換してくれないので,型キャストエラーに悩まされる。「perlならこんなことは起きない」などと呪詛を吐く
to_i
/to_s
に詳しくなる
- このあたりからどんどんコミットメッセージが雑になっていき,小林銅蟲氏のブログみたいになっていく
- N+1問題の解消のために,得意技である「SELECT ... WHERE ... INでまとめて引いてから好きなidで引けるハッシュを構築して必要なときにはそれを使う」作戦を決行する。
- 複数のアイテムに同一の売り手・買い手・カテゴリがつくことを失念していたのでハッシュには単一の行しか突っ込んでいなかった。
- 普段は素朴な暮らしをしているので気付かなかった。
- 複数のアイテムに同一の売り手・買い手・カテゴリがつくことを失念していたのでハッシュには単一の行しか突っ込んでいなかった。
- どっかで500が出て落ちてる,ということが分かるがログを見ても何も出ていない。異常終了ではなくシラフで500を返している。500出しうる全箇所に
p "1"
みたいなのを仕込む- 「あった!あったよ!"4"で出てる!」という素朴なデバッグが行なわれた。令和に吹くprintデバッグの風。
- 18時を迎えようとするがベンチが通らず憔悴してくる。第二次大戦末期のパウルス元帥のようになっていくが,そういえば開始が10分遅れていたのであと10分残っていた事に気付き必死のデプロイ。
- 最後の最後に走らせたベンチが通り,4010点のスコアを出した。この時時計は18:09を指しており,30秒後に試合が締め切られた。ハイタッチをして終戦。
その後やったこと
ISUCONに出ていない同僚と合流し,近所の酒場で飲む。そしてそのまま鴨川へ行きまた飲む。謎の酔いどれ外国人にずっと絡まれる。
筆者はオレンジ。
最高の仲間たちを紹介します pic.twitter.com/6HFouqMjA6
— Masayoshi Wada (@masawada) September 7, 2019
か い め つ
盛り上がってる pic.twitter.com/JyrckQnckK
— Masayoshi Wada (@masawada) September 7, 2019
泥酔状態
— Masayoshi Wada (@masawada) September 7, 2019
よかったですね。