Top Banner
ボトルネックの探し方 プロファイリングの考え方とツール紹介
60

サーバーサイドボトルネックの探し方

Jun 19, 2015

Download

Technology

Yugo Shimizu
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: サーバーサイドボトルネックの探し方

ボトルネックの探し方プロファイリングの考え方とツール紹介

Page 2: サーバーサイドボトルネックの探し方

自己紹介清水 佑吾

@yamionp

株式会社 gumi 勤務

Python歴約2年半

サーバーさわりはじめて約10年

Page 3: サーバーサイドボトルネックの探し方

関わったもの

HTML + FlashLite

Cocos2d-x

Page 4: サーバーサイドボトルネックの探し方

アジェンダ

最適化について

ツール紹介

事例紹介

Page 5: サーバーサイドボトルネックの探し方

使用環境

Python 2.7

Django

MySQL 5.5/5.6 (RDS)

Redis

RabbitMQ

Page 6: サーバーサイドボトルネックの探し方

構成

DB

LB App KVS

MQ

Job

Page 7: サーバーサイドボトルネックの探し方

App

ログ

Jobエラーログ

Log

Page 8: サーバーサイドボトルネックの探し方

アジェンダ

最適化について

ツール紹介

事例紹介

Page 9: サーバーサイドボトルネックの探し方

最適化してますか?

Page 10: サーバーサイドボトルネックの探し方

最適化とは

システムより効率的に動作するよう変更すること

Page 11: サーバーサイドボトルネックの探し方

最適化でよくある失敗

最初から性能チューニング

予想だけで修正

Page 12: サーバーサイドボトルネックの探し方

予測するな、計測すべし

Page 13: サーバーサイドボトルネックの探し方

アジェンダ

最適化について

ツール紹介

事例紹介

Page 14: サーバーサイドボトルネックの探し方

ツール

Page 15: サーバーサイドボトルネックの探し方

三種の神器

CloudWatch

JetProfiler

NewRelic

Page 16: サーバーサイドボトルネックの探し方

CloudWatch

Page 17: サーバーサイドボトルネックの探し方

カバーエリア

DB

LB App KVS

MQ

Job

全部

Page 18: サーバーサイドボトルネックの探し方

CloudWatch

AWSの提供するシステムモニタリングツール

CPU, Memory, Disk, Network I/O, LoadAverage, etc..

もっとも基本的な情報

障害時のアラートなども行える

Page 19: サーバーサイドボトルネックの探し方

JetProfiler

Page 20: サーバーサイドボトルネックの探し方

カバーエリア

DB

LB App KVS

MQ

Job MySQL専用

Page 21: サーバーサイドボトルネックの探し方

JetProfilerとは

MySQLに対するリアルタイム解析ツール

クエリやステートの種類/数/頻度/割合

スロークエリ

クエリ/テーブル毎の処理時間使用率, etc…

Page 22: サーバーサイドボトルネックの探し方

スレッド別

Page 23: サーバーサイドボトルネックの探し方

ステート別

Page 24: サーバーサイドボトルネックの探し方

テーブル別

Page 25: サーバーサイドボトルネックの探し方

クエリ種別割合

Page 26: サーバーサイドボトルネックの探し方

ロック状態

Page 27: サーバーサイドボトルネックの探し方

スロークエリ

Page 28: サーバーサイドボトルネックの探し方

NewRelic

Page 29: サーバーサイドボトルネックの探し方

カバーエリア

DB

LB App KVS

MQ

Job

アプリケーシ

ョン

コード

Page 30: サーバーサイドボトルネックの探し方

NewRelicとはアプリケーションに埋め込むプロファイラ

Java/.NET/node.js/PHP/Ruby/Pythonに対応

関数/メソッド毎の処理時間を調査可能

統計情報表示

色々なAPIを提供

Page 31: サーバーサイドボトルネックの探し方

サーバー概要

処理時間

リクエスト数

URL別遅い順 エラー率

平均レスポンスタイム

Page 32: サーバーサイドボトルネックの探し方

処理割合

Python

外部API MemcacheMySQL

Page 33: サーバーサイドボトルネックの探し方

URLごとの詳細

URL別リスト

URLごとの変化の推移

リクエスト数とレスポンスタイム

個別の最も遅いレスポンス

Page 34: サーバーサイドボトルネックの探し方

テキスト

APIでデプロイを記録どのデプロイで変化があったかがわかる

Page 35: サーバーサイドボトルネックの探し方

DBもいける

処理時間 上位クエリ

上位クエリの推移グラフ

種類ごとの 割合グラフ

種類ごとの レスポンスタイム

Page 36: サーバーサイドボトルネックの探し方

アジェンダ

最適化について

ツール紹介

事例紹介

Page 37: サーバーサイドボトルネックの探し方

ある日の夜

イベントリリース!

しばらくは問題なく動作していたが…

ページが開けない!と苦情が

Page 38: サーバーサイドボトルネックの探し方

CloudWatch

AppサーバーCPU使用率もリクエスト数も問題ないが...

DBのCPU使用率が張り付いていた

Page 39: サーバーサイドボトルネックの探し方

即JetProfilerを起動

ここが真っ赤だった

Page 40: サーバーサイドボトルネックの探し方

テキスト

クリック一つて即Eplainグラフィカル&レーティングしてくれる。 DBにくわしくなくてもいかにもダメそうな感じ

Page 41: サーバーサイドボトルネックの探し方

インデックスがなかった

特定クエリが処理時間の9割以上を占めていた

緊急メンテに入りインデックスを追加

インデックスをはったら5%以下に

Page 42: サーバーサイドボトルネックの探し方

ほとんど同じ状況で 別パターン

Page 43: サーバーサイドボトルネックの探し方

無駄インデックス問題

特定クエリが処理時間の3割以上を占めていた

スローではないが一クエリ当たりの時間が多い

Explainしたら index merge

インデックスを削除したら100倍高速化

Page 44: サーバーサイドボトルネックの探し方

教訓

負荷試験をしよう

負荷試験の結果で必要なインデックスだけを貼る

インデックスショットガン、だめ絶対

超オススメです

Page 45: サーバーサイドボトルネックの探し方

最適化

十分早いが回数が多いクエリに複合キーなど

いらないインデックスを削除して高速化

Page 46: サーバーサイドボトルネックの探し方

ある日のNewRelic

Page 47: サーバーサイドボトルネックの探し方
Page 48: サーバーサイドボトルネックの探し方

逆にmemcache速い!っと思ってしまった

Page 49: サーバーサイドボトルネックの探し方

Cache.get多すぎプレイヤーデータ->マスターデータへのプロパティで発生

DB分割しているとなりやすい

Join出来ないのでプロパティなどで動的につなげる

マスターデータに関してはjsonでappサーバーに配置することで解消

Page 50: サーバーサイドボトルネックの探し方

ある日のNewRelic2

Page 51: サーバーサイドボトルネックの探し方

テキスト

Redis.getに2.5sかかったredisのマスターでsave(メモリデータのダンプ)を止めappendonlyのみにし スレーブでダンプするように変更する事でだいたい解消

Page 52: サーバーサイドボトルネックの探し方

Redis.get一回に2.5秒

平均では1ms(最低値)なので統計グラフには出ない。

NewRelicのTransaction Detail で発見

Redisのbgsave時に起こる(EC2だと起きやすい)

Page 53: サーバーサイドボトルネックの探し方

ほかに取れる統計情報

Page 54: サーバーサイドボトルネックの探し方

テキスト

どこに時間がかかっているかPython:DB:Memcacheの割合が 40:1:1 程度

Page 55: サーバーサイドボトルネックの探し方

テキスト

スケーラビリティ50req/mでも500req/mでもレスポンスタイムには変化が無いので遅いのは個々の処理を行っているコードや仕様の問題

Page 56: サーバーサイドボトルネックの探し方

ブラウザもわかる

Page 57: サーバーサイドボトルネックの探し方

サーバー側の処理時間の 2~5倍はレンダリングまでにかかる

Page 58: サーバーサイドボトルネックの探し方

Androidの 絶望的遅さiOS(平均500ms)比で Chromeで2倍 AndroidBrowserだと 3~4倍強。

Page 59: サーバーサイドボトルネックの探し方

質疑応答

Page 60: サーバーサイドボトルネックの探し方

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