ホームページ > バックエンド開発 > PHPチュートリアル > memcached の包括的な分析 – 2. memcached のメモリ ストレージを理解する_PHP チュートリアル

memcached の包括的な分析 – 2. memcached のメモリ ストレージを理解する_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:38:09
オリジナル
753 人が閲覧しました


公開日: 2008/7/9
元リンク: http://gihyo.jp/dev/feature/01/memcached/0002

このシリーズ記事へのリンクはこちら:

  • 1回目: http://www.phpchina.com/html/29/n-35329.html
  • 2回目: http://www.phpchina.com/html/30/n-35330.html
  • 3回目: http://www.phpchina.com/html/31/n-35331.html
  • 4回目: http://www.phpchina.com/html/32/n-35332.html
  •  href="http://www.phpchina.com/html/32/n-35332.html">
  • 5回目: http://www.phpchina.com/html/32/n-35333.html
  •  href="http://www.phpchina.com/html/32/n-35333.html"> href="http://www.phpchina.com/html/32/n-35332.html">
    スラブ割り当てメカニズム: 再利用のためにメモリを整理する
    • スラブ割り当ての主な用語
  • Slab でレコードをキャッシュする原理
  • Slab Allocator の欠点
  • Growth Factor を使用したチューニング
  • memcached の内部ステータスを表示する
  • スラブの使用状況を表示する
  • メモリストレージの概要
mixi の研究員です株式会社開発チームの前坂徹です。前回の記事では、分散キャッシュサーバーとして memcached を紹介しました。 今回はmemcachedの内部構造の実装とメモリ管理の方法を紹介します。 さらに、memcached の内部構造に起因する弱点についても説明します。

スラブ割り当てメカニズム: 再利用のためにメモリを整理します

最近の memcached は、メモリの割り当てと管理にデフォルトで Slab Allocator と呼ばれるメカニズムを使用します。 このメカニズムが登場する前は、メモリ割り当てはすべてのレコードを単純に再配置して解放することによって実行されていました。 ただし、このアプローチではメモリの断片化が発生し、オペレーティング システムのメモリ マネージャーの負担が増加し、最悪の場合、オペレーティング システムが memcached プロセス自体よりも遅くなる可能性があります。 Slab Allocator は、この問題を解決するために生まれました。

Slab Allocator の原理を見てみましょう。 memcached のドキュメントからのスラブ アロケーターの目標は次のとおりです:

memcached のスラブ サブシステムの主な目標は、いくつかの事前に決定されたサイズのクラスからの固定サイズのメモリ チャンクを使用することで、メモリの断片化の問題を完全に排除することでした。

それは、 , Slab Allocator の基本原理は、割り当てられたメモリをあらかじめ決められたサイズに従って特定の長さのブロックに分割し、メモリの断片化の問題を完全に解決することです。

スラブ割り当ての原理は非常にシンプルです。 割り当てられたメモリをさまざまなサイズのチャンクに分割し、同じサイズのチャンクをグループ (チャンクのセット) に分割します (図 1)。

memcached の包括的な分析 – 2. memcached のメモリ ストレージを理解する_PHP チュートリアル図1 スラブアロケーションの構造図

さらに、スラブアロケータには、割り当てられたメモリを再利用する目的もあります。 つまり、割り当てられたメモリは解放されず、再利用されます。

スラブ割り当ての主な用語

ページ

スラブに割り当てられるメモリ空間、デフォルトは1MBです。スラブに割り当てられた後、スラブのサイズに応じてチャンクに分割されます。

Chunk

レコードをキャッシュするために使用されるメモリ空間。

スラブクラス

特定のサイズのチャンクのグループ。

スラブでレコードをキャッシュする原理

以下では、memcached がどのようにスラブを選択し、クライアントによって送信されたデータをチャンクにキャッシュするかを説明します。

memcached は、受信したデータのサイズに基づいて、データ サイズに最適なスラブを選択します (図 2)。 Memcached は、空きチャンクのリストをスラブに保存し、リストに基づいてチャンクを選択し、その中にデータをキャッシュします。

memcached の包括的な分析 – 2. memcached のメモリ ストレージを理解する_PHP チュートリアル図2 レコードを格納するグループの選択方法

実は、Slab Allocatorにもメリットとデメリットがあります。以下にその欠点を紹介します。

Slab Allocator の欠点

Slab Allocator は元のメモリ断片化の問題を解決しましたが、新しいメカニズムは memcached に新しい問題ももたらしました。

問題は、特定の長さのメモリが割り当てられるため、割り当てられたメモリを有効に利用できないことです。 たとえば、100 バイトのデータが 128 バイトのチャンクにキャッシュされる場合、残りの 28 バイトは無駄になります (図 3)。

memcached の包括的な分析 – 2. memcached のメモリ ストレージを理解する_PHP チュートリアル図 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の内部ステータスを表示する

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 は次のアドレスから取得できます:

  • http://tangent.org/552/libmemcached.html

スラブの使用法を表示します

memcached の作成者は、Brad によって書かれた memcached-tool と呼ばれます。スラブの使用状況を簡単に取得できる Perl スクリプト (memcached の戻り値を読みやすい形式に整理します)。スクリプトは次のアドレスから入手できます:

  • http://code.sixapart.com/svn/memcached/trunk/server/scripts/memcached-tool

使用方法も非常に簡単です:

$ 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 スラブに割り当てられたページ数 カウント スラブに空きチャンクが含まれているか? このスクリプトから取得される情報は、チューニングに非常に便利なので、強くお勧めします。

メモリストレージのまとめ

今回はmemcachedのキャッシュの仕組みとチューニング方法について簡単に説明します。 読者が memcached のメモリ管理原則とその利点と欠点を理解できることを願っています。

次回も引き続き、LRUとExpireの原理、そしてmemcached(プラガブルアーキチャー)の最新の開発方向について説明していきます。

著作権声明

: 自由に再印刷することができますが、再印刷する場合は、元の著者であるチャーリー、元のリンク、およびこの声明を明記する必要があります。

http://www.bkjia.com/PHPjc/735133.html

tru​​ehttp://www.bkjia.com/PHPjc/735133.html技術記事以下は「Memcached の徹底分析」の後編です。 公開日: 2008/7/9 オリジナルリンク: http://gihyo.jp/dev/feature/01/memcached/0002 この連載記事へのリンクはこちら: Chapter...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート