Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
計測ことはじめ 〜アプリケーションを知るために〜 / Introduction to Meas...
Search
shiro seike
PRO
April 10, 2022
Programming
4
2.3k
計測ことはじめ 〜アプリケーションを知るために〜 / Introduction to Measurement - To know the application
https://phperkaigi.jp/2022/
shiro seike
PRO
April 10, 2022
Tweet
Share
More Decks by shiro seike
See All by shiro seike
歴史から学ぶ「Why PHP?」 PHPを書く理由を改めて理解する / Learning from History: “Why PHP?” Rediscovering the Reasons for Writing PHP
seike460
PRO
0
340
Team-First Serverless Platform Engineering Approach to PHP Applications with Laravel and Bref
seike460
PRO
0
55
なぜ適用するか、移行して理解するClean Architecture 〜構造を超えて設計を継承する〜 / Why Apply, Migrate and Understand Clean Architecture - Inherit Design Beyond Structure
seike460
PRO
3
990
生成AIコーディングとの向き合い方、AIと共創するという考え方 / How to deal with generative AI coding and the concept of co-creating with AI
seike460
PRO
1
480
地方のPHPerもクラウドを使う理由 ~コストの最適化とチームに向き合う~ / Why even local PHPers use the cloud ~optimize costs and face the team
seike460
PRO
0
93
OpenTelemetryで始めるベンダーフリーなobservability / Vendor-free observability starting with OpenTelemetry
seike460
PRO
0
240
AIコーディングの本質は“コード“ではなく“構造“だった / The essence of AI coding is not “code” but "structure
seike460
PRO
2
1.3k
OpenTelemetryを活用したObservability入門 / Introduction to Observability with OpenTelemetry
seike460
PRO
2
1k
Amazon Q Developer Proで効率化するAPI開発入門
seike460
PRO
0
500
Other Decks in Programming
See All in Programming
開発者から情シスまで - 多様なユーザー層に届けるAPI提供戦略 / Postman API Night Okinawa 2026 Winter
tasshi
0
210
プロダクトオーナーから見たSOC2 _SOC2ゆるミートアップ#2
kekekenta
0
220
責任感のあるCloudWatchアラームを設計しよう
akihisaikeda
3
180
IFSによる形状設計/デモシーンの魅力 @ 慶應大学SFC
gam0022
1
310
AIエージェントのキホンから学ぶ「エージェンティックコーディング」実践入門
masahiro_nishimi
5
580
今こそ知るべき耐量子計算機暗号(PQC)入門 / PQC: What You Need to Know Now
mackey0225
3
380
なぜSQLはAIぽく見えるのか/why does SQL look AI like
florets1
0
480
Claude Codeと2つの巻き戻し戦略 / Two Rewind Strategies with Claude Code
fruitriin
0
140
なるべく楽してバックエンドに型をつけたい!(楽とは言ってない)
hibiki_cube
0
140
QAフローを最適化し、品質水準を満たしながらリリースまでの期間を最短化する #RSGT2026
shibayu36
2
4.4k
AWS re:Invent 2025参加 直前 Seattle-Tacoma Airport(SEA)におけるハードウェア紛失インシデントLT
tetutetu214
2
120
dchart: charts from deck markup
ajstarks
3
1k
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.2k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
30 Presentation Tips
portentint
PRO
1
220
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
420
Fireside Chat
paigeccino
41
3.8k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
240
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
150
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.6k
The Cult of Friendly URLs
andyhume
79
6.8k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.3k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
3.9k
Transcript
計測ことはじめ 〜アプリケーションを知るために〜 PHPerKaigi 2022 2022.4.10 清家史郎 1
推測するな、計測せよ データはすべてを決定づける 推測による行動を行うのではなく、 計測した「データ」を元に原因を特定して、対策を講じる 2
自己紹介 清家 史郎 @seike460 - ID - GitHub:seike460 - Twitter:@seike460
- Work at - 株式会社 Fusic (フュージック) 事業本部/技術開発第一部門 - チームリーダー/エバンジェリスト/プリンシパルエンジニア - Skill - PHP/Go/AWS - Personal - Fukuoka.php Organizer - 46fm パーソナリティ 3
Yagula リリースしました! 4
Agenda 5 1. 計測ことはじめ 2. 計測対象 3. 計測実践 4. まとめ
5. AppIndex
01 計測ことはじめ
計測ことはじめ 7 計測とは 対象をあらゆる尺度から数値化して、数値化したものをもとに判定をすること Webシステムにおける計測とは アプリケーションをあらゆる角度から数値化して、数値化したものをもとに判定をすること アプリケーションを理解し、改善に繋げる
再現性のある計測 8 再現性 何度行っても同じ結果、判断が得られる事が重要 プログラマーにおける経験に頼らない対応を行う 可視化 自分たちが理解しやすい形に変換することで、 特に難しい判断の部分の負荷を下げる
計測で解消すべき事象 9 パフォーマンス 正常系としてアプリケーションは動作するが、パフォーマンスの問題がある アプリケーションの価値に直結する リソース効率 必要以上にサーバーリソースを消費してしまい、高いスペックを必要としている サーバーリソースの柔軟性が高い昨今では、コストメリットに繋がる 問題の可視化・特定 データ量の多さから認識出来ていなかった問題を認識する
エンジニアの知識量、経験に頼った判断の難易度を下げる
02 計測対象
Webアプリケーションにおける計測対象 11 - Webサーバー - スループット - PHP(アプリケーションサーバー) -
データベースサーバー - フロントエンド
Webサーバー 12 Webサーバー - 静的ファイルへのリクエスト数からキャッシュすべきファイルの特定 アクセスされたURLのランキングや時間分布などから 認識が難しい対処すべき問題の優先度を判断が可能
スループット 13 スループット - ネットワークの外側から、アプリケーションの応答速度の計測 バーストアクセス発生時のアプリケーションの限界や、 限界を決めるボトルネックになるサーバーの特定に繋がる
PHP(アプリケーションサーバー) 14 PHP(アプリケーションサーバー) - プロファイラを使うことでPHPの処理を計測して可視化 特に認識の難しい関数レベルでの処理効率を認識することで、 パフォーマンスとリソース効率両方の改善が可能
データベースサーバー 15 データベースサーバー - スローログにて遅いSQLの特定後、 対象SQLのEXPLAIN結果を計測することで、 DB Indexの不備やそもそものSQL改善に繋げる
フロントエンド 16 フロントエンド - 各種リソースの不適切な容量での配信やフロントエンドから検知可能な問題の特定 - アクセシビリティやSEOなどのフロントエンドにおける適切な状態をチェック
03 計測実践
サービス利用
SaaS 19
クラウドサービス 20
今回は自分たちで出来ることを考える 21
Webサーバー
アクセスログの解析 23 まずは実世界の事象に対する計測を行うため 実際のアクセスログに対する解析を行います ここではApacheでもNginxでも簡単に可視化できる「GoAccess」を利用します。 https://goaccess.io
アクセスログの解析 24 状況理解に以下の指標を利用 - リクエストされたURL - 静的ファイルリクエスト数 - 時間分布
- HTTPステータスコード リクエストの多い静的ファイルに対するファイルのキャッシュ戦略立案や、 システム利用が多い時間帯の特定などに利用します。 リクエストされたURLをもとに、負荷テストを行うべき URLも特定できます。
スループット計測
スループット計測 26 スループット計測はLocustを利用します。 https://locust.io Python製ではありますが簡単なスクリプトでログインなどの処理も可能で ネットワークの外側から少しづつ負荷を上昇させることが出来るます。 簡単にWebアプリケーションのスループットの閾値を測定することが出来ます。
サーバーリソースの確認 27 リクエストを徐々に増やしてスループットの閾値に到達した際に、 閾値を決定づけるボトルネックになっているサーバを探します。 サーバーの特定には各サーバのリソース状況を参照します。 可能ならAmazon CloudWatchなどのメトリクスを計測できる 外部サービスを利用します。今回はできる限り低負荷のコマンドを駆使します。 -
処理待ち状況、CPUの負荷 - ディスクの負荷 - メモリの負荷
処理待ち状況、CPUの負荷 28 サーバの処理待ちの状況を確認するにはLoad Averageを確認します。 初期アプローチとしては処理コストが少ない「uptime」を使うのが適切です。 CPU状況も合わせて確認するには「htop」を使うと便利です。
CPUのコア数以上の処理待ちがある場合、 そのサーバーがボトルネックになっている可能性が高いです。
メモリの負荷 29 メモリを100%使い切っている場合、スワップメモリを利用することになります。 スワップメモリは、ディスクをメモリ領域として確保して利用する為、 実質ディスクI/Oを発生させる事になります。 ディスクは非常に低速なデータ領域なのでボトルネックになる可能性が高いです。
「htop」や「vmstat」でスワップメモリの状況を確認出来ます。
ディスクI/Oの状況 30 ディスクはデータの読み書きをする上で、一番低速な機器となります。 ディスクI/Oが大きい時は、パフォーマンス劣化の原因になっている事が多いです。 「vmstat」でディスクの読み込み、書き込みを確認する事が出来ます(bi / bo)
PHPプロファイリング
PHPのパフォーマンス測定 32 負荷が高そうなURLの特定ができた場合、URLにて動作する PHPのどの関数で問題が発生しているのかをプロファイラーを用いて確認します。 OSSになっているXdebugが比較的気軽に導入することが出来ます。 https://xdebug.org
Xdebug x qcachegrind 33 Xdebugにてプロファイルcachegrind.outを取得します。 具体的な利用方法はこちらの記事をご確認ください。[tech.fusic.co.jp xdebug]で検索 こちらのプロファイルを「qcachegrind」に読み込ませます。 すると右図の用に図が生成出来ます。
- どの関数から呼び出されているか - 処理を専有している関数 - 繰り返し実行されている回数
qcachegrind 34 Called 呼出し回数 Self 自身の実行時間
データベース 実行計画
遅いSQLの特定 36 PHPプロファイリングにて時間がかかっているのがRDB操作の関数であったり、 DBサーバのリソース枯渇している場合、RDBにボトルネックがあることがわかります その場合、まずはスロークエリログにて問題の特定を行います。 今回はPostgreSQLを使った流れを記述しますが、設定内容は以下の通りです。
- PostgreSQL - log_min_duration_statement - MySQL - slow_query_log、long_query_time、log_queries_not_using_indexes、slow_query_log_file
pgBadgerによるスロークエリ可視化 37 スロークエリが大量に発生する時は、pgBadgerなどのツールを使って可視化します。(MySQLはanemoeater) 図のようにスロークエリの可視化が出来ます。 必要な設定に本番運用時に負荷がかかる設定を含みますので 難しい場合はlog_min_duration_statementにより長い値を入れて本当に遅いSQLのみを抽出後 以下のログのような「duration: XxxxX ms」と記述されているログを探して対処します。 user=postgres,db=postgres
LOG: duration: 67.301 ms statement: create database phperkaigi;
SQLの実行計画 38 スロークエリログにより、遅いSQLの特定が行えたら 対象SQLに対して実行計画を見て計測していきます。 実行計画を見ていくのであれば、最終的にどこが問題になっているかを 自分で判断していく必要があります。
SQLの実行計画 39 https://github.com/simon-engledew/gocmdpev そこで実行計画の問題を可視化してくれるgocmdpevを使います。 こちらを利用すると、実際の問題点を可視化してくれる為 適切な対応が取りやすくなります。
フロントエンド
Lighthouse 41 フロントエンドの測定には Google Chromeの開発者ツール 標準の「Lighthouse」を利用
パフォーマンスの他にも、 アクセシビリティやSEOの 状況も計測出来ます。
実際のパフォーマンス問題 42 実際に問題が… - 画像サイズ - widthとheight 記述漏れ
残存事象だけで判断しなければならないわけではない 残された事象だけで、適切な判断を行うのは職人技 全エンジニアが職人になどなれるはずがない 何よりも頼りになる「データ」収集、計測して原因を特定し、 適切な優先順位をもとに対策を講じる 43
まとめ Point 3 様々なOSSを利用することで、作業のコストだけで計測を始める事が出来ます。 44 推測するな、計測せよ。再現性のある対策を行いましょう。 Point 1 Point
4 データの収集と計測、適切なステップを踏んで対処を行う 鍵は可視化。難しい判断の部分の負荷を下げましょう。 Point 2
ご清聴いただきありがとうございました Thank You We are Hiring ! https://recruit.fusic.co.jp/
Appendix 05
CloudWatch (リソース計測) 47 メトリクスデータを取得 負荷がかかっているサーバーの 負荷を増やさずに計測が可能 -
CPUの使用率 - ディスクのI/O
RDS Performance Insights(DB計測) 48 RDS(DB)パフォーマンス可視化 どのオペレーションに 時間がかかっているかを計測可能 - 各オペレーションコスト
- Insert - Update - Delete - fetch
RDS Performance Insights 49 スロークエリログのように特に負荷がかかっているSQLの抽出を行ってくれる こちらをひたすら解決すれば、パフォーマンスの改善が見込める
CloudWatch RUM(フロントエンド) ウェブバイタル 50 ウェブバイタル レイテンシー状況の可視化
ページロードのステップ(httpsサイト) 51 ページロードのステップ どこのステップで時間がかかっているかを可視化
ユーザジャーニー 52 ユーザジャーニー ユーザーの行動の可視化