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
スポンサーリンク
関連記事
- Apacheから2GB以上のファイルをダウンロードしようとすると403エラーが出ます
- [warn] _default_ VirtualHost overlap on port 80, the first has precedence エラー
- Zend Serverとは
- 特定のディレクトリのみベーシック認証を外す方法
- Cactiのインストール RRDToolを利用したサーバ監視ツール
- svn: '/home' does not appear to be a URL 同サーバ内にあるリポジトリの指定
- SVNリポジトリを別のサーバに移行する方法
- svn: Repository moved temporarily; please relocate PROPFIND request failed
- locateデータベースの更新
- JP106キーボードを使用する設定
- VirtualBoxでホストOSと同じネットワークにする方法
- VMware Serverのファイル・サービス
- VirtualBox、仮想OSのインストール
- IPアドレス制限とベーシック認証を併用する方法
- 会員専用ページを作る方法 (ベーシック認証 / Basic認証 / 基本認証)
- CGI(Perl)をApacheで使用するときの設定
- NTPサーバで時計を調節する (the NTP socket is in use, exiting とは)
- CVSについて
- Oracle Berkeley DBのインストール
- VMware Serverの使い方
- VMWare Serverのインストール
- webサーバーのレスポンスコード
スポンサーリンク






