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
4k
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
41k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
10
9.4k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
3.6k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
4.7k
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.2k
Other Decks in Programming
See All in Programming
Security_for_introducing_eBPF
kentatada
0
110
これでLambdaが不要に?!Step FunctionsのJSONata対応について
iwatatomoya
2
3.6k
ブラウザ単体でmp4書き出すまで - muddy-web - 2024-12
yue4u
2
460
Symfony Mapper Component
soyuka
2
730
HTTP compression in PHP and Symfony apps
dunglas
2
1.7k
テストコード文化を0から作り、変化し続けた組織
kazatohiei
2
1.5k
useSyncExternalStoreを使いまくる
ssssota
6
1k
フロントエンドのディレクトリ構成どうしてる? Feature-Sliced Design 導入体験談
osakatechlab
8
4.1k
開発者とQAの越境で自動テストが増える開発プロセスを実現する
92thunder
1
180
KMP와 kotlinx.rpc로 서버와 클라이언트 동기화
kwakeuijin
0
140
見えないメモリを観測する: PHP 8.4 `pg_result_memory_size()` とSQL結果のメモリ管理
kentaroutakeda
0
330
テスト自動化失敗から再挑戦しチームにオーナーシップを委譲した話/STAC2024 macho
ma_cho29
1
1.3k
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
510
The Invisible Side of Design
smashingmag
298
50k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Testing 201, or: Great Expectations
jmmastey
40
7.1k
Faster Mobile Websites
deanohume
305
30k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
2
170
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
BBQ
matthewcrist
85
9.4k
Raft: Consensus for Rubyists
vanstee
137
6.7k
YesSQL, Process and Tooling at Scale
rocio
169
14k
Mobile First: as difficult as doing things right
swwweet
222
9k
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