ISUCON6に出場して今年も惨敗した話
こんばんは、ビットアイル・エクイニクスの山下です。
今回が二回目の投稿になります。
ちょっと間が空いてしまいましたが、ISUCON 6に参加し、惨敗してきたので、その時のお話をしようと思います。
そもそも、ISUCONとは何かですが、こちらに関しては公式ホームページを見るのが一番わかりやすいです。
ISUCON公式ブログ
簡単にまとめると、WEBアプリケーションが動いているサーバをチューニングしてとにかく高速に動かすと言ったものです。
ISUCON 6は6回目の大会で、9月17日(土)、18(日)に開催されました、参加チーム数は年々増えており、今年は合計300チームが参加したとのことでした。
・参加チーム
9月17日(土) 154組 428人(一般 138組、学生 16組)
9月18日(日) 163組 459人(一般 129組、学生 34組)
今回チームメンバーは大学時代の先輩二人と参加しました。
インフラ担当(私です) - @kono
コード管理担当 - @G3
DB & アプリケーション担当 - @kunikiya
ISUCONの素振りは一度もできませんでしたが、さり気なくISUCON三年生だったので、初動の動きは決まっていました
弊チームは@G3と@kunikiya共にPHPerなので言語はPHPで挑みました
時系列
- 09:30 今回の作業部屋である@kunikiya宅に到着、作業場所のセットアップ
- 09:50 @kunikiyaにAzureのセットアップを依頼
- 10:00 ISUCON開始
- 10:30 今回のISUCON環境を調査
- ここで、デフォルトがperlで動いていおり、systemdで各言語の切り替えを行っている事がわかる
- 10:40 秘伝のタレ系設定を入れていく
- nginxのログ出力設定、mysqlのslow query設定
- 10:43 自分のノートで誤って rm -rf ~ を打つ。
- 11:00 @kunikiyaのMacを借りて作業再開
- 11:10 自分のノートにubuntuを入れなおしを開始
- 11:20 言語をPHPに切り替え、初めてベンチを回す
- 2000くらいのスコアがでる(デフォルトのperlは4000くらい出ていた模様)
- 11:30 ボトルネックを探すがあまり遅くなくない?と言い出す
- 11:45 コードをガシガシ変える用のテスト環境をもう一台Azureにデプロイ
- 12:00 @kunikiyaがDB自体の容量がないので意味がないと共有
- 12:20 @kunikiyaがとりあえずIndexなど基本的なチューニングを施す
- 13:00 各々昼食
- 13:30 本番環境でベンチマークを回してもスコアがFailして出なくなる
- ここで一旦unix domain socketなどのインフラ周りの設定をすべて外す
- 14:00 @G3がとりあえずコードを読んでコメントをつけていく
- 14:30 @kunikiyaがDeploy環境を整えるためにCapistranoのインストールを始める
- 15:00 @G3がもくもくコードを読んでコメントをつけていく
- 16:00 @kunikiyaがCapistranoのインストールに手間取っていたので、諦める
- @G3が普通にDeploy用のスクリプトを持っていたのでそれを使えば解決することがわかる
- [反省ポイント 1]事前に必要になるツールの認識合わせ、用意ができていなかった
- [反省ポイント 2]何を誰がやっているかの把握と、どのくらいハマったら共有するか決まっていなかった
- 16:10 @G3がisudaとisutarがマイクロサービス的に分かれていると指摘、マージを開始する
- 16:40 @G3がマージを完了し、ベンチを回し6000位になる
- 16:50 一旦話し合いを行い、TOPページのコードに手を入れようと方針を決める
- 17:30 @kunikiyaがTOPページの改善を行いコードをマージし、少しスコアが上がる
- 17:40 インフラ周りの秘伝のタレ系設定をもう一度投入、少しスコアが上がる
- 18:00 ISUCON終了
- 最終スコアは6500ちょいでした
チームメンバが自分PC上で `rm -rf ~` うちました #isucon
— lllllYkeillll (@lllllYkeillll) 2016年9月17日
本日はお通夜です https://t.co/fTNEWtpsRW
— くにきや@ニコつく (@kunikiya) 2016年9月17日
【悲報】開始早々rsyncで~という名前のフォルダをローカルに誤って作り、消そうとしてrm -rf ~でホームディレクトリ以下が無事死亡。 #isucon
— コノ (@kono_evga) 2016年9月17日
インスコ開始しました。そんな事よりphpに切り替えたら、cssがデフォルトのnginx.confで読めない。#isucon pic.twitter.com/Svpw75OcoR
— コノ (@kono_evga) 2016年9月17日
その後、反省会をして行い問題点を洗い出しました。
反省会議事録は以下のとおりです。
物資
・ホワイトボード(読める字)
・Wiki (etherpad) http://etherpad.org/
コミュニケーション
・タスク変える毎に、ホワイトボードで流す。
⚠️やってることを、2人に告げること
明確な担当割り
・コノ・・・サーバーインスタンス(本番/開発環境)のミドルウェア触る人。何かミドルウェアいれるときはコノ経由。DBのインデックス貼りとか。計測をコノ(この変が重い)。
・G3・・・Git管理、デプロイ管理、ベンチマーク管理。デプロイ/ベンチマークはG3経由。
・くにきや・・・コードベースの修正、
導入ツール
・鉄板道具はいれちゃってて良い
→事前にキメる必要あり
事前作業
・開発環境を用意する
→別インスタンスがあると良い。今回の様にpor-fowordしてる場合があるときがあると
→次回集まってやるとき、開発環境サーバーを用意しておいて、そこで開発環境を用意する方法が簡単かどうかチェック
・ソースコードを開発環境に本番環境から移動させたときは簡単に作れるか(ミドルウェアのコンフィグ込み)
→PHP7でMySQLがある。(※最新の環境。OSもミドルウェアも。開催一ヶ月前の環境)
・(済) デプロイshellの用意
・PHPのプロファイラ(メソッド)
→x-debug?? →コード内にもいれる必要がある。
今回のアプリケーションのボトルネックについて
→topとログインのページが重かった。(くに)
→ソルトが一意にする必要があったが、パスワードを特定するのが大変だったからムズイ
→Redisにソルトをいれれば多少ははやいかも
→無駄にコネクションはるやつ(http経由になっていた)
→静的コンテンツCacheは、やる意味あったか
→あるが、むずい
→18:14 今でも把握できていない
→ボトルネックの把握を出来てなかったので次回は下記ツールを導入
→NginxはKataribe
→MySQLはptQueryDigest
まとめ
まず最初に、コマンドの打ちミスって改めてほんと怖いなって思いました(震え声)
用意してきた環境がまるまるなくなったのは流石に痛かったです。
今回はリモートではなく三人集まって行う初めてのISUCONであったが、結果は惨敗でした。
しかし、集まって行った甲斐はありコミュニケーションのロスが以下に大きいかを実感することができました。
また、事前準備をすること、ISUCONの素振りをしていればこんなことにならなかったよねということがわかったのも大きいです。
下記のような有名な言葉があります
愚者は経験に学び、賢者は歴史に学ぶ。
どれも他のISUCONエントリーを見ればわかることではありますが、我々はどうやら賢者ではないようでした。
なので、愚者は愚者なりに経験から学んで、次回の予選突破を目指します。