0

apc.ini の apc.shm_strings_buffer 設定を理解しようとしています。PHP を再起動した後、APC 管理画面の円グラフは、キャッシュされたエントリがなくても (もちろん apc.php を除いて) 8MB のキャッシュが既に使用されていることを示しています。これは apc.shm_strings_buffer 設定に関連していることがわかりました。

誰かが設定の意味を理解するのを手伝ってくれますか? 構成ファイルには、これが「文字列用に予約された共有メモリ サイズであり、M/G サフィックスが付いている」と記載されていますが、理解できません。

PHP-FPMでAPCを使用しています。

4

1 に答える 1

2

簡単に説明すると、「with M/G suffixe」です。これは、8M に設定すると 8 メガバイトが割り当てられるか、1G で 1 ギガバイトのメモリが割り当てられることを意味します。

説明が難しいのは、APC がオペコードをコンパイルしてキャッシュするときに内部的に使用される文字列を格納するためのキャッシュであることです。

config 値はこの変更で導入され、変更の大部分はapc_string.cを APC プロジェクトに追加することでした。その C ファイルで定義されている主な関数は、apc_compile.c でapc_new_interned_string使用されます。apc_string_pmemcpy文字列を格納するための残りの APC モジュール。

たとえば、apc_compile.c で

/* private members are stored inside property_info as a mangled
 * string of the form:
 *      \0<classname>\0<membername>\0
 */
CHECK((dst->name = apc_string_pmemcpy((char *)src->name, src->name_length+1, pool TSRMLS_CC)));

APC が文字列を保存しようとすると、関数apc_new_interned_stringは文字列のハッシュを実行して、その文字列が既にメモリに保存されているかどうかを確認し、既にメモリに保存されている場合は、保存された文字列の前のインスタンスを返します。

その文字列がまだキャッシュに格納されていない場合にのみ、文字列を格納するために新しいメモリが割り当てられます。

PHP-FPM を使用して PHP を実行している場合、格納された文字列のキャッシュが単一のプール内のすべてのワーカー間で共有されていることを 90% 確信していますが、それでも再確認しています。

共有文字列の保存に割り当てられる全体のサイズは、PHP の起動時に割り当てられます。動的に割り当てられるわけではありません。そのため、実際にはまだほとんど文字列がキャッシュされていないにもかかわらず、APC が文字列キャッシュに使用された 8MB を示していることが予想されます。

編集

これはそれが何をするのか答えますが、共有文字列バッファーの使用量を確認する方法がわからないため、何に設定する必要があるかを知る方法はありません。

于 2013-06-14T14:25:57.147 に答える