ユーザーに更新通知を送信するために必要な計算を実行するバッチ ジョブとして、毎日午前 1 時に実行するように設定されたプロセスがあります。
カーネルが毎回プロセスを強制終了している場合、次のメッセージが表示されます。
4 月 8 日 01:06:51 マーサ カーネル: [14697876.360797] メモリ不足: プロセス 20803 (processDirector) スコア 347 を強制終了するか、子を犠牲にします
OS (Ubuntu) がメモリをディスクにダンプしているようです。そのダンプの内容は、S3 から読み込んでいる大きな XML ファイルです。
奇妙なことに、コマンド ラインから ./processDirector としてスクリプトを実行すると、正常に実行されます。
私たちが取得している XML ファイルは、多くの場合、約 40 ~ 70 MB です。Amazon S3 SDK2 を使用しています。これは、XML ファイルを取得するために使用しているコードです。
$result = $s3->getObject(array(
'Bucket' => 'updates-uk',
'Key' => $key,
));
$body = $result->get('Body');
$body->rewind();
return $body->read($result['ContentLength']);
私が疑問に思っているのは、これが cron の構成に問題があり、プロセスが特定の量のメモリしか使用できないということです。
速度を上げ、プログラムが完全な SimpleXML オブジェクトなどを構築する必要がないようにするために、PHP SAX XML パーサーを使用しています。
これを解決する方法に関する私の2つの考えは次のとおりです。
- cron ジョブがより多くのメモリを使用できるようにする方法を確認する
- XML ファイルを段階的にファイルに読み込み、40 ~ 670 MB の完全な XML 文字列をメモリに保持するのではなく、SAX パーサーがファイルから解析するようにします。
これを解決する方法について誰かが考えているなら、私はとても感謝しています。