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
Laravel を低速化する技術 / how to slow laravel
Search
Ryo Tomidokoro
September 24, 2022
Programming
2
3.9k
Laravel を低速化する技術 / how to slow laravel
低速化を学ぶことで、高速化を学ぶ
Ryo Tomidokoro
September 24, 2022
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
集中して作業する技術/how_to_work_deeply
hanhan1978
61
40k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
10
9.1k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
3.4k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
4.5k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
5
2k
PHPで学ぶ Session の基本と応用 / web-app-session-101-2024
hanhan1978
12
5.5k
レガシー回避のPHP開発術/avoid_php_legacy
hanhan1978
16
12k
Laravel Collectionの計算量を調べてみた2023/laravel_collection_time_complexity_2023
hanhan1978
1
1.4k
PHP で学ぶ Cache の距離の話 / study_cache_with_php
hanhan1978
7
2.1k
Other Decks in Programming
See All in Programming
Quine, Polyglot, 良いコード
qnighy
4
640
Less waste, more joy, and a lot more green: How Quarkus makes Java better
hollycummins
0
100
Arm移行タイムアタック
qnighy
0
310
Creating a Free Video Ad Network on the Edge
mizoguchicoji
0
120
イベント駆動で成長して委員会
happymana
1
320
シールドクラスをはじめよう / Getting Started with Sealed Classes
mackey0225
4
640
3 Effective Rules for Using Signals in Angular
manfredsteyer
PRO
0
110
最新TCAキャッチアップ
0si43
0
140
Jakarta EE meets AI
ivargrimstad
0
600
TypeScript Graph でコードレビューの心理的障壁を乗り越える
ysk8hori
2
1.1k
アジャイルを支えるテストアーキテクチャ設計/Test Architecting for Agile
goyoki
9
3.3k
TypeScriptでライブラリとの依存を限定的にする方法
tutinoko
2
660
Featured
See All Featured
For a Future-Friendly Web
brad_frost
175
9.4k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
Side Projects
sachag
452
42k
[RailsConf 2023] Rails as a piece of cake
palkan
52
4.9k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Bash Introduction
62gerente
608
210k
Building Your Own Lightsaber
phodgson
103
6.1k
Adopting Sorbet at Scale
ufuk
73
9.1k
Embracing the Ebb and Flow
colly
84
4.5k
Speed Design
sergeychernyshev
24
610
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
4
370
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
Transcript
@hanhan1978 Laravel を低速化する技術 PHP Conference 2022
@hanhan1978 • 名前 富所 亮 • ブログ https://blog.hanhans.net • Yokohama
North AM https://anchor.fm/yokohama-north-am • Youtube https://www.youtube.com/user/hanhans1978 2
Laravel は遅くて有名なのか? 3
4 どうも、遅いという評判はありそう
仕事上でも聞いたことがある... - WAF は遅い - 生 PHP が一番速い - ORM
は悪 5
Laravel は、なぜ採用される? - Webアプリに必要な一通りの機能 - 人気ゆえの情報量 - Rapid Application Development
6
Laravel は、なぜ採用される? - Webアプリに必要な一通りの機能 - 人気ゆえの情報量 - Rapid Application Development
7
(特に)新規開発 - 設定より規約 - ORM - Migration, Worker, Jobキュー 8
(特に)新規開発 - 設定より規約 - ORM - Migration, Worker, Jobキュー 9
仕様が次々に変化していく フェーズでは助かる
モノゴトにはトレードオフがある 10
開発速度が速いなら 動作は遅くてもいい? 11
遅いとは? 12
13 「遅い」は相対的な評価 https://speakerdeck.com/hanhan1978/web-application-tuning-guildline?slide=16
今回の発表における基準 - Webサイトのレスポンスタイム - 200 msec を超えたら「遅い」 14
• サンプルウェブアプリケーション • インフラ視点での低速化 • アプリケーション視点での低速化 • まとめ 目次 15
• サンプルウェブアプリケーション • インフラ視点での低速化 • アプリケーション視点での低速化 • まとめ 目次 16
17 某短文サイト風サンプル
テーブル定義書 18
データ量 19 10,000 1,000 250,000 50,000
マニュアルに忠実なソースコード 20
マニュアルに忠実なソースコード 21 名前からユーザーレコードを取得
マニュアルに忠実なソースコード 22 フォロワーを取得
マニュアルに忠実なソースコード 23 タイムラインに表示する投稿を取得
24 初期状態のパフォーマンス
25 初期状態のパフォーマンス マニュアル通りの作り方 -> 十分速くなってしまう....
速いのはローカル環境でしょ? 26 M2 Mac 24GB メモリだろ?
27 残念! EC2 でした!
EC2 + RDS - 運用費概算 1万円以内 - 十分な速度がでる - さすが
RAD 28 他社 VPS などなら 3000円以内 も夢ではない....
もっと遅くせねば! 29
高速化の指標 - AWS に siege とかするのはNG - ブラウザリクエスト で確認 -
初期状態 149ms 30
• サンプルウェブアプリケーション • インフラ視点での低速化 • アプリケーション視点での低速化 • まとめ 目次 31
【作戦1】Preload 無効化 32
33 7.4 から追加された機能 https://speakerdeck.com/hanhan1978/preload-and-jit?slide=41
34 詳しくは https://speakerdeck.com/hanhan1978/preload-and-jit
結果 35
【作戦1】Preload 無効化の結果 - 効果無し - 初期状態とほぼ変化なし 145 〜 150ms 36
【作戦1】Preload 無効化の結果 - 効果無し - 初期状態とほぼ変化なし 145 〜 150ms 37
CPUバウンドじゃない
【作戦2】JIT 無効化 38
39 8.0 から追加された機能 https://speakerdeck.com/hanhan1978/preload-and-jit?slide=66
40 詳しくは https://speakerdeck.com/hanhan1978/preload-and-jit
結果 41
【作戦2】Preload 無効化 - 効果無し - 初期状態とほぼ変化なし 140 〜 150ms 42
【作戦2】Preload 無効化 - 効果無し - 初期状態とほぼ変化なし 140 〜 150ms 43
CPUバウンドじゃない!!!
【作戦3】OPCache 無効化 44
45 5.5 から同梱された機能 https://speakerdeck.com/hanhan1978/preload-and-jit?slide=10
46 詳しくは https://speakerdeck.com/hanhan1978/preload-and-jit
結果 47
【作戦3】OPCache 無効化 - 効果は抜群 - 倍程度の性能劣化 250 〜 350ms 48
【作戦3】OPCache 無効化 - 効果抜群 - 倍程度の性能劣化 250 〜 350ms 49
手軽に +100〜200ms
【作戦4】Xdebug 有効化 50
Xdebugとは.... - 開発用のデバッグツール - ステップ実行したり - カバレッジ出したり 51
52 詳しくは https://speakerdeck.com/o0h/hello-xdebug
結果 53
【作戦4】Xdebug 有効化 - 効果抜群 - さらに性能劣化 350 〜 450ms 54
【作戦4】Xdebug 有効化 - 効果抜群 - さらに性能劣化 350 〜 450ms 55
何回か、本番で有効になってい るのを見た....
おまけ - ばれないように Region を 北米にするとか - RDSだけ ヨーロッパにするとか -
アイデアは色々 56
おまけ - ばれないように Region を 北米にするとか - RDSだけ ヨーロッパにするとか -
アイデアは色々 57 みんなも工夫してね!
58 大陸移動はコストがかかる https://speakerdeck.com/hanhan1978/web-application-tuning-guildline?slide=37
手軽なインフラ低速化はここまで 59
ここまでのまとめ - 500 msec 近くまでは到達 - もっと、目に見えて遅くしたい! 60
• サンプルウェブアプリケーション • インフラ視点での低速化 • アプリケーション視点での低速化 • まとめ 目次 61
【作戦5】Eager Loading 廃止 62
63 Eager Loading とは? https://laravel.com/docs/9.x/eloquent-relationships#eager-loading
64 Eager Loading とは? https://laravel.com/docs/9.x/eloquent-relationships#eager-loading N+1問題を解決してくれる
65 例えば https://laravel.com/docs/9.x/eloquent-relationships#eager-loading
66 例えば https://laravel.com/docs/9.x/eloquent-relationships#eager-loading Loopの1回ごとにSQL発行
67 With https://laravel.com/docs/9.x/eloquent-relationships#eager-loading 予めクエリをまとめて発行
結果 68
【作戦5】Eager Loading 廃止 - 費用対効果が高い(withを削除するだけ) - さらに性能劣化 1.02 〜 1.2s
69
【作戦5】Eager Loading 廃止 - 費用対効果が高い(withを削除するだけ) - さらに性能劣化 1.02 〜 1.2s
70 さらに倍!
【作戦6】Limit句 廃止 71
72 禁断の全件取得 https://laravel.com/docs/9.x/eloquent-relationships#eager-loading
73 禁断の全件取得 https://laravel.com/docs/9.x/eloquent-relationships#eager-loading 5万件ゲット
結果 74
【作戦6】Limit 句 廃止 - 会心の一撃 - さらに性能劣化 3.0 〜 3.5s
75
【作戦6】Limit 句 廃止 - 会心の一撃 - さらに性能劣化 3.0 〜 3.5s
76 MySQL は頑張ってる
【作戦7】Attribute Casting の悪用 77
Attribute Casting とは? - Eloquent Model が property アクセスする際に発火 -
DBのカラムに合わせて、property を型変換 78
79 公式マニュアル https://laravel.com/docs/9.x/eloquent-mutators#attribute-casting
80 一見なんともないコード
81 一見なんともないコード 裏で Carbon のインスタンス生 成が発火している
結果 82
【作戦7】Attribute Casting 悪用 - 会心の一撃 part 2 - さらに性能劣化 6.0
〜 6.5 s 83
【作戦7】Attribute Casting 悪用 - 会心の一撃 part 2 - さらに性能劣化 6.0
〜 6.5 s 84 見た目の素朴さが Good !!
• サンプルウェブアプリケーション • インフラ視点での低速化 • アプリケーション視点での低速化 • まとめ 目次 85
インフラ・初期設定は確認! - OPCache ON 超大事 - Xdebug OFF 超大事 86
実在しましたからね...
Laravel はそれほど遅くない - ある程度のデータ量に耐える機能がある - 公式ドキュメントにちゃんと書いてある 87
Laravel の注意点 - 便利機能は一歩間違えると痛恨の一撃 - 何でもなさそうなコードが問題を起こす 88
最後に - RAD フレームワークは、ちゃんとテストを書くこと! - コントローラー単位でメソッドは短く! - 変なことしても気づきやすいように! 89
おまけコンテンツ 90
適切なチューニングをした場合 91
設定 - OPCache ON - OPCache JIT ON - OPCache
Preload 使用 92
アプリケーション側 - ユーザーデータキャッシュ - お気に入り件数キャッシュ - 投稿記事検索結果キャッシュ 93 一切の DB
接続をAPCuでしのぐ
94 DB 接続をしない場合のレスポンス ほぼ、静的ページ
おまけコンテンツ2 95
N+1 が混入することを防ぐには? - 教育 - Laravel Debug Bar - N+1
detecter 96
97 Laravel Debug Bar https://github.com/barryvdh/laravel-debugbar 10越えたらチェック
インフラ周りのチェックどうする? - パターンは多くない - チェックリストを作っておくとよい - 特に OPCache は入れ忘れが多いので注意 98
99 php -m でチェック デフォルトでは入ってない
パフォーマンスの劣化にはどう気づく - 継続監視 - New Relic, Datadog - curl 使って
Slack 通知とかでも気づける - データ量に注意 100
101 性能劣化はデータ量に比例 https://www.techscore.com/blog/2016/08/08/開発新卒に捧ぐ、基本のアルゴリズムと計算量 /
102 教育
@hanhan1978 相談・指摘・その他 下記のTwitterアカウントにどうぞ 103