Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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