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 Measurement - To know the application
Search
shiro seike
PRO
April 10, 2022
Programming
3
1.6k
計測ことはじめ 〜アプリケーションを知るために〜 / 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
OpenAPIを中心に考えるAPI開発入門 / Introduction to API Development with a Focus on OpenAPI
seike460
PRO
2
170
PHP8.3の機能を振り返る / Review of PHP 8.3 features
seike460
PRO
1
110
フルサーバーレスアーキテクチャの運用を重ねた先に見える価値 / The value that can be seen beyond the operation of a full serverless architecture
seike460
PRO
0
23
決断するための勇気、そのためのBacklog / Courage to make decisions, Backlog for that.
seike460
PRO
4
2k
Backlog API x Generative AI
seike460
PRO
0
83
「サーバーレス」ってなんだろう みんなでワイガヤ談義 / What is "serverless?" Wigaya discussion with everyone
seike460
PRO
0
32
とにかくHTTP3をライトニングに話す / Anyway, I'll talk to Lightning about HTTP3.
seike460
PRO
0
130
PHP Serverless Pattern
seike460
PRO
0
12
こまけぇこたぁいいんだよ!! PHPWebアプリケーションを早くする、それだけだ / It doesn't matter how small it is! Make PHPWeb applications faster, that's all!
seike460
PRO
0
7
Other Decks in Programming
See All in Programming
Scalable Customer Journey Orchestration (CJO)
lewuathe
0
300
ADRを一年運用してみた/adr_after_a_year
hanhan1978
7
2.4k
Amazon SQSコンシューマー疎結合への旅 - 出張! #DevelopersIO IT技術ブログの中の人が語る勉強会 #3
quiver
0
270
2 週間で Twitter Bot を作ってみた
contour_gara
0
380
"config" ってなんだ? / What is "config"?
okashoi
0
240
スキーマ駆動開発による品質とスピードの両立 - 私達は何故、スキーマを書くのか
kentaroutakeda
0
170
CA.swift19 恋するAIアプリ開発の裏側
oskmr
0
360
Goのmultiple errorsについて (2024年4月版)
syumai
3
710
VSCodeでのDatabricks開発もお勧めしたい/I would also recommend Databricks development with VSCode.
kazumain
0
250
TCAとKMPを用いた新規動画配信アプリ 「ABEMA Live」の設計
tomu28
1
100
#phpcon_odawara オープン・クローズドなテストフィクスチャを求めて / open closed test fixtures
77web
3
230
ゆるい個人開発のススメ
kuroppe1819
10
990
Featured
See All Featured
WebSockets: Embracing the real-time Web
robhawkes
59
7k
A better future with KSS
kneath
231
16k
Into the Great Unknown - MozCon
thekraken
10
990
4 Signs Your Business is Dying
shpigford
175
21k
Gamification - CAS2011
davidbonilla
76
4.6k
The Invisible Customer
myddelton
114
12k
The Cost Of JavaScript in 2023
addyosmani
16
3.9k
The Art of Programming - Codeland 2020
erikaheidi
42
12k
A Philosophy of Restraint
colly
197
16k
Building Effective Engineering Teams - LeadDev
addyosmani
28
1.8k
Robots, Beer and Maslow
schacon
PRO
155
7.9k
What's new in Ruby 2.0
geeforr
337
31k
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 ユーザジャーニー ユーザーの行動の可視化