PHPerKaigi 2023 登壇資料
@hanhan1978PHPで学ぶ Cacheの距離 の話PHPerKaigi 2023
View Slide
@hanhan1978● 富所 亮● 所属株式会社カオナビBackEnd Re-architecturing Team (BERT)● 職業バックエンドエンジニア● ブログhttps://blog.hanhans.net● Yokohama North AMhttps://anchor.fm/yokohama-north-am2
まずはこれを見てほしい3
4レイテンシーの表https://colin-scott.github.io/personal_website/research/interactive_latency.html
5本トークの目標
6Cache をテーマに 新しい視点 を獲得してほしい
7そもそも Cache とは?
8https://www.weblio.jp/content/cacheweblio - デジタル大辞泉
ようするに......デジタルデータストア9
10Cache する とは?
プログラミングの文脈で Cacheする と表現した場合デジタルデータストア を使ったバッファリング11
12バッファリング とは?
13https://www.weblio.jp/content/バッファリングweblio - デジタル大辞泉
14バッファリング日常的にも使われている
例 : 宅配便1. 荷受け場所 → 地域の中継施設 → 県の中継施設<< 大型輸送手段で一気に運ぶ >>2. 県の中継施設 → 地域の中継施設 → 最寄の宅配便15
16宅配便におけるバッファリングバッファリング
17プログラミングにおける例
18プログラマーのためのCPU入門 : 第五章 キャッシュメモリ よりCPU- 命令キャッシュ- データキャッシュ命令流の高密度化が損なわれることを緩和
19Linux の仕組み : 第8章 記憶階層 よりOS のページキャッシュ低速ストレージのアクセス速度向上のため、ファイルデータをメモリにキャッシュ
20https://speakerdeck.com/hanhan1978/preload-and-jitPHP の OPCacheコンパイルされた内容をメモリにキャッシュ
21https://speakerdeck.com/hanhan1978/preload-and-jitCDN を使ったウェブコンテンツ配信Akamai, CloudFront, CloudFlareエッジでの WASM とかも距離を減らす戦略の一つ
22いろいろな例をみた上でキャッシュを使うパターンを考える
キャッシュのパターン- より近いデータストアにデータを置く- 演算結果をデータストアに置く23
キャッシュのパターン- より近いデータストアにデータを置く- 演算結果をデータストアに置く24IOバッファ演算バッファ
IOバッファデータをより高速でアクセスできる場所に置く演算バッファ時間のかかる演算の処理結果を保存する25
26課題に対して適切なバッファリングを選択すること
27ケーススタディ
PHPウェブアプリケーションの改善28
29DB クエリ結果のキャッシュデータベースの問い合わせ結果をKVS にキャッシュウェブアプリケーションで最もよく使われる Cache のパターン
30プロファイラーXhprof, Datadog, New Relic計測できれば何でもOK
レイテンシを分析31その処理時間はデータIO ???演算 ???
レイテンシを分析 232この例ではデータIO と 演算 をキャッシュを使うことで削減
設計のポイント- 計測して、レイテンシーの中身を分析- バッファにより何を改善するのかを明確化33
34落とし穴
35距離が変わらない CacheRedis 10,000 GET 600 msMySQL 10,000 SELECT 800 ms演算がボトルネックではない上にデータIOも距離が変わってない
36距離が変わらない CacheRedis 10,000 GET 600 msMySQL 10,000 SELECT 800 ms演算がボトルネックではない上にデータIOも距離が変わってないレスポンスタイム向上が目的だとしたら失敗DBコネクション数の削減なら成功 → 目的がとっても大事
IOバッファは距離が大事- 元の処理の距離- 改善後の処理の距離37
PHP で使える Cache とレイテンシ- データベース 500 μs- Redis (KVS) 500 μs- ファイル 16 μs- メモリ 100 ns ( 0.1 μs)38
39レイテンシーの表https://colin-scott.github.io/personal_website/research/interactive_latency.html
40レイテンシーの表https://colin-scott.github.io/personal_website/research/interactive_latency.htmlネットワークファイルメモリ
41距離を変えるRedis 10,000 GET 57 msMySQL 10,000 SELECT 800 ms距離を変えたので IO バッファが効いた
おさらいCache を使ったバッファリングで速度改善できるのは- 演算処理- IO処理何を改善したくて Cache を使うのか?まず計測をした上で 明確な目的 を持つこと42
おまけ43
44落とし穴2
Cache は要注意- 古い情報の Cache- Cache ストアの可用性- サンダリングハード45
参考情報- Webサービスにおける キャッシュ戦略 - Speaker Deckhttps://speakerdeck.com/yusukebe/websabisuniokeru-kiyatusiyuzhan-lue- Webアプリケーションのキャッシュ戦略とそのパターン - Speaker Deckhttps://speakerdeck.com/moznion/pattern-and-strategy-of-web-application-caching46
47落とし穴3
48Cache しないで済むならしないに越したことはない
PHP における Cache の注意点- Serialize, Unserialize のコスト- Cache 機構自体が備える安全担保のコスト巨大データをキャッシュしても、データ取得後の unserialize にコストがかかるので、キャッシュの旨味が少ないときがある49
Cache による処理時間削減は 0 じゃない50ここで Cache 取得にまつわるコストが発生している
51絶対に計測して確認すること!
immutable_cache52https://pecl.php.net/package/immutable_cacheapcu からメモリへの値コピーを除外したもの
配列1件を cache → 10,000 回取得- apcu 55msec- immutable_cache 55msec性能は変わらない53
配列5000件を cache → 10,000 回取得- apcu 6.4 sec- immutable_cache 67 msec実測することで、cache 処理自体への理解も進む54
55落とし穴4
メモリ Cache の注意点- 複数台構成だと Cache アウトを制御しづらい- サーバーA では最新、サーバーB では古いなどが発生キャッシュの新旧チェックや、生存期間を考慮する必要がないデータに限定するなど、工夫が必要56
@hanhan1978相談・指摘・その他 下記のTwitterアカウントにどうぞ57