memcachedの仕組み(オンメモリストレージ・Slab Allocator)

memcachedとは、内蔵のKey-Value型オンメモリストレージで分散キャッシュサーバと定義されています。
ただ分散させる機能はmemcachedには含まれておらず、クライアント側での制御となります。

[参考記事] Windowsにmemcachedをインストールする方法
[参考記事] Linuxにmemcachedをインストールする方法
[参考記事] PHPでmemcachedを使用する(memcacheライブラリ)
[参考記事] Rubyでmemcachedを使用する(memcache-client)
[参考記事] Perlでmemcachedを使用する(Cache::Memcachedモジュール)

libeventによるイベントハンドリング

memcachedはlibeventを使用しています。
libeventとは、Linuxではepoll、BSD系のOSではkqueueなどのイベントハンドリング機能をラップして共通仕様で利用できるようにしたライブラリです。
コネクション数の増加に対してもパフォーマンスを発揮ことができます。

内蔵のオンメモリストレージ

memcachedはメモリにデータを蓄え、レスポンスを速くするというのが特徴です。
そのためmemcachedを再起動したり、OSを再起動するとすべてのデータが消えます。
malloc(ヒープ領域からメモリブロックを確保)とfree(メモリブロックを開放)するような、データ保存の方法では フラグメンテーション(断片化)が発生し、メモリマネージャに負荷をかけてしまうため逆に重くなってしまうことがあります。
memcachedではSlab Allocatorというシステムを使って、この問題を解決しています。

またメモリが指定された容量に達すると、LRU(Least Recently Used)に基づいて利用されないキャッシュは自動的に削除されます。

Slab Allocatorとは

用語意味
Page デフォルトで1MB確保され、Slabに割り当てられるメモリ領域。
Slabに割り当てられた後に、slabのサイズに応じたchunkに切り分けられる。
Chunk レコードをキャッシュするためのメモリ領域。
Slab Class 特定のサイズのchunkをまとめるクラス。

Slab Allocatorではフラグメンテーションが起こらないように確保したメモリを様々な固定長サイズのChunkに分け、 同じサイズのChunkをSlab Classという固まりにまとめます。
格納するデータのサイズによって保存するSlab Classを決めます。

つまり
メモリ領域を様々なサイズの固定長領域に分け、データサイズによって格納する領域を決める。
ということです。

デメリットは、確保された領域が固定長のため保存されるデータによってはロスが生じます。

Slab ClassやChunkは起動オプションに『 -vv 』をつけると出力されます。

memcached -d -m 64 -p 11211 -vv

slab class   1: chunk size        80 perslab   13107
slab class   2: chunk size       104 perslab   10082
slab class   3: chunk size       136 perslab    7710
slab class   4: chunk size       176 perslab    5957
slab class   5: chunk size       224 perslab    4681
slab class   6: chunk size       280 perslab    3744
slab class   7: chunk size       352 perslab    2978
slab class   8: chunk size       440 perslab    2383
slab class   9: chunk size       552 perslab    1899
slab class  10: chunk size       696 perslab    1506
slab class  11: chunk size       872 perslab    1202
slab class  12: chunk size      1096 perslab     956
slab class  13: chunk size      1376 perslab     762
slab class  14: chunk size      1720 perslab     609
slab class  15: chunk size      2152 perslab     487
slab class  16: chunk size      2696 perslab     388
slab class  17: chunk size      3376 perslab     310
slab class  18: chunk size      4224 perslab     248
slab class  19: chunk size      5280 perslab     198
slab class  20: chunk size      6600 perslab     158
slab class  21: chunk size      8256 perslab     127
slab class  22: chunk size     10320 perslab     101
slab class  23: chunk size     12904 perslab      81
slab class  24: chunk size     16136 perslab      64
slab class  25: chunk size     20176 perslab      51
slab class  26: chunk size     25224 perslab      41
slab class  27: chunk size     31536 perslab      33
slab class  28: chunk size     39424 perslab      26
slab class  29: chunk size     49280 perslab      21
slab class  30: chunk size     61600 perslab      17
slab class  31: chunk size     77000 perslab      13
slab class  32: chunk size     96256 perslab      10
slab class  33: chunk size    120320 perslab       8
slab class  34: chunk size    150400 perslab       6
slab class  35: chunk size    188000 perslab       5
slab class  36: chunk size    235000 perslab       4
slab class  37: chunk size    293752 perslab       3
slab class  38: chunk size    367192 perslab       2
slab class  39: chunk size    458992 perslab       2
slab class  40: chunk size    573744 perslab       1
slab class  41: chunk size    717184 perslab       1
slab class  42: chunk size   1048576 perslab       1

このサイズの区切りはデフォルトでは1.25倍づつ大きくなりますが、『 -f 』オプションでその区切りを変更できます。

memcached -d -m 64 -p 11211 -f 2 -vv
slab class   1: chunk size        80 perslab   13107
slab class   2: chunk size       160 perslab    6553
slab class   3: chunk size       320 perslab    3276
slab class   4: chunk size       640 perslab    1638
slab class   5: chunk size      1280 perslab     819
slab class   6: chunk size      2560 perslab     409
slab class   7: chunk size      5120 perslab     204
slab class   8: chunk size     10240 perslab     102
slab class   9: chunk size     20480 perslab      51
slab class  10: chunk size     40960 perslab      25
slab class  11: chunk size     81920 perslab      12
slab class  12: chunk size    163840 perslab       6
slab class  13: chunk size    327680 perslab       3
slab class  14: chunk size   1048576 perslab       1

関連記事

スポンサーリンク

CakePHPでカラムを比較してSELECTする方法

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る