Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  memcached 内でのメモリー割り当て

16.6.2.6 memcached 内でのメモリー割り当て

memcached を最初に起動したときは、構成したメモリーが自動的に割り当てられません。代わりに、memcached はキャッシュへの情報保存が開始されたあとで、はじめて物理メモリーの割り当てと確保を開始します。

キャッシュにデータを格納し始めたときに、memcached は項目上のデータのメモリーを項目単位では割り当てません。代わりに、スラブ割り当てを使用して、メモリーの使用量を最適化し、キャッシュの情報が失効したときのメモリーの断片化を防止します。

スラブ割り当てを使用すると、メモリーが 1M バイトのブロック単位で確保されます。スラブは、同じサイズのいくつかのブロックに分割されます。キャッシュに値を格納しようとすると、memcached はキャッシュに追加される値のサイズをチェックし、その項目に適したサイズの割り当てを含むスラブを特定します。項目のサイズに合うスラブがすでに存在する場合は、そのスラブ内のブロックに項目が書き込まれます。

新しい項目が既存のどのブロックのサイズよりも大きい場合は、新しいスラブが作成され、適切なサイズのブロックに分割されます。適切なブロックサイズを持つスラブがすでに存在するが、空きブロックがない場合は、新しいスラブが作成されます。既存の項目を、そのキーに対する既存のブロック割り当てより大きいデータで更新すると、そのキーは適切なスラブに再割り当てされます。

たとえば、最小ブロックのデフォルトのサイズは 88 バイト (値の 40 バイトと、キーおよびフラグデータに対するデフォルトの 48 バイト) です。キャッシュに最初に格納する項目のサイズが 40 バイト未満である場合は、88 バイトのブロックサイズを持つスラブが作成され、値が格納されます。

格納予定のデータサイズがこの値より大きい場合は、ブロックサイズをチャンクサイズ係数の単位で増加させ、値を保持できる大きさのブロックサイズが特定されます。ブロックサイズは常にスケール係数の関数であり、チャンクサイズにちょうど分割できるブロックサイズに丸められます。

この構造の例については、図16.7「memcached でのメモリー割り当て」を参照してください。

図 16.7 memcached でのメモリー割り当て

memcached でのメモリー割り当て

この結果、memcached に割り当てられたメモリーの範囲内に複数のページが割り当てられます。各ページは、(デフォルトで) 1M バイトのサイズを持ち、キー/値ペアを格納するのに必要なチャンクサイズに従って異なる数のチャンクに分割されます。各インスタンスには複数のページが割り当てられ、特定のサイズのチャンクを必要とする新しい項目を作成する必要があるときは、常にページが作成されます。スラブは複数のページで構成される場合があり、スラブ内の各ページには同じ数のチャンクが含まれています。

新しいスラブのチャンクサイズは、ベースとなるチャンクサイズとチャンクサイズ増大係数の組み合わせによって決まります。たとえば、初期のチャンクサイズが 104 バイトで、デフォルトのチャンクサイズ増大係数 (1.25) が使用される場合、次に割り当てられるチャンクサイズは 104*1.25 にもっとも適合する 2 の累乗 (136 バイト) になります。

このようにしてページを割り当てることで、メモリーの断片化が回避されます。ただし、格納するオブジェクトの分布によっては、項目のサイズが大幅に異なる場合に、スラブとチャンクが効果的に分布しなくなる可能性があります。たとえば、各チャンクサイズ内の項目数が比較的少ない場合は、割り当てられた各ページにごく少数のチャンクしか存在しないため、多くのメモリーが無駄になる可能性があります。

-f コマンド行オプションを使用して増大係数を調整すると、この影響を軽減できます。このオプションは、割り当てられたチャンクとスラブをより効果的に利用できるように、適用される増大係数を調整します。現在のスラブ割り当ての統計を確認する方法については、セクション16.6.4.2「memcached のスラブ統計」を参照してください。

オペレーティングシステムでサポートされる場合は、-L コマンド行オプションを指定して memcached を起動することもできます。このオプションは、起動中に大規模メモリーページを使用してすべてのメモリーを事前に割り当てます。これにより、CPU メモリーキャッシュ内のミスの数が減ってパフォーマンスが向上する可能性があります。