IT道はどこまで行っても続いてく、どうせ歩くなら楽しいIT道を。

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ちょいでした


その後、反省会をして行い問題点を洗い出しました。

反省会議事録は以下のとおりです。

物資

 ・ホワイトボード(読める字)
 ・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エントリーを見ればわかることではありますが、我々はどうやら賢者ではないようでした。 なので、愚者は愚者なりに経験から学んで、次回の予選突破を目指します。

Comment(0)

コメント

コメントを投稿する