ISUCON11

ISUCON11 まとめ : ISUCON公式Blog

ポータルの出来がすごかった

事前の環境チェック、予選問題の環境構築もチームごとに異なるCloudFormationを適用するだけですごい楽でした。

ベンチマーカーについても予選問題の最後1時間前くらいからタイムアウトが発生したりしてましたが基本的にはほとんど待ちが発生せずに実行できたので変更からスコア確認までがとてもスムーズでした。

今回が初参加なのでいつもこんなに便利なポータルなのか分かりませんが非常に使いやすかったです。

まさかのテーマソング

初参加

コロナで気軽に外出することも出来ずにやることが無く時間だけあるので初めてisuconに参加してみました。イベント自体は以前日本に住んでいた時から知っていましたが参加することはありませんでした。

ソロ

コロナになる前はタイのチェンマイで2年間くらい隠居(まだコンドミニアムの契約が残っており戻る予定です)していて全く仕事をしておらず酒飲んで寝るだけの生活をしていました。

そんな生活をしていたので自分がどれくらい出来るのか周りとどれくらい差が出来てしまっているのか知りたくて1人で参加したという経緯もあります。

準備

メモとか気になった事を残せるように個人のslackに記録用のisucon11チャンネルを作成しました。

デプロイツールなんかは特に用意していませんでした。

過去問についても2週間前くらいにisucon11の予選問題を少し見て改善案として考えられそうな事を考える程度でした。

当日の流れ

覚えている範囲内で時系列で書いてみようと思います。

時間は大体になります。

変更毎のスコアをgit logに残しておけば良かったなと記事を書いていて思いました。

結局構成は

  • Nginx
  • Puma
  • MariaDB

というシンプルなものになりました。

10:00

  • マニュアル、レギュレーションを確認
  • システム構成の確認
  • 初期実装状態のスコアを確認
  • githubにプライベートリポジトリを作成、ソースコードをpush
  • 簡単なデプロイスクリプトを実装
    • 各サーバーにSSHコマンド経由で事前に配置していたデプロイスクリプトを実行する。
    • git pull、bundle install、キャッシュの削除、スキーマの適用、アプリケーションの再起動等を行う。

10:40

  • alpでアクセスログを解析

11:15

  • MySQLのインデックスを定義

12:40

  • nginxの設定を変更してupstreamに各サーバーを登録
  • DBをサーバー1に起動したMySQLを参照するように変更

13:00

  • 1日分しか必要ないグラフのために全てのデータを取得してループで排除していたのでSQLを修正

14:00

  • drop_probabilityを単純にコメントアウトするがスコアが下がってしまう。
    • sidekiqなどで非同期化などすればいいのかと考えたけど少し時間かかりそうだったので諦めた。
    • その後も少し手詰まりになった時に対処法を考えてみたけど残り時間のことも考えてしまい大幅な改修できずに結局最後まで初期値から変更できず。
    • 後でDiscordでリクエストの一部だけ登録するようにしてスコアが伸びたというのがあって「えっ、そういうのもアリなんだ!?」と思った。
  • 1件しか取得していないクエリに LIMIT 1 を追加したりしてた。

15:00

  • MySQLに格納されているiconデータを直接配信するのではなく一旦ローカルのファイルにキャッシュとして保存するように変更。
    • upstreamで全サーバーにリクエストが分散されていたので1サーバーに集中させればもう少しスコア伸びたのかも知れない。
  • 最初はnginxのproxy_cache_pathを使おうと思ったけど処理を見るとユーザー認証も必要だったので仕方なく諦めた。
    • X-Accel-Redirectが即座に出てこない辺りが力不足感ある。

16:00

  • SELECT * FROM isu のように全てのカラムを取得している箇所を必要なカラムだけ返すようにしてみたりちまちま変更。
  • ただスコアはほとんど伸びず。

16:30

  • かなりギリギリだけどMySQLのレプリケーションに取り掛かる。
    • ただ、writerに書き込んだ後にreaderに反映前にアクセスしてしまいベンチマーカーが落ちてしまう。
    • さくっと解決する術が思いつかずに結局レプリケーションは諦めた。
  • calculate_condition_level valid_condition_format? user_id_from_session の計算、レコード取得をキャッシュ化。
    • スコアにはほとんど影響せず。

17:00

  • trendをキャッシュしていいのか悩んで不安定になると嫌だなと思ってやらなかった。
    • 後でDiscordを見るとキャッシュしてスコア改善した方がいたので直感を信じてやればよかったなぁ。
    • 直感を信じてさくっと試せるだけの腕力を鍛えておかないといけない。
  • nginxのアクセスログを出力しないように設定。
  • 終了直前に触り過ぎて戻せなくなると悲しくなると思いあまり大きな変更はせずに再起動試験などを行う。
  • 少し早めだけど作業を終了。

圧倒的力不足

普段、Railsを使用したコードを書いているので薄いrubyのアプリケーションを書く時のやり方に躓くことが多かったです。

デプロイスクリプトや各ミドルウェアの標準的な設定などは用意しておくべきでした。ココで地味に時間を使ってしまいました。

最近の仕事ではクラウド前提なことが多く自前でミドルウェアを運用することも減ってきたのも影響しているのかなと感じました。

今回は2週間前にisucon10の予選問題を少し見ただけでしたがちゃんと事前準備するべきだったなと作業中に少し後悔しました。

後でマニュアルを見返していてかなりスコア計算に関する重要なところを見落としていたりしたのでちゃんと読もうという気持ちになりました。

修正に気を取られすぎていて記録用に作っていたslackのチャンネルにあまり残せなかったのでコミットメッセージに現時点のスコアやスクショなんかを残しておけばよかったと思いました。

結果

最終スコアは 32826 で順位は 135 位で惨敗です。

17時の時点では50位くらいだったんですがやっぱり最後の追い込みがあるんですね

ISUCON11 オンライン予選 全てのチームのスコア(参考値) : ISUCON公式Blog

まとめ

今回初めて参加してみましたが制限時間内に何をやればいいのか適切に判断してゴリッとコードを書くの楽しいですし後でみんなで答え合わせする感じもお祭りっぽくて好きです。

競技後のDiscordの #random でのみんなの感想を聞くと自分には全くない視点も知れて非常に勉強になりました。これだけでもISUCONに参加した甲斐があります。強いエンジニアが集まる場所は学びが多くて楽しい!

本戦出場が決定したmatsuuさんの記事が非常に勉強になりました。

ISUCOでチーム ウー馬場ーイー2 として参加し、本選進出を決めました - Gマイナー志向

また来年も参加したいと思いました。

運営の方達、非常に良い機会になりました本当にありがとうございました。