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

Laravelのsession設定を変えて 劇的にパフォーマンスを改善した話

gorou_178
October 03, 2021

Laravelのsession設定を変えて 劇的にパフォーマンスを改善した話

webアプリケーションでCookieを利用したSession管理を行うことが多いと思います。
最近のフレームワークはSessionをとても簡単に活用できるためその維持管理について特に考えないことが多いです。

Laravelで構築したwebアプリケーションで、急激な性能劣化が発生して原因の特定と対策をすぐに行わなければいけない状況が発生しました。結果的にLaravelのSession設定を変更することで劇的にパフォーマンスが改善しました。

本セッションでは、なぜSessionが原因で性能が劣化したのか、また改善した理由について、経緯を踏まえてお話します。PHP/Laravelでのセッションの大まかな仕組み、性能劣化の要因、対策方法について説明します。

https://fortee.jp/phpcon-2021/proposal/05c4bfa3-445a-49a8-b1d9-572c0dc336ad

gorou_178

October 03, 2021
Tweet

More Decks by gorou_178

Other Decks in Programming

Transcript

  1. Laravelのsession設定を変えて
    劇的にパフォーマンスを改善した話
    PHPカンファレンス 2021
    gorou

    View full-size slide

  2. 自己紹介

    View full-size slide

  3. gorou
    穴井 怜
    居住地: 福岡
    所属: イノベーター・ジャパン
    職業: webエンジニア
    Twitter: @gorou_178
    ブログ: https:/
    /www.gorou.style/
    その他: JP_Stripes 福岡 運営メンバー

    View full-size slide

  4. ゴール
    ▫ 性能劣化の原因理解
    ▫ メトリクス計測大事

    View full-size slide

  5. 前提
    ▫ 作品を期日までに応募できるサービス
    ▫ Laravel + セッション管理がDB
    ▫ 締切間近になると応募が集中して負荷が高まる

    View full-size slide

  6. 状況
    ▫ 締め切り数時間前で想定以上に負荷が高くて
    このままでは応募ができなくなりそう(大問題)
    ▫ 原因を特定してすぐに対策しなければいけない状況

    View full-size slide

  7. 対策結果

    View full-size slide

  8. 対策結果: レスポンス時間を約半分にできた

    View full-size slide

  9. 対策内容
    ▫ セッションGCをOFFすることで対処

    View full-size slide

  10. 対策までの経緯

    View full-size slide

  11. 1. 負荷が高い
    疑問
    ▫ どこの負荷が高いのか?
    検証
    ▫ Mackerelで確認
    結果
    ▫ DBの負荷が高い
    ▫ なぜ高いのか?

    View full-size slide

  12. 2. DBの負荷が高い
    疑問
    ▫ なぜDBの負荷が高いの
    か?
    検証
    ▫ Newrelicで確認
    結果
    ▫ deleteの処理時間が圧倒的
    に大きい
    ▫ 仮設1: アプリケーションで
    削除処理がある?
    ▫ ないので却下
    ▫ 仮設2: セッションGCによる
    削除?
    ▫ 可能性高いので調査

    View full-size slide

  13. 3. アプリケーションのセッション設定
    疑問
    ▫ セッションGCの設定がどの
    様になっているのか?
    検証
    ▫ LaravelとPHPの設定を確認
    結果
    ▫ Laravelのlotteryがデフォル
    ト設定だった

    View full-size slide

  14. Laravelのlotteryとは
    ▫ lotteryとはセッションGC発生頻度のLaravelでの設定
    項目
    ▫ デフォルト設定[2, 100]
    ▫ 2/100 = 2%の確率で実施
    ▫ php.iniでセッションGC発生頻度の設定があるが
    利用しないので注意

    View full-size slide

  15. アクセス数が多いため単位時間あたりのセッションGCが増加
    アクセスが多い場合
    アクセスが少ない場合

    View full-size slide

  16. 4. アプリケーションのセッション設定
    疑問
    ▫ セッションGCでなぜ重くなる
    のか?
    検証
    ▫ DBの設定を確認
    結果
    ▫ sessionsテーブルにindexが
    設定されていない
    ▫ delete操作でテーブルロッ
    クが発生
    ▫ update操作が待たされ

    ▫ 負荷が上がる
    ▫ これが負荷の原因

    View full-size slide

  17. 5. 対策
    ▫ すぐにできる対応として、セッションGCを止めて締め
    切りを乗り越える判断
    ▫ lotteryを[0, 100]に変更してリリース
    ▫ 負荷が下がり無事締め切りを乗り越える

    View full-size slide

  18. まとめ
    ▫ メトリクス計測大事
    ▫ 推測するな計測せよ
    ▫ DBセッション管理は比較的性能問題を起こしやすい
    ので注意
    ▫ インデックス・レコード数など要確認
    ▫ 「とりあえずデフォルト設定」ではなくしっかり設定の
    意味を理解して設定しましょう!

    View full-size slide

  19. ご視聴ありがとうござ
    いました!

    View full-size slide

  20. 参考URL
    - PHPで学ぶSessionの基本と応用 - hanhan1978 |
    Speakerdeck
    - PHP: 実行時設定 - Manual
    - HTTPセッション 8.x Laravel
    - laravel/framework StartSession.php - GitHub

    View full-size slide