Unyablog.

のにれんのブログ

ISUCON8 予選・本選に参加しました(チーム名 :thinking_face:)

3年前から参加している ISUCON の、予選と本選に行ってきた。

結果を先に書くと、 5981 点で学生5位、全体では14位だった。

チーム

ざっくり自分がインフラ担当、 utgw が SQL 等の改善、 wass がアプリケーションの改善と方針立てをやっていた。

予選

自分が二人とチーム組むのは初めてだったので二回ぐらい練習して挑んだ。

utgwkk.hateblo.jp

↑は utgw の記事。

自分は

  • サーバーのセットアップ
  • h2o を Nginx に
  • MariaDBMySQL 5.7 に移そうとして失敗
    • 確か未定義動作の動作が違っていた
  • 複数台構成
  • 見守り
    • レスポンス比べるとか
  • ベンチマーカーへの祈り

といったことをやっていた。現代は Systemd なので CentOS でも大体いける。

アプリはほとんど見ていなかった。チームメイトに感謝。

本選

scrapbox.io

↑ は wass の記事。

github.com

↑のレポジトリの Your Name が大体自分。

タイムライン

前日

  • 新幹線が遅延したので21時ごろに東京着
  • カプセルに止まったらいびきステレオ環境だった
    • 結局頑張って4時間ぐらい寝た

09:10 頃

新宿につく。バスタのコンビニで菓子買おうとしたら混雑していたので諦める。

09:30 前

会場に到着。標準的なテーブルを獲得。物理的な準備をする。

f:id:nonylene:20181022191824j:plain

10:00

開始。なるほど isucoin! 仮想通貨ネタ!

まずはドキュメントを読み、 tmux-cssh を使って鍵配布やアカウント作成を行う。 雑な shell script ぐらいは用意しておいても良かったかもしれない。

10:30

  • firewall 止める、ulimit 解除する、 pt-query-digest 入れるあたりのことをやる。
    • ちなみに docker-compose で行くなら ulimit は解除しなくても良かった。
  • 全体的な構成をざっくり見る。 docker-compose で立ち上がってるのを見て脱出を検討する。

Restart したら iptables がどうのこうのと出てさっぱり分からなかったので脱出を決定*1

とりあえず本体である

  • isucoin 本体
  • MySQL
  • Nginx

を脱出することに。

isucoin 本体

Python だけを systemd unit に切り出した。 pipenv なのでやるだけ *2 だったのだけど、使ってる Python が 3.7 だったのでコンパイルした *3

作業してるとコンパイルが微妙に早いホストと遅いホストがあった*4ので早いホストに MySQL 入れることに。

isucoin-python.service · wass88/isucon8-final@1eeb658 · GitHub

MySQL

MySQL は 8.0 だった。 予選の段階で 8.0 が yum でサクッと入っているのは分かっていたので入れる。

ただ、 my.cnf.d 読んでくれなかったり、 8.0 はオプションがちょくちょく違ったりで困った。validate_password で色々とハマるとか*5

データの流し込みとかはサクッとできた *6

Nginx

特に困らなかった。 upstream がなくて link でやってるのはへ〜って思った。

これらの作業が全て終わったのが 12:40 ほど。

f:id:nonylene:20181022191026p:plain

12:45

昼飯。

13:15〜

見つけたところから色々やっていく。

  • Nginx で静的ファイル送信
  • keepalive
  • http2
  • MySQL ホスト分離・メモリ増やす・スロークエリ出すなど
  • アプリケーション複数台構成
  • initialize を各ホストにくばる
  • worker 増やす
  • Nginx でセッションごとの振り分け(sticky)できるようにコンパイルし直す

その他諸々。複数台を除くと顕著な効果はなくて、他のネックが解消された際に困らない程度だと思う。

たまにペアプロを手伝ったりもした。アプリケーション側の改善のおかげで点数が上がっていった。

終盤(16:30~)

終盤は htop とか見ながら、ペアプロで手伝いをしていた。

最後再起動試験をし、 share を有効にしてみて fail し、 BAN を実装しかけて fail し、5分前に差し戻して終了。

5981 点で学生5位、全体では14位だった。まあまあですね。

f:id:nonylene:20181022192735p:plain

反省

Docker の切りだし

Docker の切り出しには2時間かかった。

その間は(iptables のエラー出てて)ベンチ回せず他の所を見てもらっていた。その時間ベンチできてれば伸ばせたかもしれない。

ただ、Docker 切り出した後構成関係で詰まることはなかったので、個人的には良かったと思っている。

Docker も docker-compose も、触りぐらいしか触ったことないので本格的に触らないとな〜〜〜〜と言い続けている。妙な苦手意識が未だにある。

Share

Share はもう少し早く見るべきだった。最後の15分ほどでアクセス大量に来て落ちたのを見て止めたけど、他のチームが 1/3 ぐらい返していたという話を聞いて、なるほど〜〜〜〜〜 AB テスト〜〜〜ってなった。

アプリケーション

自分は Python も Go も触るので非同期処理をしている様子をもう少し手伝うべきだった。 Nginx に sticky を入れたりはもう少し様子見てからでよかったのでは?

インフラ方面は大体やることやったので満足している。

その他感想

  • 3年ぶりの本選ですが、学生のレベルが優勝するほど高くなっててすごい。
  • 鍵などの準備はしてなかったけど、あまり困らなかった。
  • 非同期したくなったときに Go か node か書く練習はするべきだな〜と思う。
  • pipenv や Python 3.7.0 が使われているのは Python 大好き人間としては嬉しかった。手数は増えたけど😇。
    • 実は Python での参戦は初めて。コードが高速に読めてよかった。
  • tmux-cssh を使ってみたらめちゃくちゃ便利だった。isucon 程度であれば ansible もなくて良さそう感。
  • 情報を表示するだけの PC を持ち込んだのは正解だった。いつでも netdata や htop を眺めることができた。

チームメイトだった id:utgwkk id:wass80 に感謝。本選でもアプリケーション面はほぼやってもらった。

楽しかったです

予選も本選も特に不満がなくて素晴らしい大会だったと思います。問題もすごく良かったです。

来年あればもちろん参加するし、今度こそ優勝したい!!

運営の皆さん、本当にありがとうございました!!!!!

*1:ちなみにこれは docker restart したら直ることに後で気づいた

*2:utgw と nonylene は pipenv をよく使っている

*3:とは言っても yum-builddep して tar 持ってきて make するだけ

*4:よくある話

*5:あのときは同じパスワードじゃないと落とされるかもなとか思ったけど、今考えたらこだわる必要なかった

*6: mysqldump に mariadb のコメントがあったときはヒヤッとしたけど、初めのクライアントがそうだからそうですね