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

PHP で学ぶ Cache の距離の話 / study_cache_with_php

PHP で学ぶ Cache の距離の話 / study_cache_with_php

PHPerKaigi 2023 登壇資料

Ryo Tomidokoro

March 23, 2023
Tweet

More Decks by Ryo Tomidokoro

Other Decks in Technology

Transcript

  1. @hanhan1978
    PHPで学ぶ Cacheの距離 の話
    PHPerKaigi 2023

    View Slide

  2. @hanhan1978
    ● 富所 亮
    ● 所属
    株式会社カオナビ
    BackEnd Re-architecturing Team (BERT)
    ● 職業
    バックエンドエンジニア
    ● ブログ
    https://blog.hanhans.net
    ● Yokohama North AM
    https://anchor.fm/yokohama-north-am
    2

    View Slide

  3. まずはこれを見てほしい
    3

    View Slide

  4. 4
    レイテンシーの表
    https://colin-scott.github.io/personal_website/research/interactive_latency.html

    View Slide

  5. 5
    本トークの目標

    View Slide

  6. 6
    Cache をテーマに 新しい視点 を獲得してほしい

    View Slide

  7. 7
    そもそも Cache とは?

    View Slide

  8. 8
    https://www.weblio.jp/content/cache
    weblio - デジタル大辞泉

    View Slide

  9. ようするに......
    デジタルデータストア
    9

    View Slide

  10. 10
    Cache する とは?

    View Slide

  11. プログラミングの文脈で Cacheする と表現した場合
    デジタルデータストア を使ったバッファリング
    11

    View Slide

  12. 12
    バッファリング とは?

    View Slide

  13. 13
    https://www.weblio.jp/content/バッファリング
    weblio - デジタル大辞泉

    View Slide

  14. 14
    バッファリング
    日常的にも使われている

    View Slide

  15. 例 : 宅配便
    1. 荷受け場所 → 地域の中継施設 → 県の中継施設
    << 大型輸送手段で一気に運ぶ >>
    2. 県の中継施設 → 地域の中継施設 → 最寄の宅配便
    15

    View Slide

  16. 16
    宅配便におけるバッファリング
    バッファリング

    View Slide

  17. 17
    プログラミングにおける例

    View Slide

  18. 18
    プログラマーのためのCPU入門 : 第五章 キャッシュメモリ より
    CPU
    - 命令キャッシュ
    - データキャッシュ
    命令流の高密度化が損なわれる
    ことを緩和

    View Slide

  19. 19
    Linux の仕組み : 第8章 記憶階層 より
    OS のページキャッシュ
    低速ストレージのアクセス速度向
    上のため、ファイルデータをメモリ
    にキャッシュ

    View Slide

  20. 20
    https://speakerdeck.com/hanhan1978/preload-and-jit
    PHP の OPCache
    コンパイルされた内容をメモリに
    キャッシュ

    View Slide

  21. 21
    https://speakerdeck.com/hanhan1978/preload-and-jit
    CDN を使ったウェブコンテンツ配信
    Akamai, CloudFront, CloudFlare
    エッジでの WASM とかも
    距離を減らす戦略の一つ

    View Slide

  22. 22
    いろいろな例をみた上で
    キャッシュを使うパターンを考える

    View Slide

  23. キャッシュのパターン
    - より近いデータストアにデータを置く
    - 演算結果をデータストアに置く
    23

    View Slide

  24. キャッシュのパターン
    - より近いデータストアにデータを置く
    - 演算結果をデータストアに置く
    24
    IOバッファ
    演算バッファ

    View Slide

  25. IOバッファ
    データをより高速でアクセスできる場所に置く
    演算バッファ
    時間のかかる演算の処理結果を保存する
    25

    View Slide

  26. 26
    課題に対して
    適切なバッファリングを選択すること

    View Slide

  27. 27
    ケーススタディ

    View Slide

  28. PHPウェブアプリケーションの改善
    28

    View Slide

  29. 29
    DB クエリ結果のキャッシュ
    データベースの問い合わせ結果を
    KVS にキャッシュ
    ウェブアプリケーションで最
    もよく使われる Cache の
    パターン

    View Slide

  30. 30
    プロファイラー
    Xhprof, Datadog, New Relic
    計測できれば何でもOK

    View Slide

  31. レイテンシを分析
    31
    その処理時間は
    データIO ???
    演算 ???

    View Slide

  32. レイテンシを分析 2
    32
    この例では
    データIO と 演算 を
    キャッシュを使うことで削減

    View Slide

  33. 設計のポイント
    - 計測して、レイテンシーの中身を分析
    - バッファにより何を改善するのかを明確化
    33

    View Slide

  34. 34
    落とし穴

    View Slide

  35. 35
    距離が変わらない Cache
    Redis 10,000 GET 600 ms
    MySQL 10,000 SELECT 800 ms
    演算がボトルネックではない上に
    データIOも距離が変わってない

    View Slide

  36. 36
    距離が変わらない Cache
    Redis 10,000 GET 600 ms
    MySQL 10,000 SELECT 800 ms
    演算がボトルネックではない上に
    データIOも距離が変わってない
    レスポンスタイム向上が目的だとしたら失敗
    DBコネクション数の削減なら成功 → 目的がとっても大事

    View Slide

  37. IOバッファは距離が大事
    - 元の処理の距離
    - 改善後の処理の距離
    37

    View Slide

  38. PHP で使える Cache とレイテンシ
    - データベース 500 μs
    - Redis (KVS) 500 μs
    - ファイル 16 μs
    - メモリ 100 ns ( 0.1 μs)
    38

    View Slide

  39. 39
    レイテンシーの表
    https://colin-scott.github.io/personal_website/research/interactive_latency.html

    View Slide

  40. 40
    レイテンシーの表
    https://colin-scott.github.io/personal_website/research/interactive_latency.html
    ネットワーク
    ファイル
    メモリ

    View Slide

  41. 41
    距離を変える
    Redis 10,000 GET 57 ms
    MySQL 10,000 SELECT 800 ms
    距離を変えたので IO バッファが効い

    View Slide

  42. おさらい
    Cache を使ったバッファリングで速度改善できるのは
    - 演算処理
    - IO処理
    何を改善したくて Cache を使うのか?
    まず計測をした上で 明確な目的 を持つこと
    42

    View Slide

  43. おまけ
    43

    View Slide

  44. 44
    落とし穴2

    View Slide

  45. Cache は要注意
    - 古い情報の Cache
    - Cache ストアの可用性
    - サンダリングハード
    45

    View Slide

  46. 参考情報
    - Webサービスにおける キャッシュ戦略 - Speaker Deck
    https://speakerdeck.com/yusukebe/websabisuniokeru-kiyatusiyuzhan-lue
    - Webアプリケーションのキャッシュ戦略とそのパターン - Speaker Deck
    https://speakerdeck.com/moznion/pattern-and-strategy-of-web-application-caching
    46

    View Slide

  47. 47
    落とし穴3

    View Slide

  48. 48
    Cache しないで済むなら
    しないに越したことはない

    View Slide

  49. PHP における Cache の注意点
    - Serialize, Unserialize のコスト
    - Cache 機構自体が備える安全担保のコスト
    巨大データをキャッシュしても、データ取得後の unserialize にコストがか
    かるので、キャッシュの旨味が少ないときがある
    49

    View Slide

  50. Cache による処理時間削減は 0 じゃない
    50
    ここで Cache 取得にまつわる
    コストが発生している

    View Slide

  51. 51
    絶対に計測して確認すること!

    View Slide

  52. immutable_cache
    52
    https://pecl.php.net/package/immutable_cache
    apcu からメモリへの値コピーを
    除外したもの

    View Slide

  53. 配列1件を cache → 10,000 回取得
    - apcu 55msec
    - immutable_cache 55msec
    性能は変わらない
    53

    View Slide

  54. 配列5000件を cache → 10,000 回取得
    - apcu 6.4 sec
    - immutable_cache 67 msec
    実測することで、cache 処理自体への理解も進む
    54

    View Slide

  55. 55
    落とし穴4

    View Slide

  56. メモリ Cache の注意点
    - 複数台構成だと Cache アウトを制御しづらい
    - サーバーA では最新、サーバーB では古いなどが発生
    キャッシュの新旧チェックや、生存期間を考慮する必要がないデータに限
    定するなど、工夫が必要
    56

    View Slide

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

    View Slide