Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Laravel を低速化する技術 / how to slow laravel

Ryo Tomidokoro
September 24, 2022

Laravel を低速化する技術 / how to slow laravel

低速化を学ぶことで、高速化を学ぶ

Ryo Tomidokoro

September 24, 2022
Tweet

More Decks by Ryo Tomidokoro

Other Decks in Programming

Transcript

  1. @hanhan1978
    Laravel を低速化する技術
    PHP Conference 2022

    View full-size slide

  2. @hanhan1978
    ● 名前
    富所 亮
    ● ブログ
    https://blog.hanhans.net
    ● Yokohama North AM
    https://anchor.fm/yokohama-north-am
    ● Youtube
    https://www.youtube.com/user/hanhans1978
    2

    View full-size slide

  3. Laravel は遅くて有名なのか?
    3

    View full-size slide

  4. 4
    どうも、遅いという評判はありそう

    View full-size slide

  5. 仕事上でも聞いたことがある...
    - WAF は遅い
    - 生 PHP が一番速い
    - ORM は悪
    5

    View full-size slide

  6. Laravel は、なぜ採用される?
    - Webアプリに必要な一通りの機能
    - 人気ゆえの情報量
    - Rapid Application Development
    6

    View full-size slide

  7. Laravel は、なぜ採用される?
    - Webアプリに必要な一通りの機能
    - 人気ゆえの情報量
    - Rapid Application Development
    7

    View full-size slide

  8. (特に)新規開発
    - 設定より規約
    - ORM
    - Migration, Worker, Jobキュー
    8

    View full-size slide

  9. (特に)新規開発
    - 設定より規約
    - ORM
    - Migration, Worker, Jobキュー
    9
    仕様が次々に変化していく
    フェーズでは助かる

    View full-size slide

  10. モノゴトにはトレードオフがある
    10

    View full-size slide

  11. 開発速度が速いなら
    動作は遅くてもいい?
    11

    View full-size slide

  12. 遅いとは?
    12

    View full-size slide

  13. 13
    「遅い」は相対的な評価
    https://speakerdeck.com/hanhan1978/web-application-tuning-guildline?slide=16

    View full-size slide

  14. 今回の発表における基準
    - Webサイトのレスポンスタイム
    - 200 msec を超えたら「遅い」
    14

    View full-size slide

  15. ● サンプルウェブアプリケーション
    ● インフラ視点での低速化
    ● アプリケーション視点での低速化
    ● まとめ
    目次
    15

    View full-size slide

  16. ● サンプルウェブアプリケーション
    ● インフラ視点での低速化
    ● アプリケーション視点での低速化
    ● まとめ
    目次
    16

    View full-size slide

  17. 17
    某短文サイト風サンプル

    View full-size slide

  18. テーブル定義書
    18

    View full-size slide

  19. データ量
    19
    10,000 1,000
    250,000
    50,000

    View full-size slide

  20. マニュアルに忠実なソースコード
    20

    View full-size slide

  21. マニュアルに忠実なソースコード
    21
    名前からユーザーレコードを取得

    View full-size slide

  22. マニュアルに忠実なソースコード
    22
    フォロワーを取得

    View full-size slide

  23. マニュアルに忠実なソースコード
    23
    タイムラインに表示する投稿を取得

    View full-size slide

  24. 24
    初期状態のパフォーマンス

    View full-size slide

  25. 25
    初期状態のパフォーマンス
    マニュアル通りの作り方
    -> 十分速くなってしまう....

    View full-size slide

  26. 速いのはローカル環境でしょ?
    26
    M2 Mac 24GB メモリだろ?

    View full-size slide

  27. 27
    残念! EC2 でした!

    View full-size slide

  28. EC2 + RDS
    - 運用費概算 1万円以内
    - 十分な速度がでる
    - さすが RAD
    28
    他社 VPS などなら 3000円以内
    も夢ではない....

    View full-size slide

  29. もっと遅くせねば!
    29

    View full-size slide

  30. 高速化の指標
    - AWS に siege とかするのはNG
    - ブラウザリクエスト で確認
    - 初期状態 149ms
    30

    View full-size slide

  31. ● サンプルウェブアプリケーション
    ● インフラ視点での低速化
    ● アプリケーション視点での低速化
    ● まとめ
    目次
    31

    View full-size slide

  32. 【作戦1】Preload 無効化
    32

    View full-size slide

  33. 33
    7.4 から追加された機能
    https://speakerdeck.com/hanhan1978/preload-and-jit?slide=41

    View full-size slide

  34. 34
    詳しくは
    https://speakerdeck.com/hanhan1978/preload-and-jit

    View full-size slide

  35. 【作戦1】Preload 無効化の結果
    - 効果無し
    - 初期状態とほぼ変化なし 145 〜 150ms
    36

    View full-size slide

  36. 【作戦1】Preload 無効化の結果
    - 効果無し
    - 初期状態とほぼ変化なし 145 〜 150ms
    37
    CPUバウンドじゃない

    View full-size slide

  37. 【作戦2】JIT 無効化
    38

    View full-size slide

  38. 39
    8.0 から追加された機能
    https://speakerdeck.com/hanhan1978/preload-and-jit?slide=66

    View full-size slide

  39. 40
    詳しくは
    https://speakerdeck.com/hanhan1978/preload-and-jit

    View full-size slide

  40. 【作戦2】Preload 無効化
    - 効果無し
    - 初期状態とほぼ変化なし 140 〜 150ms
    42

    View full-size slide

  41. 【作戦2】Preload 無効化
    - 効果無し
    - 初期状態とほぼ変化なし 140 〜 150ms
    43
    CPUバウンドじゃない!!!

    View full-size slide

  42. 【作戦3】OPCache 無効化
    44

    View full-size slide

  43. 45
    5.5 から同梱された機能
    https://speakerdeck.com/hanhan1978/preload-and-jit?slide=10

    View full-size slide

  44. 46
    詳しくは
    https://speakerdeck.com/hanhan1978/preload-and-jit

    View full-size slide

  45. 【作戦3】OPCache 無効化
    - 効果は抜群
    - 倍程度の性能劣化 250 〜 350ms
    48

    View full-size slide

  46. 【作戦3】OPCache 無効化
    - 効果抜群
    - 倍程度の性能劣化 250 〜 350ms
    49
    手軽に +100〜200ms

    View full-size slide

  47. 【作戦4】Xdebug 有効化
    50

    View full-size slide

  48. Xdebugとは....
    - 開発用のデバッグツール
    - ステップ実行したり
    - カバレッジ出したり
    51

    View full-size slide

  49. 52
    詳しくは
    https://speakerdeck.com/o0h/hello-xdebug

    View full-size slide

  50. 【作戦4】Xdebug 有効化
    - 効果抜群
    - さらに性能劣化 350 〜 450ms
    54

    View full-size slide

  51. 【作戦4】Xdebug 有効化
    - 効果抜群
    - さらに性能劣化 350 〜 450ms
    55
    何回か、本番で有効になってい
    るのを見た....

    View full-size slide

  52. おまけ
    - ばれないように Region を 北米にするとか
    - RDSだけ ヨーロッパにするとか
    - アイデアは色々
    56

    View full-size slide

  53. おまけ
    - ばれないように Region を 北米にするとか
    - RDSだけ ヨーロッパにするとか
    - アイデアは色々
    57
    みんなも工夫してね!

    View full-size slide

  54. 58
    大陸移動はコストがかかる
    https://speakerdeck.com/hanhan1978/web-application-tuning-guildline?slide=37

    View full-size slide

  55. 手軽なインフラ低速化はここまで
    59

    View full-size slide

  56. ここまでのまとめ
    - 500 msec 近くまでは到達
    - もっと、目に見えて遅くしたい!
    60

    View full-size slide

  57. ● サンプルウェブアプリケーション
    ● インフラ視点での低速化
    ● アプリケーション視点での低速化
    ● まとめ
    目次
    61

    View full-size slide

  58. 【作戦5】Eager Loading 廃止
    62

    View full-size slide

  59. 63
    Eager Loading とは?
    https://laravel.com/docs/9.x/eloquent-relationships#eager-loading

    View full-size slide

  60. 64
    Eager Loading とは?
    https://laravel.com/docs/9.x/eloquent-relationships#eager-loading
    N+1問題を解決してくれる

    View full-size slide

  61. 65
    例えば
    https://laravel.com/docs/9.x/eloquent-relationships#eager-loading

    View full-size slide

  62. 66
    例えば
    https://laravel.com/docs/9.x/eloquent-relationships#eager-loading
    Loopの1回ごとにSQL発行

    View full-size slide

  63. 67
    With
    https://laravel.com/docs/9.x/eloquent-relationships#eager-loading
    予めクエリをまとめて発行

    View full-size slide

  64. 【作戦5】Eager Loading 廃止
    - 費用対効果が高い(withを削除するだけ)
    - さらに性能劣化 1.02 〜 1.2s
    69

    View full-size slide

  65. 【作戦5】Eager Loading 廃止
    - 費用対効果が高い(withを削除するだけ)
    - さらに性能劣化 1.02 〜 1.2s
    70
    さらに倍!

    View full-size slide

  66. 【作戦6】Limit句 廃止
    71

    View full-size slide

  67. 72
    禁断の全件取得
    https://laravel.com/docs/9.x/eloquent-relationships#eager-loading

    View full-size slide

  68. 73
    禁断の全件取得
    https://laravel.com/docs/9.x/eloquent-relationships#eager-loading
    5万件ゲット

    View full-size slide

  69. 【作戦6】Limit 句 廃止
    - 会心の一撃
    - さらに性能劣化 3.0 〜 3.5s
    75

    View full-size slide

  70. 【作戦6】Limit 句 廃止
    - 会心の一撃
    - さらに性能劣化 3.0 〜 3.5s
    76
    MySQL は頑張ってる

    View full-size slide

  71. 【作戦7】Attribute Casting の悪用
    77

    View full-size slide

  72. Attribute Casting とは?
    - Eloquent Model が property アクセスする際に発火
    - DBのカラムに合わせて、property を型変換
    78

    View full-size slide

  73. 79
    公式マニュアル
    https://laravel.com/docs/9.x/eloquent-mutators#attribute-casting

    View full-size slide

  74. 80
    一見なんともないコード

    View full-size slide

  75. 81
    一見なんともないコード
    裏で Carbon のインスタンス生
    成が発火している

    View full-size slide

  76. 【作戦7】Attribute Casting 悪用
    - 会心の一撃 part 2
    - さらに性能劣化 6.0 〜 6.5 s
    83

    View full-size slide

  77. 【作戦7】Attribute Casting 悪用
    - 会心の一撃 part 2
    - さらに性能劣化 6.0 〜 6.5 s
    84
    見た目の素朴さが Good !!

    View full-size slide

  78. ● サンプルウェブアプリケーション
    ● インフラ視点での低速化
    ● アプリケーション視点での低速化
    ● まとめ
    目次
    85

    View full-size slide

  79. インフラ・初期設定は確認!
    - OPCache ON 超大事
    - Xdebug OFF 超大事
    86
    実在しましたからね...

    View full-size slide

  80. Laravel はそれほど遅くない
    - ある程度のデータ量に耐える機能がある
    - 公式ドキュメントにちゃんと書いてある
    87

    View full-size slide

  81. Laravel の注意点
    - 便利機能は一歩間違えると痛恨の一撃
    - 何でもなさそうなコードが問題を起こす
    88

    View full-size slide

  82. 最後に
    - RAD フレームワークは、ちゃんとテストを書くこと!
    - コントローラー単位でメソッドは短く!
    - 変なことしても気づきやすいように!
    89

    View full-size slide

  83. おまけコンテンツ
    90

    View full-size slide

  84. 適切なチューニングをした場合
    91

    View full-size slide

  85. 設定
    - OPCache ON
    - OPCache JIT ON
    - OPCache Preload 使用
    92

    View full-size slide

  86. アプリケーション側
    - ユーザーデータキャッシュ
    - お気に入り件数キャッシュ
    - 投稿記事検索結果キャッシュ
    93
    一切の DB 接続をAPCuでしのぐ

    View full-size slide

  87. 94
    DB 接続をしない場合のレスポンス
    ほぼ、静的ページ

    View full-size slide

  88. おまけコンテンツ2
    95

    View full-size slide

  89. N+1 が混入することを防ぐには?
    - 教育
    - Laravel Debug Bar
    - N+1 detecter
    96

    View full-size slide

  90. 97
    Laravel Debug Bar
    https://github.com/barryvdh/laravel-debugbar
    10越えたらチェック

    View full-size slide

  91. インフラ周りのチェックどうする?
    - パターンは多くない
    - チェックリストを作っておくとよい
    - 特に OPCache は入れ忘れが多いので注意
    98

    View full-size slide

  92. 99
    php -m でチェック
    デフォルトでは入ってない

    View full-size slide

  93. パフォーマンスの劣化にはどう気づく
    - 継続監視
    - New Relic, Datadog
    - curl 使って Slack 通知とかでも気づける
    - データ量に注意
    100

    View full-size slide

  94. 101
    性能劣化はデータ量に比例
    https://www.techscore.com/blog/2016/08/08/開発新卒に捧ぐ、基本のアルゴリズムと計算量
    /

    View full-size slide

  95. @hanhan1978
    相談・指摘・その他 
    下記のTwitterアカウントにどうぞ
    103

    View full-size slide