AWS DynamoPHPAPIを使用するPHPで記述されたスクリプトがあります。ダイナモから大量のデータを取得して処理する長いループを実行します。
'top'を使用してプロセスを見ると、'php'プロセスで使用されているメモリ使用量を確認できます。
スクリプトのループ内で、memory_get_usage(true)の結果を出力します
私がテストを実行するとき、これらの2つの値はリモートでさえ類似していません...
彼らはそうあるべきですか?そうでない場合はどうしてですか?
私のテストでは、1.7 GBのRAMを搭載したサーバーがあり、php.iniのmemory_limitを64Mに設定しました。また、スクリプトの開始時にgc_enable()を呼び出し、各ループの間にガベージコレクションを強制することを期待してgc_collect_cycles()を呼び出します。
'top'を使用してphpスクリプトを見ると、%MEMが上昇しているのがわかります。最終的には、95%を超え、Linuxがphpプロセスを強制終了します。これは'dmesg'を見るとわかります。ループの各反復からのプリントアウトを見ると、memory_get_usage(true)によって報告されたメモリ使用量が50MBを超えることはありません。
Linuxはスクリプトがほぼ1.7GBを使用していると考えていますが、phpは50MBしか使用していないと考えています。
どうしたの?
スクリプトにメモリリークがある場合でも、memory_get_usage(true)がメモリを考慮しない理由がわかりません...
アップデート
ループ内で実行している処理のさまざまな部分をコメントアウトするのに時間を費やした後、次のコードを削除すると、次のことがわかりました。
class cMyClass {
public static function static_cmp_fn(&$a, &$b) {
if ($a['att'] == $b['att']) { return 0; }
$ret = ($a['att'] < $b['att']) ? -1 : +1;
return $ret;
}
function DoProcessing(){
$sort_fn = array("cMyClass", "static_cmp_fn");
usort($this->m_dictToSort, $sort_fn);
unset($sort_fn);
}
}
phpがシステムメモリをすべて消費することはありません。usortがメモリリークを起こしているように見えますが、理由はわかりません。私が理解していないのは、PHPが使用しているメモリの量について間違った情報を報告する理由です...
何か案は?