Isucon2021振り返り

去る2021/8/21(土)にISUCONの予選が行われこちらに出場しました。 たまたまFukuoka.rbで知り合ったいでさんに声をかけたら快くチームを組んでもらえて、今回は二人で出場しました。

チームメイトのいでさんのエントリはこちら

(調べたリンクや画像を含めていないのでまた後で追記しておこう)

ISUCONとは

そもそもISUCONとはなにか、といいますと、 架空のWebサービスを例として、サーバーサイドの改善を行うことで架空の登録者数やインプレッションの増加などでポイントを競う競技 です。

今年度はLINE株式会社が予選及び本編、加えて事前に練習会を提供してくれました。

2021-予選

本編です。 やったことなどを簡単にまとめて行こうと思います。

本番サーバは80,443,22などなどデフォルトでTCPやHTTPを待ち受けているポート以外はベンチマーカーが使うためのポートを除いて他のポートを開放するとペナルティが発生するみたいだったので、 そもそもどうやってnetdataを参照するか一瞬悩みました。

そこで、sshで通信したサーバーのHTTPをホストのポートに転送する方法をとって、

ssh isucon@{予選サーバ} -i {githubの鍵} 'curl -i http://localhost:19999'

# あるいは
# ssh -L 8000:localhost:19999 isucon@{みたいタブのip} -i {鍵のフルパス}
# とおぼえておくとわかりやすいかも

という感じでnetdataを確認できるようにしました。

image

(これほかの人たちどうやって毎回対処してるんですかね?)

ちなみにサーバーのスペックはこんな感じでした。


OS: Ubuntu 20.04.3 LTS x86_64
Intel Xeon Platinum 8275CL
Memory 3723MiB

他のチームは初手の環境設定(例えばalpを入れたり)といったことを秘伝のシェルスクリプトやMakefileとして予め準備してる様子で、 練習会のときにインストールしてよかったものを手元にもっておくといいのかもしれないですね。

点数自体の推移はいでさんのブログにもありますが、 初手3000点スタートで、MySQLの設定(myconf)をいじりながらチューニングしていくとだいたい倍くらいまで点数が跳ねました。


# add setting (I/O dropping)
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 2


アプリケーション側(我々はRubyを選択。いでさんがよしなに実装を切り替えてくれました。ありがとう!!!!!)のコードにはかなりヒントがコメントアウトされていて、 速攻でアプリケーションの挙動を把握すれば次の手が見えてくる模様で、もっとハングリーに挑戦してもよかったかなと思います。

アプリケーション内の変数の受け渡しなどを可視化するテストツールが何かあったはず。(誰か教えて下さい)

ここらへんは実務がものを言う感じで、実装パターン(アーキテクチャ)やログの見方がわかっていれば超えられるハードルも多々あったと思うので、やっぱりガリガリ普段からコード書いておくと良さそうではあります。

ちなみにベンチマーカーを走らせるページからもログが見られたりするのでこれはめちゃくちゃ参考になります。

っていうかぶっちゃけ競技の本質にすらたどり着いてない感じはあるので、年度中に追試回したり、Go/Rustでの実装例をつついたりした話を追記していきたいです。

ISUCONにでるまでの準備について

公式

多くのチームが過去問を用いて勉強会を行っている他、今年度は事前にスポンサーのLINE社を中心として練習環境の提供やハンズオンセミナーが行われていました。

宇宙海賊株式会社の草野さんが実際にisuconに出るにあたって毎回何をしていたのか、といった話をコンソールを見せてもらいながら聴けてよかったです。

実際の環境に近いEC2インスタンスが用意されていたので、

  • どんなコマンドが通るか
  • root権限が使える環境なのか
  • 言語実装をどうやって参照できるか
  • どのようなルーティング、ORMが効いてるか

というようなことを確認できたのはかなりイメージが付きやすかったです。

とはいえ、alpやnetdataなどもすでにインストールされた状態(一定の秘伝のタレが効いた状態)ではあったので初心者が一から必要なものを本番中に揃える…というのはめちゃくちゃ辛そうだな、と思いました。(実際辛かった)

個人練習会

本番の二週間前に我らチーム「でるたかぶ」は練習会を行いました。

とはいえほぼ準備せずにその日環境構築から始めたのは我ながら賢くなかったですね…

本来この日にアプリケーション回すところをやるべきだった…

ちなみに自分はDocker環境でmac内に環境を構築しました。

参考

公式でも案内はありますが、いくつか詰まったところがあるので追試のときにまた成文化しておこうと思います。

終わりに

何気にインスタンスの構築から興味を持ってAWSのお勉強(SAAが割引されてたし)やらサーバレスアーキテクチャまで興味の範囲を広げられたのはよかったかも。 実装からも、sinatraが製品として活用できるポテンシャルを持ってることを知れてよかった。

競技終了後の反省回をするなかで、「一緒に出られてよかった」と言ってもらえたのが自分の中では印象的で嬉しかったです。 来年もまた一緒に出てもらえるように鍛錬しておきたいところですね〜!

余談

EC2のインスタンスx3を立てっぱなしにしていたので15日前後で8000円くらい請求されてビビった。 来年は気をつけよう….

ほなまた。