3

CentOS で WSGI を使用して Django 1.4 を実行しています。Apache はプリフォークですが、デーモン モードでは構成されていません。8 つの子プロセスが開始されます。子プロセスの 1 つ (要求を処理していたプロセス) の常駐メモリ サイズを 555 MB (100 MB から) にするデータベース クエリを実行しました。私のコードでは、pyodbc カーソルを使用して行をフェッチしています。データは、グローバル変数など、どこにも保存されていません。

JSON 応答は、シリアライズされたデータとともにサーバーに送り返されます。この時点で常駐メモリは 100 MB に戻ると思いますが、555 MB のままです。
後続のクエリはメモリ サイズを増加させません (555 MB のままです)。これは、メモリ リークではなく、子プロセスが単にメモリを解放していないという仮説を立てます。

また、Windows で Django 組み込み開発サーバーを使用して同じ一連の手順を実行すると、サイズは 500 MB になりますが、100 MB 未満に戻ります。

何か案は?

4

1 に答える 1

2

見に行くことをお勧めします:

言及されているApacheのMaxMemFreeディレクティブに注意してください。

1 つの非常に大きな応答を 1 つの文字列として返し、使用している Apache 出力フィルタが何であれ、出力フィルタが処理している間に Apache がメモリを複製する原因になっているようです。MaxMemFree に制限のない Apache 2.2 を使用している場合、メモリが再利用されずに Apache メモリ プールのサイズが膨張する可能性があります。

問題が応答のサイズである場合は、JSON エンコーダーがそれを構築するときにそれをファイルにストリーミングする可能性があります。次に、ファイルの内容をストリーミングします。

メモリ使用量の原因がクエリ対象のデータベース データである場合は、クエリの実行方法と、すべてのデータが必要かどうかを確認する必要があります。

于 2013-05-15T23:51:47.270 に答える