Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHP で学ぶ Cache の距離の話 / study_cache_with_php
Search
Ryo Tomidokoro
March 23, 2023
Technology
7
2.4k
PHP で学ぶ Cache の距離の話 / study_cache_with_php
PHPerKaigi 2023 登壇資料
Ryo Tomidokoro
March 23, 2023
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
フロントエンドがTypeScriptなら、バックエンドはPHPでもいいじゃない/php-is-not-bad
hanhan1978
8
13k
どうすると生き残れないのか/how-not-to-survive
hanhan1978
17
13k
100分で本番デプロイ!Laravelで作るWebアプリケーション作成/100min_web_app_cicd
hanhan1978
1
160
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
8
2.8k
集中して作業する技術/how_to_work_deeply
hanhan1978
62
49k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
11
10k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
4k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
5.2k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
5
2.3k
Other Decks in Technology
See All in Technology
【TiDB GAME DAY 2025】Shadowverse: Worlds Beyond にみる TiDB 活用術
cygames
0
840
Clineを含めたAIエージェントを 大規模組織に導入し、投資対効果を考える / Introducing AI agents into your organization
i35_267
4
1.4k
本当に使える?AutoUpgrade の新機能を実践検証してみた
oracle4engineer
PRO
1
120
Definition of Done
kawaguti
PRO
6
460
Azure AI Foundryでマルチエージェントワークフロー
seosoft
0
150
Amazon Q Developer for GitHubとAmplify Hosting でサクッとデジタル名刺を作ってみた
kmiya84377
0
3.5k
Agentic DevOps時代の生存戦略
kkamegawa
0
950
Абьюзим random_bytes(). Фёдор Кулаков, разработчик Lamoda Tech
lamodatech
0
270
AWS CDK 実践的アプローチ N選 / aws-cdk-practical-approaches
gotok365
4
480
AI技術トレンド勉強会 #1MCPの基礎と実務での応用
nisei_k
1
240
Create a Rails8 responsive app with Gemini and RubyLLM
palladius
0
140
Navigation3でViewModelにデータを渡す方法
mikanichinose
0
200
Featured
See All Featured
Building an army of robots
kneath
306
45k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
It's Worth the Effort
3n
184
28k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
228
22k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.4k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
4 Signs Your Business is Dying
shpigford
184
22k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.5k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Visualization
eitanlees
146
16k
Transcript
@hanhan1978 PHPで学ぶ Cacheの距離 の話 PHPerKaigi 2023
@hanhan1978 • 富所 亮 • 所属 株式会社カオナビ BackEnd Re-architecturing Team
(BERT) • 職業 バックエンドエンジニア • ブログ https://blog.hanhans.net • Yokohama North AM https://anchor.fm/yokohama-north-am 2
まずはこれを見てほしい 3
4 レイテンシーの表 https://colin-scott.github.io/personal_website/research/interactive_latency.html
5 本トークの目標
6 Cache をテーマに 新しい視点 を獲得してほしい
7 そもそも Cache とは?
8 https://www.weblio.jp/content/cache weblio - デジタル大辞泉
ようするに...... デジタルデータストア 9
10 Cache する とは?
プログラミングの文脈で Cacheする と表現した場合 デジタルデータストア を使ったバッファリング 11
12 バッファリング とは?
13 https://www.weblio.jp/content/バッファリング weblio - デジタル大辞泉
14 バッファリング 日常的にも使われている
例 : 宅配便 1. 荷受け場所 → 地域の中継施設 → 県の中継施設 <<
大型輸送手段で一気に運ぶ >> 2. 県の中継施設 → 地域の中継施設 → 最寄の宅配便 15
16 宅配便におけるバッファリング バッファリング
17 プログラミングにおける例
18 プログラマーのためのCPU入門 : 第五章 キャッシュメモリ より CPU - 命令キャッシュ -
データキャッシュ 命令流の高密度化が損なわれる ことを緩和
19 Linux の仕組み : 第8章 記憶階層 より OS のページキャッシュ 低速ストレージのアクセス速度向
上のため、ファイルデータをメモリ にキャッシュ
20 https://speakerdeck.com/hanhan1978/preload-and-jit PHP の OPCache コンパイルされた内容をメモリに キャッシュ
21 https://speakerdeck.com/hanhan1978/preload-and-jit CDN を使ったウェブコンテンツ配信 Akamai, CloudFront, CloudFlare エッジでの WASM とかも
距離を減らす戦略の一つ
22 いろいろな例をみた上で キャッシュを使うパターンを考える
キャッシュのパターン - より近いデータストアにデータを置く - 演算結果をデータストアに置く 23
キャッシュのパターン - より近いデータストアにデータを置く - 演算結果をデータストアに置く 24 IOバッファ 演算バッファ
IOバッファ データをより高速でアクセスできる場所に置く 演算バッファ 時間のかかる演算の処理結果を保存する 25
26 課題に対して 適切なバッファリングを選択すること
27 ケーススタディ
PHPウェブアプリケーションの改善 28
29 DB クエリ結果のキャッシュ データベースの問い合わせ結果を KVS にキャッシュ ウェブアプリケーションで最 もよく使われる Cache の
パターン
30 プロファイラー Xhprof, Datadog, New Relic 計測できれば何でもOK
レイテンシを分析 31 その処理時間は データIO ??? 演算 ???
レイテンシを分析 2 32 この例では データIO と 演算 を キャッシュを使うことで削減
設計のポイント - 計測して、レイテンシーの中身を分析 - バッファにより何を改善するのかを明確化 33
34 落とし穴
35 距離が変わらない Cache Redis 10,000 GET 600 ms MySQL 10,000
SELECT 800 ms 演算がボトルネックではない上に データIOも距離が変わってない
36 距離が変わらない Cache Redis 10,000 GET 600 ms MySQL 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 ms MySQL 10,000 SELECT
800 ms 距離を変えたので IO バッファが効い た
おさらい Cache を使ったバッファリングで速度改善できるのは - 演算処理 - IO処理 何を改善したくて Cache を使うのか?
まず計測をした上で 明確な目的 を持つこと 42
おまけ 43
44 落とし穴2
Cache は要注意 - 古い情報の Cache - Cache ストアの可用性 - サンダリングハード
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
47 落とし穴3
48 Cache しないで済むなら しないに越したことはない
PHP における Cache の注意点 - Serialize, Unserialize のコスト - Cache
機構自体が備える安全担保のコスト 巨大データをキャッシュしても、データ取得後の unserialize にコストがか かるので、キャッシュの旨味が少ないときがある 49
Cache による処理時間削減は 0 じゃない 50 ここで Cache 取得にまつわる コストが発生している
51 絶対に計測して確認すること!
immutable_cache 52 https://pecl.php.net/package/immutable_cache apcu からメモリへの値コピーを 除外したもの
配列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