Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

5 本トークの目標

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

7 そもそも Cache とは?

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

10 Cache する とは?

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

12 バッファリング とは?

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

27 ケーススタディ

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

34 落とし穴

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

おまけ 43

Slide 44

Slide 44 text

44 落とし穴2

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

参考情報 - 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

Slide 47

Slide 47 text

47 落とし穴3

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

55 落とし穴4

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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