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

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

81011f5622102c067230901506f21e5f?s=47 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

81011f5622102c067230901506f21e5f?s=128

gorou_178

October 03, 2021
Tweet

Transcript

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

  2. 自己紹介

  3. gorou 穴井 怜 居住地: 福岡 所属: イノベーター・ジャパン 職業: webエンジニア Twitter:

    @gorou_178 ブログ: https:/ /www.gorou.style/ その他: JP_Stripes 福岡 運営メンバー
  4. ゴール ▫ 性能劣化の原因理解 ▫ メトリクス計測大事

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

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

  7. 対策結果

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

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

  10. 対策までの経緯

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

    DBの負荷が高い ▫ なぜ高いのか?
  12. 2. DBの負荷が高い 疑問 ▫ なぜDBの負荷が高いの か? 検証 ▫ Newrelicで確認 結果

    ▫ deleteの処理時間が圧倒的 に大きい ▫ 仮設1: アプリケーションで 削除処理がある? ▫ ないので却下 ▫ 仮設2: セッションGCによる 削除? ▫ 可能性高いので調査
  13. 3. アプリケーションのセッション設定 疑問 ▫ セッションGCの設定がどの 様になっているのか? 検証 ▫ LaravelとPHPの設定を確認 結果

    ▫ Laravelのlotteryがデフォル ト設定だった
  14. Laravelのlotteryとは ▫ lotteryとはセッションGC発生頻度のLaravelでの設定 項目 ▫ デフォルト設定[2, 100] ▫ 2/100 =

    2%の確率で実施 ▫ php.iniでセッションGC発生頻度の設定があるが 利用しないので注意
  15. アクセス数が多いため単位時間あたりのセッションGCが増加 アクセスが多い場合 アクセスが少ない場合

  16. 4. アプリケーションのセッション設定 疑問 ▫ セッションGCでなぜ重くなる のか? 検証 ▫ DBの設定を確認 結果

    ▫ sessionsテーブルにindexが 設定されていない ▫ delete操作でテーブルロッ クが発生 ▫ update操作が待たされ る ▫ 負荷が上がる ▫ これが負荷の原因
  17. 5. 対策 ▫ すぐにできる対応として、セッションGCを止めて締め 切りを乗り越える判断 ▫ lotteryを[0, 100]に変更してリリース ▫ 負荷が下がり無事締め切りを乗り越える

  18. まとめ ▫ メトリクス計測大事 ▫ 推測するな計測せよ ▫ DBセッション管理は比較的性能問題を起こしやすい ので注意 ▫ インデックス・レコード数など要確認

    ▫ 「とりあえずデフォルト設定」ではなくしっかり設定の 意味を理解して設定しましょう!
  19. ご視聴ありがとうござ いました!

  20. 参考URL - PHPで学ぶSessionの基本と応用 - hanhan1978 | Speakerdeck - PHP: 実行時設定

    - Manual - HTTPセッション 8.x Laravel - laravel/framework StartSession.php - GitHub