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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  5. 5
    本トークの目標

    View full-size slide

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

    View full-size slide

  7. 7
    そもそも Cache とは?

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  10. 10
    Cache する とは?

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  27. 27
    ケーススタディ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  34. 34
    落とし穴

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  43. 44
    落とし穴2

    View full-size slide

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

    View full-size slide

  45. 参考情報
    - 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 full-size slide

  46. 47
    落とし穴3

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  54. 55
    落とし穴4

    View full-size slide

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

    View full-size slide

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

    View full-size slide