89
ISUCONの勝ち方 YAPC::Asia Tokyo 2015 Masahiro Nagano @kazeburo

ISUCONの勝ち方 YAPC::Asia Tokyo 2015

Embed Size (px)

Citation preview

Page 1: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

ISUCONの勝ち方YAPC::Asia Tokyo 2015

Masahiro Nagano @kazeburo

Page 2: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

Me

• 長野雅広(Masahiro Nagano)

• @kazeburo

• Mercari, Inc.

• Operations Engineer, Site Reliability

• ISUCON芸人

Page 3: ISUCONの勝ち方 YAPC::Asia Tokyo 2015
Page 4: ISUCONの勝ち方 YAPC::Asia Tokyo 2015
Page 5: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

主要KPI

ダウンロード数

購入金額

出品数

2000万DL(JP+US)

月間数十億円

1日数十万品以上

Page 6: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

JOIN!!

Page 7: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

Agenda1. ISUCONとは

2. 私とISUCON

3. Webアプリケーションのパフォーマンス

4. ISUCONの勝ち方

1. 準備編

2. チューニングの進め方

3. チューニングのヒント

Page 8: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

この発表の狙い• ISUCONに興味をもってもらい、参加者を増やす

• 予選突破、良い成績を残すのためのヒント• Webアプリケーションのパフォーマンスに関する知識の共有と自分を含むエンジニアと業界の技術力向上

Page 9: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

ISUCONとは資料中の写真は isucon.net から引用

Page 10: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

ISUCONとは• Webアプリケーションの高速化コンテスト

• 1日かけてお題となるWebアプリケーションをチューニングする

• アプリケーションのコードを弄る事ができないチューニングコンテストへのアンチテーゼ

Page 11: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

ISUCONとは• 課題となるWebアプリケーションに対してレギュレーション範囲内であれば、どんなチューニングを行ってもよい

• 職種、言語や開発・運用しているサービスの規模を超えて如何にパフォーマンスの高いWebアプリケーションを作る事ができるか

• (開催者がそれをみて楽しむ)

• ISUCONで得られた知見が公開される事で自分を含むエンジニアと業界の技術力向上に寄与

Page 12: ISUCONの勝ち方 YAPC::Asia Tokyo 2015
Page 13: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

ISUCONの順位• 出題者が用意したベンチマークツールの計測したスコアにより順位が決定

• ベンチマークツールはWebアプリケーションの動作に変更がないことをチェックしており、ベンチマークがエラーとなれば失格

Page 14: ISUCONの勝ち方 YAPC::Asia Tokyo 2015
Page 15: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

これまでのISUCON

Page 16: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

ISUCON1 2011/8出題: livedoor

Page 17: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

Blog コメント欄

Page 18: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

ISUCON2 2012/11出題: NHN Japan

Page 19: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

チケット販売サイト

Page 20: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

ISUCON32013/10 オンライン予選 2013/11 本選

出題: 面白法人カヤック

Page 21: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

予選: nopaste

本選: 画像投稿 + TL

Page 22: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

ISUCON42014/9 オンライン予選 2014/11本選

出題: クックパッド

Page 23: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

予選: パスワードリスト攻撃本選: 動画広告

Page 24: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

ISUCON52015/9/26-27 予選

2015/10/31 本選

Page 25: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

出題: トレジャーデータ

Page 28: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

私とISUCONISUCONで生まれた技術

Page 29: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

私とISUCON• 2011年 出題、サーバセットアップ担当

• 2012年 出題、サーバセットアップ担当事前に出題に挑戦し、ベンチマークの問題を洗い出す急性胃腸炎になる

• 2013年 初出場 優勝メンバー: tagomoris sugyan kazeburo

• 2014年 2年連続優勝メンバー: tagomoris sugyan kazeburo

Page 30: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

ISUCONから生まれた技術• ISUCONの為に作られたWAF

• Kossy

• より高いパフォーマンスを実現• Gazelle

• Redis::Jet

• Plack::Middleware::Session::Simple

詳しくはblogで

Page 31: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

Webアプリケーションのパフォーマンスなぜ重要か/なぜこだわるのか

Page 32: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

パフォーマンスの重要性• UX

• Jakob Nielsen - Response Times: The 3 Important Limits“1.0 second is about the limit for the user's !ow of thought to stay uninterrupted”

• KPI

• Google: Using site speed in web search ranking

• Aberdeen Group: study showed that a one second delay in page load time equals 11% fewer page views, a 16% decrease in customer satisfaction, and 7% loss in conversions.

http://www.nngroup.com/articles/response-times-3-important-limits/http://googlewebmastercentral.blogspot.jp/2010/04/using-site-speed-in-web-search-ranking.html

http://www.aberdeen.com/research/5136/ra-performance-web-application/content.aspx

Page 33: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

パフォーマンスの重要性• インフラコスト

• 30% 負荷を削減できると

• c4.2xlarge 30台だと$9843 => $6890

• c4.2xlarge 100台だと$32,810 => $22,967

• 管理コストや障害対応のコストも減らせる。大規模なインフラでは嬉しい

Page 34: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

ISUCONの勝ち方

Page 35: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

準備編

Page 36: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

チーム編成• ISUCONは2~3人のチームで参加

• 時間が限られるので効率よく作業を分担し、お互いの作業をチェックし、ミスを減らすことが重要

• コミュニケーションコストを減らすため、普段から一緒に業務を行っているメンバーでチームを作った方が有利

Page 37: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

コミュニケーション• チームメイトとの“会話”を重視しましょう

• 問題をいち早く相談して解決する• 本選では目の前にいる

• 決まった事はメモとして書き出す。後戻りを減らす

Page 38: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

雑な構成メモ

Page 39: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

時間配分• チームで認識を合わせる

• ISUCONは11:00 ~ 18:00 の7時間。意外と短い

• 最初の1時間は「まだ慌てる時間じゃない」課題の理解、プロファイリングとチューニングの方向性を決めることだけに使う

• 最後の30分は再起動テストに残す

Page 40: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

事前準備• Private Git Repository

• Wiki

• メンバーのSSH公開鍵

• 秘伝のタレを集める

• Chat room

• 技術選択についての簡単な打ち合わせ

• 過去問を解く

• ISUCON予選突破の鍵は過去問を解くことなので無料で試せるようにした(Vagrant+Ansible) - Dマイナー志向http://d.hatena.ne.jp/tmatsuu/20150815/1439643715

Page 41: ISUCONの勝ち方 YAPC::Asia Tokyo 2015
Page 42: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

チューニングの進め方

Page 43: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

チューニングの進め方1.課題の理解

2.プロファイリング

3.サーバ構成の把握

4.チューニングの方向性を決める

5.作業!

Page 44: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

1. 課題の理解

• レギュレーションや当日の説明を良く読む• スコアの算出方法、失格条件は特に重要

• ブラウザで課題となるサイトへアクセスする• とりあえずベンチマークを動かす

Page 45: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

2. プロファイリング• Webアプリケーションで起きていることを知る

• アクセスログ解析• MySQLのSlowLog解析

• アプリケーションのプロファイリング• サーバの負荷の確認

• プロファイリング結果を読み解く慣れも必要

Page 46: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

アクセスログ解析• ベンチマークツールがアクセスしている先を知る

• 頻度とレスポンス時間をバランスよく見る

• ツール

• analyze_apache_logshttps://github.com/tagomoris/Apache-Log-Parser

• kataribehttps://github.com/matsuu/kataribe/

Page 47: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

アクセスログ解析# vim httpd.confLogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%v\" \"%{cookie}n\" %D" combined

$ rm /var/log/httpd/access_log$ service httpd restart

# ベンチマーク実行

$ cat access_log | analyze_apache_logs

Page 48: ISUCONの勝ち方 YAPC::Asia Tokyo 2015
Page 50: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

MySQL SlowLog解析# mysqlのコンソールにて

> set global slow_query_log = 1;> set global long_query_time = 0;> set global slow_query_log_file = "/tmp/slow.log";

# ベンチマーク実行

$ pt-query-digest /tmp/slow.log > /tmp/digest.txt$ rm /tmp/slow.log

# 戻すときは

$ service mysqld restart

Page 51: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

アプリケーションのプロファイリング

• 各プログラミング言語のツールを使う• strace

• システムコールレベルでアプリケーションの動作を確認

• tcpdump

• 通信内容のキャプチャ

Page 52: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

サーバの負荷をみる• top - 全体の負荷

• iftop - ネットワーク

• iotop - disk io

• dstat

• などなど。使い慣れた物を使う

Page 53: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

3. サーバ構成の把握

Page 54: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

Client ReverseProxy

AppServer

RDBMS

Cache,KVS

サーバ構成

Page 55: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

サーバ構成の把握

• それぞれ、どのようなサーバ、ミドルウェアが動作しているか

• サーバ、ミドルウェアの設定• 過去には設定のtypoや罠も

Page 56: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

4. チューニングの方向性を決める

Page 57: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

チューニングの方向性を考える• ISUCONではサーバのおかわりはない。与えられたサーバを効率よく使い切る

• 効率の良いCPUの使い方を知る

• CPUの気持ちになれるツール作ったhttp://yuroyoro.hatenablog.com/entry/2014/10/20/102416

• コンテキストスイッチング

Page 58: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

Remix: Latency Numbers Every Programmer Should Know(2014)http://yuroyoro.net/latency.html

Page 59: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

コンテキストスイッチング

CPU CPU CPU CPU

process process process process process process process

process process process process process process process

process process process process process process process

OSによりスケジュール実行

Page 60: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

コンテキストスイッチング

CPU CPU CPU CPU

process process

process

process process process process

process process process process process process process

process process process process process process process

OSによりスケジュール実行

Page 61: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

コンテキストスイッチング

CPU CPU CPU CPU

process process process process process process process

process process process process process

process

process

process process process process process process process

OSによりスケジュール実行

Page 62: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

コンテキストスイッチング

• process/taskの切り替え時にCPUの状態を保存・復元

• プロセス数が多過ぎると、コンテクストスイッチの回数が増え、その処理にCPUが取られてしまう

Page 63: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

チューニングすべき対象

• 大量のデータの参照• 多サーバとの通信。特にラウンドトリップのコストが大きい新規の通信開始

• 大量のプロセス/スレッドの調節コンテキストスイッチングを減らす

Page 64: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

目指すアプリケーション• 何もしないアプリケーションに如何に近づけていくか

• 参照を減らす/しない• 通信を減らす/しない• プロセス・スレッドを減らす/使わない

Page 65: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

チューニングのヒントWebサーバ・アプリケーション・RDMBS

Page 66: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

Webサーバの選択

Page 67: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

Apache vs. Nginx

worker worker worker

worker worker worker

worker worker worker

リクエスト

コンテキストスイッチが大量発生

リクエスト

worker

1個のプロセスで効率よく通信を処理

Page 68: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

Nginx vs. h2o

リクエスト

process process

process

リクエスト

thread thread

thread

h2oはプロセスではなくスレッド。スレッドの方がコンテキストスイッチのコストが低い。スレッド間の情報の共有がしやすい

複数のworkerプロセスを起動し大量のアクセスを

捌く

Page 69: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

アプリケーションのチューニング

Page 70: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

• 外部プロセスの起動• HTMLテンプレート処理

• テキスト/画像変換処理• RDBMS/Cacheとの接続

• N+1問題

わかりやすい重い処理

Page 71: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

RDBMS/SQL

Page 72: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

心にいつもB+Treeを

Page 73: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

MySQL の B+Tree

titleuser

....

titleuser

...

titleuser

...

titleuser

...

titleuser

...

titleuser

....

titleuser

....

titleuser

....

PRIMARY KEYCLUSTERED INDEX

リーフノードにデータを含む

small largeid id id id id id id id

Page 74: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

MySQL の B+Tree

SECONDARY KEYprimary keyじゃないkey

リーフノードにPRIMARY KEYが含まれ、データはCLUSTERED INDEX

から取得

id id id id id id id id

is_private

created_atolder newer older newer

Page 75: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

MySQLのB+Tree

titleuser

....

titleuser

....

titleuser

....

titleuser

....

titleuser

....

titleuser

....

titleuser

....

titleuser

....

PRIMARY KEY

id id id id id id id id

SECONDARY KEY

id id id id id id id id

is_private

created_at

Page 76: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

MySQLのB+Tree

titleuser

....

titleuser

....

titleuser

....

titleuser

....

titleuser

....

titleuser

....

titleuser

....

titleuser

....

PRIMARY KEY

id id id id id id id id

SECONDARY KEY

id id id id id id id id

is_private

created_at

Page 77: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

MySQLのB+Tree

titleuser

....

titleuser

....

titleuser

....

titleuser

....

titleuser

....

titleuser

....

titleuser

....

titleuser

....

PRIMARY KEY

id id id id id id id id

SECONDARY KEY

id id id id id id id id

is_private

created_at

Page 78: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

MySQLのB+Tree

titleuser

....

titleuser

....

titleuser

....

titleuser

....

titleuser

....

titleuser

....

titleuser

....

titleuser

....

PRIMARY KEY

id id id id id id id id

SECONDARY KEY

id id id id id id id id

is_private

created_at

何度も繰り返す = 重い

Page 79: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

MOTTAINAIの心

Page 80: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

MySQLのOFFSET処理id title user ... . id title user ... . id title user ... . id title user ... .

id title user ... . id title user ... . id title user ... . id title user ... .

id title user ... . id title user ... . id title user ... . id title user ... .

id title user ... .

id title user ... . id title user ... . id title user ... . id title user ... .

id title user ... .

1 2 3 4

5 6 7 8

9 10 11 12

13

10000

10001 10002 10003 10004

Page 81: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

MySQLのOFFSET処理id title user ... . id title user ... . id title user ... . id title user ... .

id title user ... . id title user ... . id title user ... . id title user ... .

id title user ... . id title user ... . id title user ... . id title user ... .

id title user ... .

id title user ... . id title user ... . id title user ... . id title user ... .

id title user ... .

1 2 3 4

5 6 7 8

9 10 11 12

13

10000

10001 10002 10003 10004

頑張ってソート

必要な個数まで到達

Page 82: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

MySQLのOFFSET処理id title user ... . id title user ... . id title user ... . id title user ... .

id title user ... . id title user ... . id title user ... . id title user ... .

id title user ... . id title user ... . id title user ... . id title user ... .

id title user ... .

id title user ... . id title user ... . id title user ... . id title user ... .

id title user ... .

1 2 3 4

5 6 7 8

9 10 11 12

13

10000

10001 10002 10003 10004

頑張ってソート

必要な個数まで到達

廃棄

Page 83: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

RDBMS/SQL

• B+Treeをイメージして走査の距離を短く保つ

• 捨てるデータの読み取りを最小限に

Page 84: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

最後に

Page 85: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

大事なこと• 初期状態を記録し、いつでも戻せるようにしておく

• 変更を都度記録し、壊れる前の状態に戻しやすくする

• 前日はよく寝ましょう• 諦めたらそこで終了です

Page 86: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

健闘を祈ります!

Page 87: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

ご清聴ありがとうございました

資料中の写真は isucon.net から引用しました

Page 88: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

ISUCON 2回優勝したけど質問ある?

Q&A

Page 89: ISUCONの勝ち方 YAPC::Asia Tokyo 2015

勝つのは俺たちだ!