Slide 1

Slide 1 text

Laravelで学ぶ Webアプリケーションチューニングの基本 Laravel Jp Conference 2019/02/16

Slide 2

Slide 2 text

自己紹介 名前 : 富所 亮 | Ryo Tomidokoro 職業 : Web Application Engineer 職歴 : SIer > 事業会社 > 受託 > 受託 所属 : Innovator Japan Inc. 主な出現場所 : PHP界隈の各種勉強会

Slide 3

Slide 3 text

諸注意 スライドはSpeakerDeckにアップ済みです。 写真はご自由に。でも周りに気をつけて…

Slide 4

Slide 4 text

はじめに

Slide 5

Slide 5 text

本トークの内容 自分がいつもやっていることをまとめました 現場や個人開発でやったこと、本で読んで学んだこ とがベースになっています

Slide 6

Slide 6 text

いきなりですが質問です

Slide 7

Slide 7 text

パフォーマンスチューニング したことありますか?

Slide 8

Slide 8 text

経験者の方へ ご自身のやり方と比べて見てください 改善のヒントになったら幸いです

Slide 9

Slide 9 text

未経験者の方へ チューニングは職人芸ではない やることが分かれば怖くない

Slide 10

Slide 10 text

本トークの目指すところ 特にチューニングの経験が浅い方にとって まず何をどうしてよいか分からない!?という状態 を解消することに重点を置いています。

Slide 11

Slide 11 text

基本的なことを再確認することで パフォーマンスチューニングでやるべきことが明確 になることを期待しています。

Slide 12

Slide 12 text

ついでに Laravelが持つ基本的な機能がどのようなケースで 役立つのかを紹介します 必要十分な機能がすでに備わっています

Slide 13

Slide 13 text

アウトライン 1. 全体を見る 2. パフォーマンスを科学する 3. ウェブアプリの責任? 4. サーバーメトリクスを確認する 5. ウェブアプリの処理を特定する 6. プロファイリングする 7. 改善ループを回す 8. よくある問題処理とその対処

Slide 14

Slide 14 text

1. 全体を見る 2. パフォーマンスを科学する 3. ウェブアプリの責任? 4. サーバーメトリクスを確認する 5. ウェブアプリの処理を特定する 6. プロファイリングする 7. 改善ループを回す 8. よくある問題処理とその対処

Slide 15

Slide 15 text

1. 全体を見る

Slide 16

Slide 16 text

遅いとは? とても曖昧な言葉。 私の「遅い」と あなたの「遅い」は比較出来ない 「遅い」は主観、個人差がある。

Slide 17

Slide 17 text

曖昧な意見 「うちのウェブアプリケーション遅くない?」

Slide 18

Slide 18 text

問題を提起しているように見えて何もかもが曖昧で 分からない このような「遅い」では改善が行えない。

Slide 19

Slide 19 text

具体的な意見 「弊社のウェブアプリは  平日18:00〜19:00の時間帯で  通常よりも500msec応答速度が遅い」

Slide 20

Slide 20 text

コンテキストや数値が説明されることで、具体的な 状況が浮彫になってくる こういう「遅い」は改善につながる

Slide 21

Slide 21 text

まず、曖昧な「遅い」を数値で表せる「遅い」に変換 する必要があります。 「推測するな計測せよ」の世界です。

Slide 22

Slide 22 text

状況が分かったとして、何が原因で「遅い」発生して いるかは分かりません。 原因究明のために、ウェブアプリに関わる全体をみ る必要があります。

Slide 23

Slide 23 text

ウェブアプリケーションは どのようにしてブラウザに表示されるのか?

Slide 24

Slide 24 text

ウェブアプリケーションの全体像 ネットワークはなぜつながるのか? - 戸根勤(日経BP社) P10

Slide 25

Slide 25 text

自分の領域の狭さを知る Laravel

Slide 26

Slide 26 text

アンコントローラブルな領域 ウェブアプリだけでは改善できない領域が沢山ある そもそもウェブアプリが「遅い」の原因なのかも分か らない

Slide 27

Slide 27 text

遅いの原因をつきとめる なんとなくアタリをつけてはいけない エンジニアとして科学的に突き止める必要があるが ‥どうする?

Slide 28

Slide 28 text

1. 全体を見る 2. パフォーマンスを科学する 3. ウェブアプリの責任? 4. サーバーメトリクスを確認する 5. ウェブアプリの処理を特定する 6. プロファイリングする 7. 改善ループを回す 8. よくある問題処理とその対処

Slide 29

Slide 29 text

2. パフォーマンスを科学する

Slide 30

Slide 30 text

「遅い」の考え方

Slide 31

Slide 31 text

レイテンシー 任意の状態から、任意の状態まで 待つためにかかった時間を計測した値 例) HTTPのリクエストからレスポンスまで DBのクエリ送信からデータ受信まで 詳解システム・パフォーマンス Brendan Gregg 西脇靖紘 長尾高弘(オライリー・ジャパン)

Slide 32

Slide 32 text

ウェブアプリ全体のレイテンシー ユーザー側 ネットワーク プロバ イダ プロバ イダ 光ファイバー等 サーバー側 ネットワーク

Slide 33

Slide 33 text

レイテンシーの中身をみて、ウェブアプリ単体のレス ポンスタイムがボトルネックで無い場合 ウェブアプリ以外で対処する方が効率が良い

Slide 34

Slide 34 text

例えば大陸間のネットワーク通信 速度制限のかかった格安SIM 共有LAN内の輻輳 ウェブアプリ以外の遅さ

Slide 35

Slide 35 text

EC2で試してみる

Slide 36

Slide 36 text

Tokyo vs USA Tokyo Region Ubuntu 16.06 LTS N. Virginia Region Ubuntu 16.06 LTS

Slide 37

Slide 37 text

東京のブラウザからアクセス Tokyo N. Virginia

Slide 38

Slide 38 text

大陸間の移動でかかる時間 アメリカ大陸まで +200msec ウェブアプリケーションでは改善できない! CDN等のソリューションが必要

Slide 39

Slide 39 text

1. 全体を見る 2. パフォーマンスを科学する 3. ウェブアプリの責任? 4. サーバーメトリクスを確認する 5. ウェブアプリの処理を特定する 6. プロファイリングする 7. 改善ループを回す 8. よくある問題処理とその対処

Slide 40

Slide 40 text

3. ウェブアプリの責任?

Slide 41

Slide 41 text

全体のレイテンシーの中でサーバー側ネットワーク の占める割合が大きい場合 ウェブアプリをチューニングすることで得られる可能 性が高い ユーザー側 ネットワーク プロバ イダ プロバ イダ 光ファイ バー等 サーバー側 ネットワーク

Slide 42

Slide 42 text

レイテンシーにおけるウェブアプリ単体の占める時 間は、ウェブサーバーが記録する「レスポンスタイ ム」で知ることが出来る

Slide 43

Slide 43 text

レスポンスタイム 各ウェブサーバーはログにレスポンスタイムを出力 することが出来る。 Apache : %D Nginx : $request_time H2O : duration

Slide 44

Slide 44 text

ウェブアプリ単体のレイテンシー サーバー側ネットワーク ウェブサーバーのレスポンスタイム その他通信

Slide 45

Slide 45 text

ウェブアプリ全体のレイテンシーを確認して、ウェブ アプリ単体の応答時間に原因があると分かって、は じめて ウェブアプリのチューニングを開始できる。

Slide 46

Slide 46 text

しかし、ウェブアプリ単体のレスポンスが悪かったと して、本当にウェブアプリが悪いのでしょうか? その「遅さ」はウェブアプリの責任?

Slide 47

Slide 47 text

1. 全体を見る 2. パフォーマンスを科学する 3. ウェブアプリの責任? 4. サーバーメトリクスを確認する 5. ウェブアプリの処理を特定する 6. プロファイリングする 7. 改善ループを回す 8. よくある問題処理とその対処

Slide 48

Slide 48 text

4. サーバーメトリクスを見る

Slide 49

Slide 49 text

ウェブアプリ以外の原因 同一サーバー上で動く他のプロセスがリソースを消 費しているケースがある 例)誰かが閉じ忘れたemacsのプロセスが100%で張 り付いてた…とか

Slide 50

Slide 50 text

原因を探るための指標 メモリ使用量、CPU使用率、ディスクIO、ネットワーク IO etc… 継続的な測定が基本。中長期の傾向値が無いと判 断がしづらい

Slide 51

Slide 51 text

測定ツール sysstatパッケージ ホスティングが提供するツール (CloudWatch) SaaSの監視ツール (Mackerel) インストール型の測定ツール (netdata)

Slide 52

Slide 52 text

sysstatパッケージ sar, pidstat, dstat ...

Slide 53

Slide 53 text

Mackerel

Slide 54

Slide 54 text

netdata

Slide 55

Slide 55 text

ボトルネックを特定する この段階では、プロセス単位でのCPU使用率、メモ リ使用量などから、どのプロセスがボトルネックに なっているのかを特定 一個ずつ一個ずつ、原因を絞り込んでいく

Slide 56

Slide 56 text

ついにウェブアプリが原因らしいということが分かっ た じゃあ、次は何をしたらいい?

Slide 57

Slide 57 text

1. 全体を見る 2. パフォーマンスを科学する 3. ウェブアプリの責任? 4. サーバーメトリクスを確認する 5. ウェブアプリの処理を特定する 6. プロファイリングする 7. 改善ループを回す 8. よくある問題処理とその対処

Slide 58

Slide 58 text

5. ウェブアプリの処理を特定する

Slide 59

Slide 59 text

ウェブアプリのどの処理が原因なのか? どうやったら分かるのか? この段階では 「PHPのプログラムが原因らしい」 としか分かっていない。

Slide 60

Slide 60 text

レスポンスタイムから探す ウェブサーバーのログから、レスポンスタイムが遅 いURLを探す awk, alp, kataribe等を使って簡単に解析できる

Slide 61

Slide 61 text

alpの例

Slide 62

Slide 62 text

ウェブ系ツールを頼る 自分はNew Relicしか使ったことないのですが、簡単 にボトルネックのURLや処理を特定することができ ます。

Slide 63

Slide 63 text

New Relicの例

Slide 64

Slide 64 text

1. 全体を見る 2. パフォーマンスを科学する 3. ウェブアプリの責任? 4. サーバーメトリクスを確認する 5. ウェブアプリの処理を特定する 6. プロファイリングする 7. 改善ループを回す 8. よくある問題処理とその対処

Slide 65

Slide 65 text

6. プロファイリングする

Slide 66

Slide 66 text

プロファイリング? コード実行時にどの処理にどのくらいの時間がか かっているのかを計測したもの と、言葉で言われてもピンとこないので実例を見た ほうが早い

Slide 67

Slide 67 text

blackfire.ioの例

Slide 68

Slide 68 text

その他のツール Xdebug Xhprof tideways 他にもありそうです…

Slide 69

Slide 69 text

処理が特定できて、プロファイラーの結果が取得で きたら、チューニングの準備がようやく整ったことに なる ここから、ウェブアプリ単体のレイテンシーについて 考えていく段階になる

Slide 70

Slide 70 text

1. 全体を見る 2. パフォーマンスを科学する 3. ウェブアプリの責任? 4. サーバーメトリクスを確認する 5. ウェブアプリの処理を特定する 6. プロファイリングする 7. 改善ループを回す 8. よくある問題処理とその対処

Slide 71

Slide 71 text

7. 改善ループを回す

Slide 72

Slide 72 text

ウェブアプリ単体のレイテンシー レスポンス出力 APIコール Routing DBクエリー Library読込 例)

Slide 73

Slide 73 text

この先は、レイテンシーの中でボトルネックになって いる処理をチューニングしていく この先は 1. レイテンシー確認 2. ボトルネック改善 3. レイテンシー確認... を延々と繰り返す

Slide 74

Slide 74 text

改善ループ1

Slide 75

Slide 75 text

改善ループ1

Slide 76

Slide 76 text

理論上400msec程度のパフォーマンス改善が見込 める →仮に上手に改善できたとすると…

Slide 77

Slide 77 text

改善ループ2

Slide 78

Slide 78 text

改善ループ2

Slide 79

Slide 79 text

ボトルネックが他の処理に移ったことがわかる ここも改善することでさらに200msec →上手く改善すると...

Slide 80

Slide 80 text

改善ループ3

Slide 81

Slide 81 text

処理の特定さえ出来てしまえば、あとはTry&Errorを 繰り返すことでチューニングは達成することが出来 る。 処理の特定はプロファイラがやってくれる

Slide 82

Slide 82 text

1. 全体を見る 2. パフォーマンスを科学する 3. ウェブアプリの責任? 4. サーバーメトリクスを確認する 5. ウェブアプリの処理を特定する 6. プロファイリングする 7. 改善ループを回す 8. よくある問題処理とその対処

Slide 83

Slide 83 text

8. よくある問題とその対処

Slide 84

Slide 84 text

この先は、個別の象徴的なケースを例にとって、そ の対処法を説明します。 →Laravelにちょうどよい解決法があるものは[L] マークがついています!

Slide 85

Slide 85 text

HTTPのAPIコール 一回のリクエストで複数APIをコールするようになる と、途端に処理が遅くなる →更新頻度によってはCache [L] →自前APIであれば、専用APIにまとめてコール回 数を減らす →フロントのJSに移譲する

Slide 86

Slide 86 text

メール送信 SMTPとの通信は体感1secくらいかかる。複数メー ル送信がリクエストに同期的に書いてあると絶望的 に遅い →Queue [L]

Slide 87

Slide 87 text

Slack通知 これもメール送信と同じ。同期的な処理にしていると びっくりするほど遅くなります。 →Queue [L]

Slide 88

Slide 88 text

SQLクエリー実行 @soudai1025 のスライド見れば多分解決… 単発のクエリーが遅い場合は適切なDB設計と、イ ンデックス設計が効きます。 →SELECTであればCacheという手もあります。あま りオススメしませんが…[L]

Slide 89

Slide 89 text

リスト形式の表示で問題になるやつです。Laravelの relationをbladeから呼び出すと、カジュアルに大量 のクエリを発生させられます。 →eager loading [L] N+1クエリ

Slide 90

Slide 90 text

入れ子のLoopとか、1万件とかのforeachとか、常識 を外れた蛮行によるもの… Laravel Collectionの乱用なども… →レビューや内部勉強会で防ぐしかない… 計算量が無駄に多いプログラム

Slide 91

Slide 91 text

こちらにも詳しく書きました https://speakerdeck.com/hanhan1978/laravel-collectionfalseji-suan-liang-wodiao-betemita

Slide 92

Slide 92 text

色々、見てきましたが処理の遅いプログラムの チューニング方法は対処方法が2つくらいしか無 い。 ・アルゴリズムの変更 ・非同期化

Slide 93

Slide 93 text

チューニングとは、全体を見ながら少しずつ少しず つ原因を特定していくプロセスです。 泥臭く追い込んでいく一連の作業をやってみると、 ウェブアプリの理解がさらに深まります。 最後に…

Slide 94

Slide 94 text

参考資料 詳解システム・パフォーマンス Brendan Gregg 西脇靖紘 長尾高弘 オライリー・ジャパン ネットワークはなぜつながるのか? 戸根勤 日経BP社 サーバー・インフラを支える技術 伊藤 直也, 勝見 祐己, 田中 慎司, ひろせ まさあき, 安井 真伸, 横川 和哉 WEB+DB PRESS plus