miyaz
キャッシュ
勉強会
• ITシステムを使用する場合、情報伝達経路に様々なモノが介在している。
例えば、CPU/メモリ/HDD/マザーボード/NIC/LANケーブル/ファイアウォールなど。
• Webサイトのあるページを開く時のデータの流れを例にすると、以下のようになる
その各情報伝達経路上で、様々なキャッシュが使われている
1)ユーザがブラウザからリクエスト送信
2)プロキシサーバ経由してインターネットへ
3)ファイアウォール通過
4)ロードバランサ通過
5)Webサーバ通過
6)APサーバにてリクエストを処理
7)APからDBへ必要なSQL発行
8)DBデータから必要なデータを取得し
APへ応答
9)AP~ブラウザまで応答
はじめに
引用元) http://ja.wikipedia.org/wiki/キャッシュ_(コンピュータシステム)
キャッシュ(Cache)
• キャッシュ (cache) は、CPUのバスやネットワークなど様々な情報伝達経路において、ある領
域から他の領域へ情報を転送する際、その転送遅延を極力隠蔽化させ転送効率を向上させるた
めに考案された記憶階層の実現手段である。
• 転送元と転送先の中間に位置し、データ内容の一部とその参照を保持する。データ転送元への
転送要求があり、それへの参照が既にキャッシュに格納されていた場合は、元データからの転
送は行わずキャッシュが転送を代行する(この状態をキャッシュヒット、キャッシュに所望の
データが存在せず元データから転送する状態をキャッシュミスという)。
これらによりデータ転送の冗長性やオーバヘッドを低減させることで転送効率を向上させる。
Wikipediaより引用
引用元) http://ja.wikipedia.org/wiki/キャッシュ_(コンピュータシステム)
• ここでおさらい!
デスク上での作業で例えると。
CPU・・・ 「仕事・作業をしてる人」
– 良いCPUとは、仕事・作業をしてる人の能力が高いということ。
メモリ・・・「デスク」
– 良いメモリとは、デスクが広くて作業がはかどるということ。
HDD・・・「デスクの引き出し」
– 良いハードディスクとは、引き出しが大きくて、作った物がたくさん入るということ
。
引用元) http://enjoy.sso.biglobe.ne.jp/archives/zukai_pc/
つまり、「能力が高い人が、広いデス
クで作業すれば仕事がとてもはかどり
、その結果として良いものをたくさん
作ることができて、さらに引き出しが
大きければ、どんどん在庫を保管して
おくことができる」ということ。
CPU/メモリ/HDDの違い
記憶階層
• データを保持する記憶装置のコストバランスは、通常小容量×高速≒大容量×低速が成り立つ。小容量
×高速記憶装置の代表はCPUレジスタであり、大容量×低速記憶装置の代表はハードディスクや磁気テ
ープなどの補助記憶装置である。記憶装置の理想は大容量×高速アクセスであるが、通常コストパフ
ォーマンスが悪く実現困難である。そのため小容量×高速、中容量×中速、大容量×低速など複数段階
にまたがった記憶構造とし(一般にCPUなどバスマスタに近い側を上位レベル、遠い側を下位レベル
とする)、各レベルを各々下位レベルの一時記憶として用いることで代替する。この構造を記憶階
層という。
引用元) http://ja.wikipedia.org/wiki/キャッシュ_(コンピュータシステム)
ここがポイント!
・主記憶装置より上は、電源おちると消える
⇒データが消えないように、補助記憶装置
(HDDなど)を使わざるを得ない。
が、ディスクアクセスは超低速!
・安くて速いシステムを構築する、ということは
いかにキャッシュして使うか(ディスクアクセスを
減らすか)を、各階層で工夫すること。
いろいろなキャッシュ
• HWが提供するキャッシュ
– CPU~メモリ間
➢ L1キャッシュ、L2キャッシュ、L3キャッシュ
• OSが提供するキャッシュ
– HDD~メモリ間
➢ ページキャッシュ(ディスクキャッシュ)
➢ 全てのプログラムは、メモリ上で実行される(これも一種のキャッシュ)
• SWレイヤで提供するキャッシュ
– Webブラウザ
➢ ブラウザキャッシュ
– KeyValueストア系キャッシュSW
➢ Memcached
➢ VarnishCache
– データベース(以下はOracleの名称だが、他DB製品でも同様な機能を持つ)
➢ ライブラリ・キャッシュ
➢ ディクショナリ・キャッシュ
➢ バッファ・キャッシュ
CPUのキャッシュ
• CPUは、キャッシュメモリ(主記憶装置とは別モノ)と呼ばれるメモリを使用して、
処理の高速化を図っている
• キャッシュメモリには、高速な順(&容量が小さい順)にL1キャッシュ、L2キャッシ
ュ、L3キャッシュ(※)がある。 ※L3はない場合もある
• L1キャッシュ (1次キャッシュ)
– キャッシュメモリはメインメモリ(RAM)よりも高速に読み書きできるが(価格が高いため)搭載容量の少
ないメモリ装置で、直近に使用したデータや使用頻度の高いデータなどを格納するのに使われる。
– 最優先でデータの読み書きが行われるものを1次キャッシュという。
• L2キャッシュ (2次キャッシュ)
– 2次キャッシュは1次キャッシュよりも低速だが大容量のメモリ装置で、1次キャッシュに収まりきらな
いデータの受け皿となる。
– 2次キャッシュからも溢れたデータは、3次キャッシュがある場合は3次キャッシュに、ない場合はメイ
ンメモリに格納される。
引用元) http://e-words.jp/w/1E6ACA1E382ADE383A3E38383E382B7E383A5.html
CPUのキャッシュ
CPU
L1キャッシュ
処理単位時間:1ns
L2キャッシュ
処理単位時間:4.7ns
メインメモリ
処理単位時間:83ns
HDDのキャッシュ
• HDDは、メインメモリと比べてもI/O(Read/Write)性能が格段に遅い!
• HDDのI/O待ちを減らすために、Linux (に限らず他の OS もそうですが) にはディスクの
内容を一度読んだらそれをカーネルがキャッシュして、二度目以降はメモリから読む
機構 = ページキャッシュがある。
• 実演
# dd if=/dev/urandom of=/tmp/test bs=1M count=100
⇒100MBのファイルを作成
# sync;echo 3 > /proc/sys/vm/drop_caches
⇒ページキャッシュをクリア
# time cat /tmp/test > /dev/null
⇒ページキャッシュをクリアする前後で100MB読み出し時間比較!
HDD/メモリの性能によるが、データ転送速度100倍程度、
探索処理は10万倍~100万倍程度の差がある
CPU、メモリ、HDDのレイテンシ
• 各レイテンシをオフィスの比喩でみてみると・・・
L1:机から紙を1枚とる(3秒)
L2:本棚から本を取り出す(14秒)
メインメモリ:部屋を出て階下でお菓子を買う(4分)
ハードディスク:オフィスを出て世界放浪の旅に出る(1年3か月)
これぐらいの差がある、という例。
実際には、nano秒~micro秒レベルの話。
※nano秒・・・10億分の1秒
ハードディスクが“激遅”であることがわかる。
世の中の “重いシステム(Webサイト)” の大半は、突き詰めると
ディスクIOが遅いことに原因がある。
引用元) http://vwxyz.hateblo.jp/entry/20101221/1292923352
Oracleのキャッシュ
• ライブラリ・キャッシュ
– 共有SQL領域(SQL解析ツリー、実行計画)
• ディクショナリ・キャッシュ
– オブジェクト(テーブルなど)の属性情報、構成情報を保持
• バッファ・キャッシュ
– データファイルの中身
• SQL処理フロー
① SQLの解析(PARSE)
◆ 表や列の定義チェック、アクセス権限のチェックを行い
最適な実行計画が選択される
◆ 解析結果を共有プールに保持する。
再度同じSQLが発行された場合に不要な解析を繰返す必要がなくなる。
② SQLの実行(EXECUTE)
◆ SQL処理に必要なターゲットのデータを、データベース・バッファ・キャッシュ上で探す
。
◆ 見つからなかった場合は、データ・ファイルから対象ブロックを読込む⇒ディスクIO発
生
◆ 読み込んだデータをバッファ・キャッシュに保持する。
次回対象データへのアクセスが発生した場合は、バッファ・キャッシュ
③ 値の取出し(FETCH)
※Selectのみ
プログラムで使うキャッシュ?
• プログラム(コード)上のロジック上でもキャッシュを意識すると
高性能
• 簡単なjavascriptの例
[遅い]
for (i = 0; i < elements.length; i++) { ... }
[速い]
for (i = 0, len = elements.length; i < len; i++) { ... }
この違い、わかりますか?
キャッシュヒット率監視の重要性
• キャッシュミスが多発する、ということは性能劣化の表れ
– メモリ不足や、設定が適切ではない可能性がある
• Linuxサーバの場合
– iowaitを監視
• キャッシュ機能を持つSW
– Oracleだと、バッファ・キャッシュ、ライブラリ・キャッシュ、ディクショナリ・
キャッシュのヒット率を監視。99%以上が望ましい。95%以下は問題あり
– VarnishCacheやmemcachedなどもキャッシュヒット率を監視し
ミスが増加傾向であればキャッシュストレージ、キャッシュインスタンスの増設
を検討する必要がある
キャッシュがないとどうなるか
• オールインワンでINSUITEが動く検証環境で実演してみます
①ブラウザキャッシュがないとどうなる?
– Fiddlerというツールで、強制的にキャッシュを無効化してみると。
。
②サーバ上のページキャッシュ&Oracleキャッシュがない
と
どうなる?
– Oracleを再起動してキャッシュをクリアし、かつOS上のページキャ
ッシュをクリアすると。。
おわり

Cache勉強会