Memcachedの仕組みと設定
- 2. 目次
• 自己紹介
• memcached とは?
• データ構造
• データサイズに応じた設定方法
• 終わりに
- 4. memcached とは?
• 揮発性 key-valueストア(KVS)
• シンプルなメモリキャッシュシステム
• データはメモリ上でのみ保持される
• 高速な get / set が可能
• 永続的なデータのストレージには不向き
• 認証やセキュリティの機能が皆無
- 6. データの追加
データサイズの決定
• データを格納する際ははじめに格納データのサイズを決定する
• データサイズは key + value + flags によって算出される
• 更にキー管理のための付加情報(固定サイズ)と思しき領域がある
• flags は固定サイズのようで、実際 key と value に使用出来る容量は小さい
データ領域 付加情報?
key value flags
データ
- 7. データの追加
Slab Classを決定する
• memcached を起動した際に複数の Slab Class が定義され、格納されるデータ
サイズに応じて Slab Class が選択される
小さい
これも小さい
これに収まる、
決定!
150 byte Slab Class 6
5
1
4
2
3
1
データ 152 byte
240
ChunkSize: 304byte
ChunkSize: 96 byte
192
120 byte
4369
Chunks/Page: 3449
Chunks/Page: 10922
240
8738
6898
2
Slab Classes
3
4
はじめてその Slab にデータを格納
5
する際は、そのクラスの Page を
作成する
6
- 8. Slab と Page について
• Page は 1MB のデータ空間のことで、固定サイズの Chunk というデータ領域
で区切られている
• Page は特定の Slab に属しており、Page が生成される際に Slab が決定され
る
Slab Class 1
Slab Class 2
Slab Class 3
Chunk
Pages
Slab Class 4
固定サイズの用紙の中がマス目で区切られていて、マス目
にデータが入れられるイメージ
Slab Class はいわばマス目の大きさが違う書式フォーマット
- 10. 違うデータをセットする時
• データサイズの決定、 Slab の選定、 Page へのセットを行う
• 該当する Slab の Page がない場合は先ほどと同じように Page を作成する
• Page がある時はその Page の空き Chunk にデータをセットする
データ
1
Slab Class 1 Class 2
Slab 6
5
4
3
ChunkSize: byte ChunkSize: byte
Chunks/Page: ChunksPerPage:
2
Slab Class 3
3
Slab Class
4
- 11. データの削除
• データを削除する際はそのデータを物理削除するのではなく、 Chunk に削
除フラグを立てる
• 削除フラグが立っている Chunk は Free Chunk として扱われ、次にデータが
セットされる時に優先的に上書きセットされる
Slab Class 3
Free Chunk
- 12. Page がいっぱいになったら
• Page 内の Chunk がいっぱいになってデータがセットできない時は同一 Slab
の Page を新しく1つ作る
• Page が増えたびに空きメモリを消費していく
データを追加したい いっぱい
Slab Class 3 もう入らないよ
Slab Class 3
Slab Class 3
ChunkSize: 152 byte
Chunks/Page: 6898
Page 追加!
3
- 13. メモリサイズがいっぱいになったら
• 新しいページを追加することで memcached が設定されたメモリサイズ上限
を超える場合、 Page を追加することはできない
• その際は Slab の中で最後に参照された日時が一番古い Chunk にセットする
データを追加したい
Slab Class 3
Slab Class 3 最近 get されて
ないし、上書
やった! きしていいよ
空き Chunk が 追い出し発生
ないし新しい
Page も追加で
きない・・・
LRUUsed
Least Recently
- 14. まとめ
• Page: Slab に割り当てられる固定サイズのメモリ領域 (デフォルト1MB)
• Chunk: 1レコードを格納するためのメモリ領域。Page は複数の Chunk に区切
られて構成されている(データサイズの節で記載した付加情報の領域は厳密
に言うと Chunk の管理情報かもしれない)
• Slab Class: Chunk サイズを定義している設定。起動時に複数のクラスが定義
され、途中で変更されることはない
• memcached のこの仕組みを Slab Allocator という
• Slab Allocator を用いることでメモリの断片化(フラグメンテーション)が発生
しない
- 16. memcachedの設定について
x 1.25
• メモリサイズ上限(-m): プロセス
Slab Class: 1 Slab Class: 2
が使用するメモリサイズの上限
Chunk Size: 96 byte Chunk Size: 120 byte
目安
(デフォルト: 64 MB) Chunks/page: 10922 Chunks/page: 8738
Record Data Size: 48 byte Record Data Size: 72 byte
• 最小データサイズ(-n): 最小chunk x 1.25
に格納できるキーと値とフラグ
情報を合算したサイズ
(これに付加情報とおもわれるも Slab Class: 3 Slab Class: 4
ののサイズが加算されたものが Chunk Size: 152 byte Chunk Size: 192 byte
実最小chunkサイズとなる) Chunks/page: 6898 Chunks/page: 5461
(デフォルト: 48 byte) Record Data Size: 104 byte Record Data Size: 144 byte
• Grouwth Factor(-f): chunkサイズの
乗算値設定
(デフォルト1.25) Slab Class: 5 Slab Class: 6
Chunk Size: 240 byte Chunk Size: 304 byte
Chunks/page: 4369 Chunks/page: 3449
Record Data Size: 192 byte Record Data Size: 256 byte
- 17. 注意: 一度作成した Page は破棄されない
• memcached は一度作成した Page は破棄せずにメモリ上に保持し続けるため、
注意が必要となる
• 時間経過によってデータサイズが変動するデータを memcached で取り扱う
場合は注意
例
• 上限設定: 8MB Slab Class 1
Slab Class 11 Slab Class 2
Slab Class 1
Slab Class 1
• 最初は小さいデータが大量 Slab Class 1
Slab Class 1
Slab Class 1
Slab Class
に作られるが、徐々にそれ Slab Class 1はスッカスカ
らが大きくなる特性を持つ
Slab Class 2 は大量の追い出し
• 最終的には Slab Class 1,2 にそ
効率悪し
れぞれ同じくらいの比率で
データが格納される想定
小さいデータが大 (上限を超えるが・・・)
小さいデータが徐々
量にセットされ、8 やや大きいデータが
1ページ目は作られる
に減っていき、空き
ページ作られた 徐々に増えるが新た
Chunk が出てくる に Page を作れない!
- 18. case 1: 固定長データの場合
• セットされるデータサイズが固定長の場合、データサイズに応じて最小データサ
イズを調整すると良い
• 例)
キーと値を足してちょうど 100 byte の値のみが最大10000個セットされる場合
• → memcached –n 118 –M 2 とすると丁度良い
• キー+値=100 byte の場合、-n 113 で起動したところ、Slab Class 1 の Page に値が入っ
た。その際、 Chunk サイズは 168 byte で、 Chunk 数は 1 Pageあたり6241個となった。
2 Page あれば事足りるのでメモリサイズは 2 MB に設定する。
• 特定サイズのデータがどの Chunk サイズに格納されるかはやってみないとわから
ないところがあるので、実際に格納してみてどのサイズだとピッタリあうか試し
てみる必要がある
• 必要に応じて本番環境で一度 verbose モードで起動し、Chunk Size を確認してみる
のもよし
• ※同じ設定でも環境によって Chunk サイズが変動することがある
- 19. case2: 決められた種類の複数データを格納する場合
• サイズの違う複数種類のデータを格納する場合はそれぞれに合わせて Chunk
Size を調整すると good
• 例)
以下の3種類のデータを格納する場合 (Expire 4h 、個数は今後増える想定)
a. 87~101 byte のデータが 85 万個
b. 130~263 byte のデータが 374 万個
c. 83~217 byte のデータが 15 万個
• → memcached –n 64 –f 2.5 –M 1500 にすると以下のようになる
slab class 1: chunk size 112 perslab 9362
slab class 2: chunk size 280 perslab 3744
• slab 1 の chunk が 925,000 個、 99 Page
slab 2 の chunk が 3,815,000 個、 1,019 Page という想定
• 1,118 Page 、今後増えることを鑑みると余裕を見て 1.5 GB にしたほうがよい
だろう
- 20. case3: データサイズが完全に不定の場合
• メモリサイズ以外を標準設定で memcached を起動すれば良い
• デフォルト設定の factor: 1.25 はバランスが良い設定で、最も効率よくメモ
リを利用できるとされている
• ただし、メモリサイズ上限はかなり余裕を持った方がいい。大体実際に格
納されると想定されるデータサイズ合計の2倍以上目安(追い出しを許容す
るなら小さくてもいい)
• factor を小さくすると Slab Class が多くなり、 Chunk の隙間の無駄が小さく
なるが Page 上で使われない無駄な Chunk が多くなる
• factor を大きくすると Slab Class が少なくなり、 Chunk の隙間の無駄が大き
くなるが Page 上で使われない無駄な Chunk が少なくなる
• メモリサイズが大きいほど factor が小さいことによる無駄が少なくなる