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
3
4.4k
Laravel を低速化する技術 / how to slow laravel
低速化を学ぶことで、高速化を学ぶ
Ryo Tomidokoro
September 24, 2022
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
100分で本番デプロイ!Laravelで作るWebアプリケーション作成/100min_web_app_cicd
hanhan1978
1
53
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
6
1.9k
集中して作業する技術/how_to_work_deeply
hanhan1978
62
46k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
11
9.7k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
3.8k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
4.9k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
5
2.1k
PHPで学ぶ Session の基本と応用 / web-app-session-101-2024
hanhan1978
13
5.7k
レガシー回避のPHP開発術/avoid_php_legacy
hanhan1978
17
13k
Other Decks in Programming
See All in Programming
How mixi2 Uses TiDB for SNS Scalability and Performance
kanmo
40
15k
PHP ステートレス VS ステートフル 状態管理と並行性 / php-stateless-stateful
ytake
0
110
CDK開発におけるコーディング規約の運用
yamanashi_ren01
2
180
DRFを少しずつ オニオンアーキテクチャに寄せていく DjangoCongress JP 2025
nealle
2
170
『GO』アプリ データ基盤のログ収集システムコスト削減
mot_techtalk
0
130
プログラミング言語学習のススメ / why-do-i-learn-programming-language
yashi8484
0
140
時計仕掛けのCompose
mkeeda
1
310
Serverless Rust: Your Low-Risk Entry Point to Rust in Production (and the benefits are huge)
lmammino
1
140
AIの力でお手軽Chrome拡張機能作り
taiseiue
0
180
バッチを作らなきゃとなったときに考えること
irof
0
400
Boost Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
490
GAEログのコスト削減
mot_techtalk
0
120
Featured
See All Featured
Six Lessons from altMBA
skipperchong
27
3.6k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
133
33k
Unsuck your backbone
ammeep
669
57k
Faster Mobile Websites
deanohume
306
31k
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.5k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7.1k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
45
9.4k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
114
50k
Embracing the Ebb and Flow
colly
84
4.6k
Adopting Sorbet at Scale
ufuk
74
9.2k
Making the Leap to Tech Lead
cromwellryan
133
9.1k
Why Our Code Smells
bkeepers
PRO
336
57k
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