ISUCON7予選に参加してきました

  • 3
    Like
  • 0
    Comment

はじめに

  • 株式会社エイチームライフスタイルのメンバーでISUCON7予選に参戦してきたのでそのレポートを書きました。
  • 会社にバックアップしてもらってよい経験をできた反面、とても悔しかったので悔しい思いに溢れたエントリになっている点はご容赦ください:wink:
  • @ihsiek がインフラでやったことに終始するので、他は@chimame, @tsutormがまとめてくれるはず。

参加の背景

  • @chimame がFacebookで 今の会社なら特にインフラメンバーが素晴らしいので出ても悪くないと思うのですよ。と発言したのがきっかけ。これが9/4/2017の話。
  • 最初は個人的に組んで参加しようと思っていた発言を弊社CTOが拾って社内メンバーに呼びかけ、9人集まったので3チーム結成。
  • CTOからCEOに伝わり、全社MTGで発表される。思った以上に大事になったとかなり焦る:fearful:
    • 過去問を使った模擬戦環境の構築費用やらオフィス間移動の交通費を会社が負担してくれることに:relaxed:
    • 会社の看板を背負ったという意味で負けられない戦いに:triumph:
  • 9/15/2017以降、毎週金曜日に社内制度を使って過去問による模擬戦を実施。
    • 模擬戦1回目の結果は散々、過去の振り返り記事で要点を押さえて新たな問題に挑む日々
    • 間違いなく地力は上がった

予選結果

  • fail 49,782 ぶっちぎり
    • failになったのは再起動時のスクリプトの準備を失敗したせい
    • ぶっちぎりどころかfailになった。くやしい:confounded:

役割

@ihsiek がやったこと

  • 意外と緊張していたようでやることが頭から飛ぶ(開始5分間)
  • あらかじめ用意した初期化スクリプトを実施
    • 公開鍵設置
    • ツールのインストール
    • mysqldump
  • こちらもあらかじめ用意していたAnsibleの実行
    • sysctl.confのチューニング
    • ファイルディスクリプタの最大数拡張
    • rbenv, redis, alpのインストール
    • 普段の開発環境に合わせた設定ファイルの設置(.vimrc, .gitconfigなど)
  • アプリの挙動をざっと確認してベンチマーカーを実行
  • 他メンバーがRubyに切り替える準備に入ったのでログを見ながらチューニングへ
  • Nginxのproxy_cache_pathをtmpfs上へ変更
  • Nginxでgzip_staticを設定し、/home/isucon/isubata/webapp/public以下をgzip圧縮
  • Rubyの切り替え準備ができたのでNginxの向き先を変更
  • /home/isucon/isubata/webapp/publicをtmpfs上へ移動
  • 1時間半経過時点で、15,000点くらい・・・だったと思う
  • alpにより、icons以下の画像が10秒でtimeoutしていることを把握
  • icons以下の画像はあらかじめ @chimame がファイルに吐き出してくれてたし、レギュレーションにあった304で返すしかないなと思い、キャッシュを設定
    expires 3s;  
    add_header Pragma public;  
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    etag off;
  • expiresが3秒なのはたまたまベンチの結果が一番良くなったからで、根拠はなかった。本当はもっと長く設定すべきだった。
  • このあたりで49,782に到達
  • @tsutorm が帯域を使い切っていると分析。頭打ちということで、ダイレクトサーバリターンによる複数台構成を検討し始める。
    • このときレギュレーションをちゃんと読み込んで、ベンチマーカーに複数台設定できることを把握していれば次のステップに進めていたのだが・・・:pensive:
  • @tsutorm がダイレクトサーバリターンを調査している間に、@chimame とともにインフラとアプリを複数台構成にできるよう変更。
  • 残り1時間を切ったタイミングでサーバ再起動をかけると、アプリが動作しなくなることを確認。
    • この時点で再起動後のベンチが動かないとfailになるというレギュレーションを把握できていなかった。
    • tmpfs使ってるからそうだよなと思いつつ、init.dにスクリプトを書いてみる
    • もちろん動かなくて涙目:sob:
  • systemdの記述に書き換えようとして時間が足りず・・・ということで、最大の戦犯は私でした:scream:
  • ダイレクトサーバリターンのほうもツールにバグがあってうまくいかなかったようで、そのままタイムアップを迎えてしまいました。

反省

  • レギュレーションの読み込みが甘かったことが最大の敗因。
  • 上位入賞チームはベンチマーカーの挙動から出題者の想定を見抜くことをやっていたので、競プロ勢との経験の差を痛感した。

よかったこと

  • 過去問対策も含め、普段の業務と異なる仕組みに触れられたのは得るものが多く、正直いいことしかなかった。
    • 今まで持ってなかった武器が増えた
    • 足りない武器も見えた
    • ISUCON常連に喰らい付ける手ごたえを得た
  • 最高のチームで現時点で最高の仕事ができた。@chimame, @tsutorm とまたISUCONやりたい。
  • 最後まで予選突破を目指して走り続けられた。
    • 予選突破できない高得点を目指すくらいならfailになってもいいというのがチームの共通認識だった。
    • 最後まで心折れず、勝ちに拘れたのはうちのチームのいいところ。

最後に

  • 運営メンバーの皆さん、いろいろな苦労があったと思いますがありがとうございました。
  • 会社の皆さん、バックアップと応援がとてもありがたかったです。仕事を通してお返ししていきます。
  • 競技プロコンやると組織が活性化するし、技量が上がる。
  • 組織の全国的な立ち位置が分かるので、もっと多くの人が競技プロコンやるべき。
  • エイチームグループ内で社内ISUCONやろうという話が出ているので、今から楽しみ。
  • 来年は優勝を目指す:smiling_imp: