おそらくはそれさえも平凡な日々

ISUCON13 カラアゲネイティブチーム 15位

近年ISUCON出場のBlogを書いていませんでしたが、一応毎年出場はしていました。ISUCON9は本戦が娘の運動会と被っていたため、予選を一人チームで出て当然惨敗した。それ以降、ISUCON10, 11, 12, 13は、motemen, toricls(トリ)と「カラアゲネイティブ」というチーム名で出場している。馬が合うメンツなので楽しく参加している。

ISUCON10は予選突破ならず。ISUCON11は予選突破できそうだったが次点1位で本戦出場を逃す。これはもう、ふらりと当日参戦するスタイルはやめてISUCON12は流石にちゃんと対策しようということになり、初めて事前のチーム練習を実施したが、結局予選を突破できずであった。これは結構ショックが大きかった。

今回のISUCON13は同じメンツで参加はする話はしていたが、個人的にはあまりモチベーションは高くなかったのが実際のところだった。それに、トリさんがUS出張でフライトの時間が被っていて、後半からの参加になることになり、それもあって、ゆるく頑張るか、というチームの雰囲気だった。果たして、事前の打ち合わせすら全くせず本番を迎えたのであった。

競技開始

開始前にチームのDiscordで音声通話を繋げて、3人で会話。競技開始前にトリさんは飛行機に搭乗し一旦離脱。競技が開始され問題を見たら、DNSが組み込まれている新機軸で一気にテンションが上った。すわDNSサーバー自作か、とか思うなどしたが、そこは落ち着いて問題を見て対策を立てていった。

NginxからのICON配信

とりあえず、ICON配信が一つの関門ぽかったので、餅は餅屋ということで静的配信Nginxに任せ、1台目のサーバーからICONを配信することとした。conditional getがちゃんとできるかは定かではなかったが、Nginxならできるやろ、とか思っていたが、どうもそうではなかったらしい。とはいえ、NginxからICONを配信するようにしたらスコアは上がったので結果オーライである。後から振り返ると、今回はこういう、正答ではないが暫定対応がうまくハマってスコアが上がったケースが多く、運が良かった。

ただ、ここのNginxの設定に苦戦した。アイコン画像がない場合に NoImage.jpg を配信する必要があった。これは try_files ディレクティブを使えばイケるやろ、と思っていたが、ここでは aliaserror_page ディレクティブを組み合わせる必要があった。これに異常に時間を取られてしまったのは痛恨。

昼過ぎに、フライトを終えたトリさんがホテルから参加。長年チームを組んでいることもあって特に説明無くキャッチアップしてくれたのは良かった。

複数台構成

とりあえず、PowerDNSで使っているMySQLの負荷がいかんともしがたかったので、アプリケーション用のDBは3台目のサーバーに移すこととした。ついでにGoのアプリケーションも1台目と2台目に動かして分散するようにした。2台目のサーバーは必要になったらRedisも同居させる想定。実際この前後でRedisをmotemenが立ててくれた。どのサーバーにどのミドルウェアを置くかといった構成案はチームで既定路線の慣れた動きになっていて、阿吽の呼吸になっているのは楽。

あとは、encoding/jsongoccy/go-jsonに差し替え。毎年やっているので、以下の置換ワンライナーがシェル履歴から呼び出せて笑ってしまった。

$ perl -i -pe 's{"encoding/json"}{"github.com/goccy/go-json"}g' **/*.go

競技開始当初はバタついたが、トリさんも競技開始して、細かい改善も色々入りスコアとしてはこの時点で3万超えくらい。安定的に10位前後に位置取りできるようになってきた。TOP3辺りで、ヘンリー同僚のataganが参加している「都営三田線東急目黒線直通急行日吉行」チームが奮闘しており、励みになった。

しかし、ここもPowerDNSの負荷に向き合うのではなく、適当に負荷分散したら凌げた、という話なのでうまく噛み合った感がある。最終的な構成は以下。

  • isu11: Nginx, PowerDNS(w/ MySQL), isupipe
  • isu12: isupipe, Redis
  • isu13: MySQL

10万点超えと終戦

後は水責め攻撃に対する抜本的な改善は諦めて、Redisに置けるデータはRedisに置くようにしたり、N+1を潰したり、複数台の負荷分散の調整などの作業を各自で実施して地道にスコアを上げていった。ここで、Go 1.21で入った新機能である sync.OnceValue を使えたのが個人的に少し嬉しかった。

今回は、再起動試験もちゃんと実施できたのは良かった。レギュレーションを読むと競技中の最終計測が競技スコアとなるようだったため、再起動後にスコア計測を何度か行い、105,751を提出スコアとした。

TOP10に入れるかと期待していたが、結果としては15位だった。まあ、カラアゲネイティブチームとしては最も良い成績を挙げられたので良し。

反省

カラアゲネイティブでチームを組むのが4回目で、勝手知ったる感じがあってやりやすかった。お互いがやってることをうまく把握し合いながらうまく戦えて楽しかった。

ただ、運が良く噛み合った感もある。本丸のDNS水責め攻撃は特にこれといった対処はしなかったし、ICONのconditional getもそう。何れも暫定対応がそこそこうまくいってしまった。

カラアゲネイティブのメンバーはスキルセットが似通っているので、やりやすさはある反面、技術領域のカバレッジがそこまで高くない所に課題がある。特に、インフラ面の弱さ。そんじょそこらのインフラエンジニアには負けないとは思うが、ウー馬場イーツチームとかと比べると差は感じる。PowerDNSに無抵抗だったのも結局そこが課題。

なので、このメンツでの伸びしろを感じづらくなってきているが、組んでて楽しいメンバーなので今後も機会があるなら出場を続けていきたい。4年間でチーム内でのノウハウも溜まってきているので、その辺りは別途アプトプットできればと思う。

今回も素晴らしい大会運営ありがとうございました。毎回、次回のISUCON開催が心配されますが、今回は特に不透明な状況かと思います。個人的にはISUCONには大変お世話になったので色々思いがあります。多くのOSS、技術カンファレンスやイベントが、実はすごく不安定ながら継続している儚いものであるということが改めて思い起こされます。インターネット自身がそうであるように。だからこそ、尊いものでもあるし、エンジニア個人としても興味を持ったらその時点ですぐに参加してみるのが大事です。もちろん継続性に向き合っていかないといけないものもありますが。ただ、いつまでも続くように見えているものが、あっけなく終わるということは、全然珍しいことではありません。

参考

created at
last modified at

2024-04-22T00:47:06+0900

comments powered by Disqus