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
4
4.7k
Laravel を低速化する技術 / how to slow laravel
低速化を学ぶことで、高速化を学ぶ
Ryo Tomidokoro
September 24, 2022
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
フロントエンドがTypeScriptなら、バックエンドはPHPでもいいじゃない/php-is-not-bad
hanhan1978
9
13k
どうすると生き残れないのか/how-not-to-survive
hanhan1978
17
14k
100分で本番デプロイ!Laravelで作るWebアプリケーション作成/100min_web_app_cicd
hanhan1978
1
170
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
8
2.8k
集中して作業する技術/how_to_work_deeply
hanhan1978
63
49k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
11
10k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
4.2k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
5.3k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
5
2.3k
Other Decks in Programming
See All in Programming
明示と暗黙 ー PHPとGoの インターフェイスの違いを知る
shimabox
2
480
LT 2025-06-30: プロダクトエンジニアの役割
yamamotok
0
730
『自分のデータだけ見せたい!』を叶える──Laravel × Casbin で複雑権限をスッキリ解きほぐす 25 分
akitotsukahara
2
630
#QiitaBash MCPのセキュリティ
ryosukedtomita
1
990
CursorはMCPを使った方が良いぞ
taigakono
1
250
テストから始めるAgentic Coding 〜Claude Codeと共に行うTDD〜 / Agentic Coding starts with testing
rkaga
11
3k
関数型まつりレポート for JuliaTokai #22
antimon2
0
160
プロダクト志向なエンジニアがもう一歩先の価値を目指すために意識したこと
nealle
0
130
PHPでWebSocketサーバーを実装しよう2025
kubotak
0
280
0626 Findy Product Manager LT Night_高田スライド_speaker deck用
mana_takada
0
160
Claude Code + Container Use と Cursor で作る ローカル並列開発環境のススメ / ccc local dev
kaelaela
5
2.4k
Azure AI Foundryではじめてのマルチエージェントワークフロー
seosoft
0
160
Featured
See All Featured
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
138
34k
Speed Design
sergeychernyshev
32
1k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
107
19k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Fireside Chat
paigeccino
37
3.5k
Designing for Performance
lara
610
69k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
The Cult of Friendly URLs
andyhume
79
6.5k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.4k
Testing 201, or: Great Expectations
jmmastey
42
7.6k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
20
1.3k
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