Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
by
Ryo Tomidokoro
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
Laravelで学ぶ Webアプリケーションチューニングの基本 PHP Conference Japan 2026 hanhan1978
Slide 2
Slide 2 text
Name : hanhan1978 / Ryo Tomidokoro From : 横浜市 Job : Backend Expert @ kaonavi inc Podcast : Yokohama North AM
Slide 3
Slide 3 text
本トークの内容 2019年の登壇内容を2025年バージョンに改訂 したものです。 基本思想は全く変わっていません。 https://speakerdeck.com/hanhan1978/web-application-tuning-guildline
Slide 4
Slide 4 text
注 Webアプリケーション ↓ Webアプリ 長いので、以後省略して書きます
Slide 5
Slide 5 text
質問です
Slide 6
Slide 6 text
パフォーマンスチューニング したことありますか?
Slide 7
Slide 7 text
未経験者の方へ チューニングは職人芸ではありません たんたんと順を追って確認する作業です
Slide 8
Slide 8 text
本トークの目指すところ 特にチューニングの経験が浅い方にとって まず何をどうしてよいか分からない!? 解像度を上げましょう AIへの指示も明確になります
Slide 9
Slide 9 text
よくない指示
Slide 10
Slide 10 text
よくない指示 あまりにも人間側が頭を使ってない
Slide 11
Slide 11 text
よい指示
Slide 12
Slide 12 text
よい指示 ボトルネックに対する具体的な指示
Slide 13
Slide 13 text
再掲 本トークの目指すところ 特にチューニングの経験が浅い方にとって まず何をどうしてよいか分からない!? 解像度を上げましょう AIへの指示も明確になります
Slide 14
Slide 14 text
ついでに Laravelが持つ基本的な機能がどのようなケース で役立つのかを紹介します
Slide 15
Slide 15 text
アウトライン 1. 全体を見る 2. Webアプリの責任? 3. Webアプリの処理を特定する 4. 改善ループ 5. よくある問題処理とその対処
Slide 16
Slide 16 text
1. 全体を見る 2. Webアプリの責任? 3. Webアプリの処理を特定する 4. 改善ループ 5. よくある問題処理とその対処
Slide 17
Slide 17 text
1. 全体を見る
Slide 18
Slide 18 text
遅いとは?
Slide 19
Slide 19 text
遅いとは? 曖昧な言葉。 私の「遅い」と あなたの「遅い」は比較出来ない 主観であり、個人差がある。
Slide 20
Slide 20 text
曖昧な表現 なんか、この画面遅くない?
Slide 21
Slide 21 text
議論の開始としては悪くないが、作業をスター トするには情報が足りない このような「遅い」では改善が行えない。
Slide 22
Slide 22 text
具体的な表現 「メトリクスを確認すると、該当時間帯は 通常よりも500msecレスポンスが遅かった」
Slide 23
Slide 23 text
コンテキストや数値が説明されることで、具体 的な状況が浮彫になってくる こういう「遅い」は改善につながる
Slide 24
Slide 24 text
定性的な表現を定量的な表現に変換しましょう 「推測するな計測せよ」の世界です。
Slide 25
Slide 25 text
状況が分かっても「遅い」の原因は分かりません。 原因究明のために、Webアプリをもっと俯瞰してみ る必要があります。
Slide 26
Slide 26 text
Webアプリは どのようにしてブラウザに表示されるのか?
Slide 27
Slide 27 text
Webアプリの全体像 ネットワークはなぜつながるのか?第2版 - 戸根勤(日経BP社)
Slide 28
Slide 28 text
Webアプリケーションの全体像 自分たちの領域は意外と小さい ネットワークはなぜつながるのか?第2版 - 戸根勤(日経BP社)
Slide 29
Slide 29 text
アンコントローラブルな領域 Webアプリだけでは改善できない領域が沢山ある Webアプリが「遅い」の原因なのかも分からない
Slide 30
Slide 30 text
遅いの原因をつきとめる なんとなくアタリをつけてはいけない エンジニアとして理詰めで突き止める必要があ るが‥どうしよう?
Slide 31
Slide 31 text
1. 全体を見る 2. Webアプリの責任? 3. Webアプリの処理を特定する 4. 改善ループ 5. よくある問題処理とその対処
Slide 32
Slide 32 text
2. Webアプリの責任?
Slide 33
Slide 33 text
「遅い」の考え方
Slide 34
Slide 34 text
レイテンシー 任意の状態から、任意の状態まで 待つためにかかった時間を計測した値 例) HTTPのリクエストからレスポンスまで DBのクエリ送信からデータ受信まで 詳解システム・パフォーマンス Brendan Gregg 西脇靖紘 長尾高弘(オライリー・ジャパン)
Slide 35
Slide 35 text
Webアプリ全体のレイテンシー サーバー側 ネットワーク 光ファイバー等 プロバイダ ユーザー側 ネットワーク
Slide 36
Slide 36 text
レイテンシーの中身をみて、Webアプリ単体の レスポンスタイムがボトルネックで無い場合 Webアプリ以外で対処する方が効率が良い
Slide 37
Slide 37 text
Webアプリ以外の遅さ 例えば大陸間のネットワーク通信 速度制限のかかった格安SIM VPNの輻輳
Slide 38
Slide 38 text
例1 Time To First Byte 2秒 WebサーバーのResponse Time 150ミリ秒 サーバー側 ネットワーク インターネット プロバイダ 2秒 150ミリ秒 ユーザー側 ネットワーク
Slide 39
Slide 39 text
例1 Time To First Byte 2秒 WebサーバーのResponse Time 150ミリ秒 サーバー側 ネットワーク インターネット プロバイダ ユーザー側 ネットワーク 2秒 150ミリ秒 Webアプリはボトルネックではない (全体の 7.5%)
Slide 40
Slide 40 text
例2 Time To First Byte 2秒 WebサーバーのResponse Time 1.5秒 サーバー側 ネットワーク イン ター ネット 2秒 1.5秒 プロバイダ ユーザー側 ネットワーク
Slide 41
Slide 41 text
例2 Time To First Byte 2秒 WebサーバーのResponse Time 1.5秒 サーバー側 ネットワーク イン ター ネット プロバイダ ユーザー側 ネットワーク 2秒 1.5秒 Webアプリがボトルネックの可能性 (全体の 75%)
Slide 42
Slide 42 text
AWSで試してみる
Slide 43
Slide 43 text
Tokyo Region Ubuntu 26.04 LTS N. Virginia Region Ubuntu 26.04 LTS
Slide 44
Slide 44 text
東京のブラウザからアクセス Tokyo N. Virginia
Slide 45
Slide 45 text
Webアプリの全体像 160ms ネットワークはなぜつながるのか?第2版 - 戸根勤(日経BP社)
Slide 46
Slide 46 text
大陸間のネットワークでかかる時間 アメリカ大陸から +160msec Webアプリでは改善できない! CDN等のソリューションが必要
Slide 47
Slide 47 text
おまけ Tokyo Osaka 東京のブラウザからアクセス
Slide 48
Slide 48 text
レイテンシーの話にもどる
Slide 49
Slide 49 text
全体のレイテンシーの中でWebアプリのレスポンス タイムが支配的な場合 Webアプリをチューニングすることでレイテンシー を改善することが可能 サーバー側 ネットワーク イン ター ネット プロバイダ ユーザー側 ネットワーク 2秒 1.5秒 Webアプリがボトルネックの可能性 (全体の 75%)
Slide 50
Slide 50 text
レスポンスタイム 各ウェブサーバーはログにレスポンスタイムを出力す ることが出来る。 Apache : %D Nginx : $request_time
Slide 51
Slide 51 text
Webアプリ単体のレイテンシー サーバー側ネットワーク ウェブサーバーのレスポンスタイム その他通信
Slide 52
Slide 52 text
ここまでで、Webアプリのレスポンスタイムがボ トルネックであることが分かった。 じゃあ、Webアプリのチューニングを開始...
Slide 53
Slide 53 text
まだ、ちょっと情報が足りてない その「遅さ」はWebアプリの責任?
Slide 54
Slide 54 text
Webアプリ以外の原因 ● サーバー内の他処理の影響 ● 連携しているAPIの障害 ● 利用しているデータベースの障害
Slide 55
Slide 55 text
原因を探るための手がかり IaaS, SaaS のステータス情報、Xのざわつき メモリ使用量、CPU使用率、ディスクIO、ネットワー クIO etc…
Slide 56
Slide 56 text
実際の事例 https://aws.amazon.com/jp/message/56489/
Slide 57
Slide 57 text
頼れるツール類 ● IaaS, PasSが提供するツール (CloudWatch) ● サーバー監視ツール (Mackerel) ● 統合型監視ツール(Datadog, New Relic)
Slide 58
Slide 58 text
測定ツール(Laravel 特化) ● Laravel Cloud (専用モニタリング) ● Nightwatch
Slide 59
Slide 59 text
Mackerel
Slide 60
Slide 60 text
Datadog https://www.datadoghq.com/ja/blog/real-user-monitoring-with-datadog/
Slide 61
Slide 61 text
Laravel Nightwatch https://nightwatch.laravel.com/docs/start-guide
Slide 62
Slide 62 text
手に入る情報全てを使って、何がボトルネック になっているのかを特定する 一個ずつ一個ずつ、原因を絞り込んでいく
Slide 63
Slide 63 text
ついにWebアプリが原因らしいことが分かった じゃあ、次は何をしたらいい?
Slide 64
Slide 64 text
1. 全体を見る 2. Webアプリの責任? 3. Webアプリの処理を特定する 4. 改善ループ 5. よくある問題処理とその対処
Slide 65
Slide 65 text
3. Webアプリの処理を特定する
Slide 66
Slide 66 text
この段階では 「PHPのプログラムが原因らしい」 としか分かっていない。 具体的にどこを直せばいいのか、どうやって 特定するのか?
Slide 67
Slide 67 text
ツールの利用 一部の監視ツールには、自動で性能問題を検出 する機能が備わっています
Slide 68
Slide 68 text
Datadog さすがの高機能....
Slide 69
Slide 69 text
Observabilityの進化 2019年頃に比べて、遥かに強力になっていて、 どのエンドポイントが遅いのかまでは、すでに ランキングで可視化できてたりする
Slide 70
Slide 70 text
現代のパワープレイ 経験の浅い業務は手伝ってもらいましょう
Slide 71
Slide 71 text
プロファイラー コード実行時にどの処理にどのくらいの時間がかかっ ているのかを計測するもの と、言葉で言われてもピンとこないので実例を見たほ うが早い
Slide 72
Slide 72 text
プロファイラーの例1 https://docs.datadoghq.com/dashboards/widgets/profiling_flame_graph/
Slide 73
Slide 73 text
プロファイラーの例2 https://github.com/reliforp/reli-prof
Slide 74
Slide 74 text
その他のツール New Relic Xdebug Xhprof Blackfire Nightwatch
Slide 75
Slide 75 text
プロファイルは、性能問題を抱える処理を特定 する強力なツール 利用できれば、非常に効率的
Slide 76
Slide 76 text
プロファイラーが使えない場合の策
Slide 77
Slide 77 text
プロファイラーが使えない場合の策 ログに処理時を出す
Slide 78
Slide 78 text
1. 全体を見る 2. Webアプリの責任? 3. Webアプリの処理を特定する 4. 改善ループ 5. よくある問題処理とその対処
Slide 79
Slide 79 text
4. 改善ループ
Slide 80
Slide 80 text
ボトルネックどれ? Library読込 Routing DBクエリー APIコール DB クエリー2 300msec 250msec 3000msec 1500msec
Slide 81
Slide 81 text
ボトルネックどれ? Library読込 Routing DBクエリー APIコール DB クエリー2 300msec 250msec 3000msec 1500msec これ?
Slide 82
Slide 82 text
ボトルネックどれ? Library読込 Routing DBクエリー APIコール DB クエリー2 300msec 250msec 3000msec 1500msec 絶対コレ
Slide 83
Slide 83 text
ボトルネックから 目を逸らすな!!!
Slide 84
Slide 84 text
大切なことなのでもう一度
Slide 85
Slide 85 text
ボトルネックから 目を逸らすな!!!
Slide 86
Slide 86 text
ボトルネックは ボトルネックだからボトルネック
Slide 87
Slide 87 text
ボトルネックどれ? Library読込 Routing DBクエリー APIコール DB クエリー2 300msec 250msec 3000msec 1500msec 絶対コレ
Slide 88
Slide 88 text
改善1 Library読込 Routing DB クエリー APIコール DB クエリー2 300msec 250msec 1700msec 200msec
Slide 89
Slide 89 text
ボトルネックどこ? Library読込 Routing DB クエリー APIコール DB クエリー2 300msec 250msec 1700msec 200msec 絶対コレ
Slide 90
Slide 90 text
改善2 Library読込 Routing コール DB クエリー2 150 250msec API DB クエリー 1550msec 200msec
Slide 91
Slide 91 text
ボトルネックどれ? Library読込 Routing コール DB クエリー2 150 250msec API DB クエリー 1550msec 200msec 絶対コレ
Slide 92
Slide 92 text
改善3 Library読込 Routing API DB クエリー コール DB クエリー2 1400msec 200msec 150 100
Slide 93
Slide 93 text
特定 ▶ 改善 ▶ 特定 シンプルなループ
Slide 94
Slide 94 text
1. 全体を見る 2. Webアプリの責任? 3. Webアプリの処理を特定する 4. 改善ループ 5. よくある問題処理とその対処
Slide 95
Slide 95 text
5. よくある問題とその対処
Slide 96
Slide 96 text
その前に...
Slide 97
Slide 97 text
武器を手に入れておこう
Slide 98
Slide 98 text
https://speakerdeck.com/hanhan1978/complexity101-for-phper
Slide 99
Slide 99 text
https://speakerdeck.com/hanhan1978/study-cache-with-php
Slide 100
Slide 100 text
https://speakerdeck.com/hanhan1978/how-to-slow-laravel-php-con-2022
Slide 101
Slide 101 text
https://speakerdeck.com/hanhan1978/laravel-collection-time-complexity-2023
Slide 102
Slide 102 text
Webを支える技術 https://gihyo.jp/book/2010/978-4-7741-4204-3
Slide 103
Slide 103 text
サーバー/インフラを支える技術 https://gihyo.jp/book/2008/978-4-7741-3566-3
Slide 104
Slide 104 text
データ構造の知識 https://www.lambdanote.com/products/opendatastructures
Slide 105
Slide 105 text
ISUCON本 https://gihyo.jp/book/2022/978-4-297-12846-3
Slide 106
Slide 106 text
5. よくある問題とその対処
Slide 107
Slide 107 text
HTTPのAPIコール改善
Slide 108
Slide 108 text
HTTPのAPIコール改善
Slide 109
Slide 109 text
HTTPのAPIコール改善 性能以前の問題
Slide 110
Slide 110 text
HTTPのAPIコール改善 せめてタイムアウトを設定
Slide 111
Slide 111 text
HTTPのAPIコール改善 テストもやりやすくなる
Slide 112
Slide 112 text
HTTPのAPIコール改善 Cacheをつかうのも場合によってはアリ
Slide 113
Slide 113 text
メール送信の改善
Slide 114
Slide 114 text
メール送信の改善
Slide 115
Slide 115 text
メール送信の改善 SMTPが詰まる
Slide 116
Slide 116 text
メール送信の改善 キューで非同期送信
Slide 117
Slide 117 text
単純なデータ量の増加
Slide 118
Slide 118 text
単純なデータ量の増加
Slide 119
Slide 119 text
単純なデータ量の増加 徐々に処理速度が劣化していく
Slide 120
Slide 120 text
N+1クエリ
Slide 121
Slide 121 text
N+1クエリ
Slide 122
Slide 122 text
N+1クエリ relation経由でクエリ発行
Slide 123
Slide 123 text
N+1クエリ eager loading
Slide 124
Slide 124 text
N+1 Collection操作
Slide 125
Slide 125 text
N+1コレクション操作
Slide 126
Slide 126 text
N+1コレクション操作 O(n) x O(n)
Slide 127
Slide 127 text
N+1コレクション操作 O(n) x O(1)
Slide 128
Slide 128 text
Attribute Castingの負荷
Slide 129
Slide 129 text
Attribute Castingの負荷
Slide 130
Slide 130 text
Attribute Castingの負荷 この瞬間に Carbonが生成
Slide 131
Slide 131 text
Attribute Castingの負荷 生成処理を行わない
Slide 132
Slide 132 text
どれだけ手札を持っているかがチューニング成 功のカギです。知識こそパワー! ● データ構造・アルゴリズムの変更 ● キャッシュ ● 非同期化 ● スケールアップ・スケールアウト
Slide 133
Slide 133 text
仕様変更も強力な手段であることを忘れずに ● 求められてない情報の演算 ● 画面遷移の工夫による負荷分散 ● 処理全体をバッチ化 あまりにも難しい処理は根本から無くす
Slide 134
Slide 134 text
最後に… チューニングとは、全体を見ながら少しずつ少 しずつ原因を特定していくプロセスです。 泥臭く追い込んでいく一連の作業をやってみる と、Webアプリの理解がさらに深まります。
Slide 135
Slide 135 text
最後に大切なことなのでもう一度だけ...
Slide 136
Slide 136 text
ボトルネックから 目を逸らすな!!!