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
1.8k
計測ことはじめ 〜アプリケーションを知るために〜 / 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
AWS Lambdaから始まった Serverlessの「熱」とキャリアパス / It started with AWS Lambda Serverless “fever” and career path
seike460
PRO
1
260
とにかくAWS GameDay!AWSは世界の共通言語! / Anyway, AWS GameDay! AWS is the world's lingua franca!
seike460
PRO
1
860
実践サーバーレスパフォーマンスチューニング ~その実力に迫る~ / Practical Serverless Performance Tuning ~A Close Look at its Power~
seike460
PRO
2
320
PHPを書く理由、PHPを書いていて良い理由 / Reasons to write PHP and why it is good to write PHP
seike460
PRO
5
560
AWS CDKを用いたセキュアなCI/CDパイプラインの構築 / Build a secure CI/CD pipeline using AWS CDK
seike460
PRO
3
700
いまあるチームにフィットさせる Serverless そして Platform Engineeringへの挑戦 / Serverless Fits the Team You Have and Platform Engineering
seike460
PRO
2
1.9k
いまあるチームにフィットさせる Serverless / Serverless fits in with the team you have now.
seike460
PRO
2
170
地方こそサーバーレス! チームにフィットさせるサーバーレス / Rural areas are serverless! Serverless to Fit Your Team
seike460
PRO
1
110
AWS X-Rayを利用したサーバーレスのパフォーマンス分析 / Serverless performance analysis using AWS X-Ray
seike460
PRO
2
170
Other Decks in Programming
See All in Programming
.NET のための通信フレームワーク MagicOnion 入門 / Introduction to MagicOnion
mayuki
1
1.4k
『ドメイン駆動設計をはじめよう』のモデリングアプローチ
masuda220
PRO
8
540
Outline View in SwiftUI
1024jp
1
320
Amazon Qを使ってIaCを触ろう!
maruto
0
400
What’s New in Compose Multiplatform - A Live Tour (droidcon London 2024)
zsmb
1
470
Duckdb-Wasmでローカルダッシュボードを作ってみた
nkforwork
0
120
現場で役立つモデリング 超入門
masuda220
PRO
15
3.2k
距離関数を極める! / SESSIONS 2024
gam0022
0
280
카카오페이는 어떻게 수천만 결제를 처리할까? 우아한 결제 분산락 노하우
kakao
PRO
0
110
2024/11/8 関西Kaggler会 2024 #3 / Kaggle Kernel で Gemma 2 × vLLM を動かす。
kohecchi
5
910
3 Effective Rules for Using Signals in Angular
manfredsteyer
PRO
1
100
PHP でアセンブリ言語のように書く技術
memory1994
PRO
1
170
Featured
See All Featured
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
44
2.2k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
16
2.1k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
65k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
How STYLIGHT went responsive
nonsquared
95
5.2k
Into the Great Unknown - MozCon
thekraken
32
1.5k
Typedesign – Prime Four
hannesfritz
40
2.4k
Rails Girls Zürich Keynote
gr2m
94
13k
How GitHub (no longer) Works
holman
310
140k
Code Reviewing Like a Champion
maltzj
520
39k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
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 ユーザジャーニー ユーザーの行動の可視化