Slide 1

Slide 1 text

株式会社 DROBE 小黒 陽弘 Datadog APM で始める Laravel アプリケーションの パフォーマンスチューニング

Slide 2

Slide 2 text

自己紹介 ● 小黒 陽弘 (おぐろ あきひろ) ● 株式会社DROBEで主に PHP x Laravel で開発しています ● パーソナルスタイリングサービスのDROBEを作っています ○ ご興味ある方はぜひ「DROBE」で検索してみてください

Slide 3

Slide 3 text

はじめに ● Laravelで開発しているとこんなコードに遭遇しませんか?

Slide 4

Slide 4 text

はじめに toArray() の結果に独自プロパティ を混ぜるために appends に定義を 追加

Slide 5

Slide 5 text

はじめに 追加したプロパティは取 得時にDBアクセスが走 る可能性がある

Slide 6

Slide 6 text

はじめに ● 先ほどの Eloquent の一覧取得のAPI

Slide 7

Slide 7 text

はじめに appends で指定したプロパティ取得時、 eager loading していないため N+1 が発生

Slide 8

Slide 8 text

● Laravelを使った開発ではEloquentがよしなにやってくれすぎて、呼び出し 先のことをかなり意識しないと簡単に N+1 が発生してしまう ○ リレーションがたくさんあると、コード上で追うのが困難 ○ データ数の少ないローカル環境だと開発中気づけないことも → Laravelを使った開発において開発中に N+1 を完全に排除することは難し い!! Laravel と N+1

Slide 9

Slide 9 text

● 開発中に気づけないので、パフォーマンスの悪いAPIをリリースしていたり、 過去にリリースしたAPIがデータ増によってパフォーマンスが悪くなったりと いうことが起き得る → リリースされたAPIのパフォーマンスやボトルネックを確認できるようにしてお いて、問題の発見・修正を瞬時に行えるようにするべき Laravel と N+1 どう実現するべきか ...

Slide 10

Slide 10 text

Laravel と N+1 ● DROBEではどうしたか?

Slide 11

Slide 11 text

Laravel と N+1 ● 試しにDatadog APMを入れてみました ● Datadogをもともと使っていたこともあって、とりあえず入れてみたのです が、非常に良かったので今日はそのお話をしていきます

Slide 12

Slide 12 text

このセッションで話すこと ● Datadog APM について ● DROBEでの活用事例

Slide 13

Slide 13 text

このセッションのゴール ● 同じ課題感を持っている人が、自分のプロダクトに Datadog APM を入れてみたいと思えるようになること

Slide 14

Slide 14 text

Datadog APM について

Slide 15

Slide 15 text

APM とは ● Application Performance Monitoring (Management) の略称で、ア プリケーションのパフォーマンスを監視・管理することや、監視を行うツール 自体を指す

Slide 16

Slide 16 text

APM とは ● APMを導入することで、本番で運用されているアプリケーションのパフォー マンスが可視化され原因の特定・修正結果の確認が容易になる ● 例えば N+1 やスロークエリ・無駄に遅いロジックなどが一目でわかるように なる!!

Slide 17

Slide 17 text

Datadog APM とは ● Datadog の一機能として提供されているAPM

Slide 18

Slide 18 text

Datadog APM の特徴 ● エンドツーエンドトレーシング ○ アプリからDBに発行されるクエリまで全て紐づけ可能 ○ ログや各種メトリクスなども含め全てが自動で紐づく ● サンプリング無し ○ データは全て保存し、検索・分析可能な状態に ● コードレベルの可視性 ○ PHP はまだまだベータ版 … ● デプロイメントの追跡 ○ リリースバージョンごとのパフォーマンスをみたりできる ● 自動インスツルメンテーション ○ 様々な環境、言語、FWに対応しており、簡単に導入できる https://www.datadoghq.com/ja/product/apm より抜粋

Slide 19

Slide 19 text

● 2ステップで完了 ○ 1. Datadog Agent (datadogにデータを送信するdaemon)を動かす ○ 2. Laravel を動かしている環境にdatadog-php-tracer (いい感じにデータを 収集する php拡張)をいれる ● 動作環境に合わせてセットアップ手順がかなり丁寧に記載してある → 詳しくは https://docs.datadoghq.com/ja/tracing/setup_overview/setup/php を参照 Datadog APM の導入

Slide 20

Slide 20 text

Datadog APM ダッシュボード

Slide 21

Slide 21 text

Datadog APM ダッシュボード 時間ごとの秒間のリクエスト数が見 れる

Slide 22

Slide 22 text

Datadog APM ダッシュボード 時間ごとのエラーの数が見れる

Slide 23

Slide 23 text

Datadog APM ダッシュボード 時間ごとのLatencyが見れる

Slide 24

Slide 24 text

Datadog APM ダッシュボード service(phpかdbアクセスか、など) の割合

Slide 25

Slide 25 text

Datadog APM ダッシュボード Latencyの分布が見れる

Slide 26

Slide 26 text

Datadog APM ダッシュボード リリースバージョンごとのパフォーマ ンスが見れる

Slide 27

Slide 27 text

Datadog APM ダッシュボード エンドポイントごとのパフォーマンスがみれる (latencyなどでソート・検索できる)

Slide 28

Slide 28 text

Datadog APM ダッシュボード 単純な平均だけでなく、パーセンタイル統計(全 体のN%のリクエストはX秒以内みたいなデー タ)も見れる

Slide 29

Slide 29 text

Datadog APM ダッシュボード エンドポイントごとのダッシュボード も用意されている

Slide 30

Slide 30 text

Datadog APM ダッシュボード 各リクエストのパフォーマンスが一 覧でみれる

Slide 31

Slide 31 text

Datadog APM ダッシュボード どのタイミングでどういう処理が呼 ばれているかがみれる

Slide 32

Slide 32 text

Datadog APM ダッシュボード 実行時間や呼ばれた回数などが見 える

Slide 33

Slide 33 text

Datadog APM ダッシュボード ログやメトリクスとの紐付けも可能

Slide 34

Slide 34 text

この章のまとめ ● APM を入れるとAPIのパフォーマンスやボトルネックを確認できるようにな る ● Datadog APM は多機能で簡単に導入可能 ● Datadog APM のダッシュボードでは問題の発見・特定を行うための様々 な情報を確認できる

Slide 35

Slide 35 text

DROBEでの活用事例

Slide 36

Slide 36 text

Datadog APM を使ってチューニングしてみる hogehoge api のパフォーマンス悪 いからよろしく〜 ● チューニングの具体的なやり方の紹介

Slide 37

Slide 37 text

Datadog APM を使ってチューニングしてみる

Slide 38

Slide 38 text

Datadog APM を使ってチューニングしてみる

Slide 39

Slide 39 text

Datadog APM を使ってチューニングしてみる 緑はDB, 濃い紫がPHP

Slide 40

Slide 40 text

Datadog APM を使ってチューニングしてみる DBアクセスに問題がありそう ..?

Slide 41

Slide 41 text

Datadog APM を使ってチューニングしてみる スパンが 999 回以上も呼ばれている

Slide 42

Slide 42 text

Datadog APM を使ってチューニングしてみる

Slide 43

Slide 43 text

Datadog APM を使ってチューニングしてみる 同じクエリが大量に呼ばれ、呼び出し間隔も 短そう(N+1っぽい!)

Slide 44

Slide 44 text

Datadog APM を使ってチューニングしてみる

Slide 45

Slide 45 text

Datadog APM を使ってチューニングしてみる やたら時間のかかっているクエリはなさそうなので、 スロークエリは無さそう

Slide 46

Slide 46 text

Datadog APM を使ってチューニングしてみる ● 該当APIが遅いのは N+1 によるものである可能性が高いというこ とがわかる → 本件に関しては、eager loading されていないところを見つけ修正 & deploy

Slide 47

Slide 47 text

Datadog APM を使ってチューニングしてみる ● 結果の確認 新バージョン 旧バージョン

Slide 48

Slide 48 text

Datadog APM を使ってチューニングしてみる ● 結果の確認 P50で2倍くらいはやくなった 新バージョン 旧バージョン

Slide 49

Slide 49 text

Datadog APM を使ってチューニングしてみる ● 結果の確認

Slide 50

Slide 50 text

Datadog APM を使ってチューニングしてみる ● 結果の確認 明らかに N+1 っぽいものもなく なった

Slide 51

Slide 51 text

DROBEでの改善の流れ ● チームで行なっている問題の発見〜修正完了までの流れの紹介

Slide 52

Slide 52 text

DROBEでの改善の流れ 1. チームで APMを眺める会 2. スプリント プランニング 3. コード修正 4. リリース ダッシュボードで時間が かかっている処理を見 つける

Slide 53

Slide 53 text

DROBEでの改善の流れ 1. チームで APMを眺める会 2. スプリント プランニング 3. コード修正 4. リリース 優先度を相談してアサイン

Slide 54

Slide 54 text

DROBEでの改善の流れ 1. チームで APMを眺める会 2. スプリント プランニング 3. コード修正 4. リリース 詳細に確認して修正

Slide 55

Slide 55 text

DROBEでの改善の流れ 1. チームで APMを眺める会 2. スプリント プランニング 3. コード修正 4. リリース deploy

Slide 56

Slide 56 text

DROBEでの改善の流れ 1. チームで APMを眺める会 2. スプリント プランニング 3. コード修正 4. リリース 結果を確認しつつ新しい課 題がないかチェック

Slide 57

Slide 57 text

DROBEでの改善結果 4ヶ月前、計測を始めた時(全 APIの平均)

Slide 58

Slide 58 text

DROBEでの改善結果 4ヶ月前、計測を始めた時(全 APIの平均) 現在(全APIの平均) 2倍以上早くなった!!

Slide 59

Slide 59 text

まとめ ● Laravel で開発してるとどうしても低パフォーマンスなAPIをリリースしてしま うことは避けられない ● ただし、APMを使うことで、低パフォーマンスなAPIの存在の確認や問題の 特定が容易に行える ● 問題さえわかれば修正自体も容易(なことが多い) ● DatadogAPM、導入簡単で効果大なのでまずは入れてみましょう!

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

We are hiring !! 少しでもご興味ある方 お気軽にご連絡ください! 採用情報 https://info.drobe.co.jp/jobs エンジニアリング資料 https://info.drobe.co.jp/engineering