以下は「Memcachedの総合分析」の後編です。
公開日: 2008/7/9
元リンク: http://gihyo.jp/dev/feature/01/memcached/0002
このシリーズ記事へのリンクはこちら:
ページ
スラブに割り当てられるメモリ空間、デフォルトは1MBです。スラブに割り当てられた後、スラブのサイズに応じてチャンクに分割されます。Chunk
レコードをキャッシュするために使用されるメモリ空間。スラブクラス
特定のサイズのチャンクのグループ。 スラブでレコードをキャッシュする原理 以下では、memcached がどのようにスラブを選択し、クライアントによって送信されたデータをチャンクにキャッシュするかを説明します。 memcached は、受信したデータのサイズに基づいて、データ サイズに最適なスラブを選択します (図 2)。 Memcached は、空きチャンクのリストをスラブに保存し、リストに基づいてチャンクを選択し、その中にデータをキャッシュします。 図2 レコードを格納するグループの選択方法実は、Slab Allocatorにもメリットとデメリットがあります。以下にその欠点を紹介します。 Slab Allocator の欠点 Slab Allocator は元のメモリ断片化の問題を解決しましたが、新しいメカニズムは memcached に新しい問題ももたらしました。 問題は、特定の長さのメモリが割り当てられるため、割り当てられたメモリを有効に利用できないことです。 たとえば、100 バイトのデータが 128 バイトのチャンクにキャッシュされる場合、残りの 28 バイトは無駄になります (図 3)。 図 3 チャンクスペースの使用法 現在、この問題に対する完璧な解決策はありませんが、より効果的な解決策がドキュメントに記載されています。 無駄を削減する最も効率的な方法は、この特定の memcached インストールのクライアントが格納する可能性が高いオブジェクトの一般的なサイズに (可能であれば) 厳密に一致するサイズ クラスのリストを使用することです。つまり、クライアントが送信するデータの一般的なサイズが事前にわかっている場合や、同じサイズのデータのみをキャッシュする場合には、データサイズに適したグループのリストを使用するだけで無駄を削減できます。
しかし残念ながら、まだ最適化はできず、将来のバージョンに期待することしかできません。 ただし、スラブ クラス サイズの違いは調整できます。 次に、グロースファクターオプションについて説明します。
memcached は開始時に成長係数を指定します (-f オプション経由)。スラブ間の差異をある程度制御できます。デフォルト値は 1.25 です。 ただし、このオプションが利用可能になる前は、この係数は「2 の累乗」戦略として知られる 2 に固定されていました。
前の設定を使用して、memcached を冗長モードで起動してみましょう:
$ memcached -f 2 -vv
以下は起動後の冗長出力です:
slab class 1: chunk size 128 perslab 8192 slab class 2: chunk size 256 perslab 4096 slab class 3: chunk size 512 perslab 2048 slab class 4: chunk size 1024 perslab 1024 slab class 5: chunk size 2048 perslab 512 slab class 6: chunk size 4096 perslab 256 slab class 7: chunk size 8192 perslab 128 slab class 8: chunk size 16384 perslab 64 slab class 9: chunk size 32768 perslab 32 slab class 10: chunk size 65536 perslab 16 slab class 11: chunk size 131072 perslab 8 slab class 12: chunk size 262144 perslab 4 slab class 13: chunk size 524288 perslab 2
128 バイトのグループから開始して、グループ サイズが 128 バイトのグループに向かって順番に増加することがわかります。オリジナルは2回。 この設定の問題は、スラブ間の差が比較的大きく、場合によってはメモリをかなり無駄に消費することです。 したがって、メモリの無駄を最小限に抑えるために、2 年前に成長因子オプションが追加されました。
現在のデフォルト設定 (f=1.25) での出力を見てみましょう (スペースの制限があるため、ここでは 10 番目のグループのみが書かれています):
slab class 1: chunk size 88 perslab 11915 slab class 2: chunk size 112 perslab 9362 slab class 3: chunk size 144 perslab 7281 slab class 4: chunk size 184 perslab 5698 slab class 5: chunk size 232 perslab 4519 slab class 6: chunk size 296 perslab 3542 slab class 7: chunk size 376 perslab 2788 slab class 8: chunk size 472 perslab 2221 slab class 9: chunk size 592 perslab 1771 slab class 10: chunk size 744 perslab 1409
グループ間のギャップが、係数が 2 の場合、これは数百バイトのレコードをキャッシュするのに適しています。 上記の出力結果から判断すると、いくつかの計算エラーがあるように感じられるかもしれません。これらのエラーは、バイト数の整列を維持するために意図的に設定されています。
memcached を製品に導入する場合、またはデフォルト値を使用して直接デプロイする場合は、予想されるデータの平均長を再計算し、成長係数を調整して最適な設定を得ることが最善です。記憶は貴重なリソースであり、無駄にするのはもったいないです。
次に、memcachedのstatsコマンドを使用して、スラブの使用率やその他のさまざまな情報を確認する方法を紹介します。
memcachedにはstatsというコマンドがあり、これを利用することで様々な情報を取得することができます。 コマンドを実行するには多くの方法がありますが、Telnet が最も簡単です:
$ telnet 主机名 端口号
memcached に接続した後、stats を入力して Enter を押し、リソース使用率を含むさまざまな情報を取得します。 さらに、「統計スラブ」または「統計項目」を入力して、キャッシュされたレコードに関する情報を取得します。 プログラムを終了するには、「quit」と入力してください。
これらのコマンドの詳細については、memcached ソフトウェア パッケージのprotocol.txt ドキュメントを参照してください。
$ telnet localhost 11211 Trying ::1... Connected to localhost. Escape character is '^]'. stats STAT pid 481 STAT uptime 16574 STAT time 1213687612 STAT version 1.2.5 STAT pointer_size 32 STAT rusage_user 0.102297 STAT rusage_system 0.214317 STAT curr_items 0 STAT total_items 0 STAT bytes 0 STAT curr_connections 6 STAT total_connections 8 STAT connection_structures 7 STAT cmd_get 0 STAT cmd_set 0 STAT get_hits 0 STAT get_misses 0 STAT evictions 0 STAT bytes_read 20 STAT bytes_written 465 STAT limit_maxbytes 67108864 STAT threads 4 END quit
また、C/C++言語のクライアントライブラリであるlibmemcachedをインストールすると、memstatコマンドもインストールされます。 利用方法は非常に簡単で、telnetと同様の情報を少ない手順で取得でき、複数のサーバーから一度に情報を取得することもできます。
$ memstat --servers=server1,server2,server3,...
libmemcached は次のアドレスから取得できます:
memcached の作成者は、Brad によって書かれた memcached-tool と呼ばれます。スラブの使用状況を簡単に取得できる Perl スクリプト (memcached の戻り値を読みやすい形式に整理します)。スクリプトは次のアドレスから入手できます:
使用方法も非常に簡単です:
$ memcached-tool 主机名:端口 选项
スラブの使用状況を確認する オプションを指定する必要はないので、以下のコマンドを実行するだけです:
$ memcached-tool 主机名:端口
取得される情報は次のとおりです:
# Item_Size Max_age 1MB_pages Count Full? 1 104 B 1394292 s 1215 12249628 yes 2 136 B 1456795 s 52 400919 yes 3 176 B 1339587 s 33 196567 yes 4 224 B 1360926 s 109 510221 yes 5 280 B 1570071 s 49 183452 yes 6 352 B 1592051 s 77 229197 yes 7 440 B 1517732 s 66 157183 yes 8 552 B 1460821 s 62 117697 yes 9 696 B 1521917 s 143 215308 yes 10 872 B 1695035 s 205 246162 yes 11 1.1 kB 1681650 s 233 221968 yes 12 1.3 kB 1603363 s 241 183621 yes 13 1.7 kB 1634218 s 94 57197 yes 14 2.1 kB 1695038 s 75 36488 yes 15 2.6 kB 1747075 s 65 25203 yes 16 3.3 kB 1760661 s 78 24167 yes
各列の意味は次のとおりです:
列の意味 #スラブクラス番号Item_SizeChunkサイズMax_ageLRU 内の最も古いレコードの存続時間 1MB_pages スラブに割り当てられたページ数 カウント スラブに空きチャンクが含まれているか? このスクリプトから取得される情報は、チューニングに非常に便利なので、強くお勧めします。メモリストレージのまとめ
次回も引き続き、LRUとExpireの原理、そしてmemcached(プラガブルアーキチャー)の最新の開発方向について説明していきます。
著作権声明: 自由に再印刷することができますが、再印刷する場合は、元の著者であるチャーリー、元のリンク、およびこの声明を明記する必要があります。
http://www.bkjia.com/PHPjc/735133.html