Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Laravel を低速化する技術 / how to slow laravel
Search
Ryo Tomidokoro
September 24, 2022
Programming
5.6k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Laravel を低速化する技術 / how to slow laravel
低速化を学ぶことで、高速化を学ぶ
Ryo Tomidokoro
September 24, 2022
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
2.5k
あるアーキテクチャ決定と その結果/architecture-decision-and-its-result
hanhan1978
2
1.8k
開発者が知っておきたい複雑さの正体/where-the-complexity-comes-from
hanhan1978
8
3.9k
Spec Driven Development入門/spec_driven_development_for_learners
hanhan1978
2
2k
フロントエンドがTypeScriptなら、バックエンドはPHPでもいいじゃない/php-is-not-bad
hanhan1978
8
14k
どうすると生き残れないのか/how-not-to-survive
hanhan1978
17
15k
100分で本番デプロイ!Laravelで作るWebアプリケーション作成/100min_web_app_cicd
hanhan1978
1
300
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
8
4k
集中して作業する技術/how_to_work_deeply
hanhan1978
69
62k
Other Decks in Programming
See All in Programming
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
1
340
What We Talk About When We Talk About XP
m_seki
2
660
Building an Out-of-Order CPU
latte72
1
790
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
250
アクセシビリティから考える情報設計
high_g_engineer
0
380
wkhtmltopdfの次どうするか問題2026
willnet
2
1.5k
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
700
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
290
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
210
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
370
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
150
Intent as Code
shoppingjaws
6
1k
Featured
See All Featured
How to Talk to Developers About Accessibility
jct
2
550
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
エンジニアに許された特別な時間の終わり
watany
109
250k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
600
Discover your Explorer Soul
emna__ayadi
2
1.3k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Between Models and Reality
mayunak
4
460
We Are The Robots
honzajavorek
0
380
A designer walks into a library…
pauljervisheath
211
25k
Designing Experiences People Love
moore
143
24k
RailsConf 2023
tenderlove
30
1.5k
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