私は、mysql dbをクエリ(選択)し、一度に最大1k行を読み取り、それらを使用して計算を実行し、それを何時間も繰り返すpythonアプリを実行しています。読み取られるテーブルには最大 20m の読み取りがあり、MyISAM エンジンによって駆動されます。MySQLdb コネクタは、Python から MySQL にアクセスするために使用されます。
問題は、数時間後にすべてのサーバーのメモリが使用され、サーバーに 16 MB のメモリしか使用できないことです。
最初のアイデアは Python アプリのメモリ リークでしたが、memory_profiler と dozer/dowser の両方が、すべての変数が適切に解放されていることを示しました。
次に、リーカーがメモリ不足の前後でプロセスのメモリ使用量のスナップショット (ps vax | sort -k8n) を取得していたことを確認してください。
サーバーに 280 MB の空き容量があったときのスナップショット (mem でソート) (上からの情報): http://pastebin.com/0F3Wht0s 2 時間後... .com/9MJkLX2g
驚いたことに、mysqld プロセスと statcalculator プロセスのメモリ消費量は、時間の経過とともにほぼ同じになっています。
Linuxでのメモリ割り当てに関連する何かが明らかに欠けています。そのメモリを割り当てたプロセスを確認する方法は?
サーバーは Ubuntu Server 10.04 を実行しており、合計 1 GB の RAM を搭載しています。MySQL と MySQLdb は ubuntu リポジトリからのものです。追加情報が必要な場合は、ここに追加します。
TLDR : Python アプリは、選択を使用して mysql から常に読み取りを行っています。この数時間後、メモリはすべてなくなりましたが、top は mysqld プロセスまたは python プロセスのいずれに対してもメモリ割り当ての増加を示していません。