Python subprocess.Popen「OSError:[Errno 12]メモリを割り当てられません」


114

注:この質問はもともとここで尋ねられたものですが、許容できる回答が実際には見つからなかったにもかかわらず、賞金の期限が切れました。元の質問で提供されたすべての詳細を含めて、この質問を再質問します。

Pythonスクリプトは、schedモジュールを使用して60秒ごとに一連のクラス関数を実行してます。

# sc is a sched.scheduler instance
sc.enter(60, 1, self.doChecks, (sc, False))

スクリプトは、ここのコードを使用してデーモン化されたプロセスとして実行されています

doChecksの一部として呼び出される多くのクラスメソッドは、サブプロセスモジュールを使用してシステム関数を呼び出し、システム統計を取得します。

ps = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE).communicate()[0]

これは、スクリプト全体が次のエラーでクラッシュするまでの期間、正常に実行されます。

File "/home/admin/sd-agent/checks.py", line 436, in getProcesses
File "/usr/lib/python2.4/subprocess.py", line 533, in __init__
File "/usr/lib/python2.4/subprocess.py", line 835, in _get_handles
OSError: [Errno 12] Cannot allocate memory

スクリプトがクラッシュした後のサーバー上のfree -mの出力は次のとおりです。

$ free -m
                  total       used       free     shared     buffers    cached
Mem:                894        345        549          0          0          0
-/+ buffers/cache:  345        549
Swap:                 0          0          0

サーバーはCentOS 5.3を実行しています。自分のCentOSボックスで再現することも、他のユーザーが同じ問題を報告することもできません。

元の質問で提案されているように、これをデバッグするためにいくつかのことを試しました:

  1. Popen呼び出しの前後のfree -mの出力をログに記録します。メモリ使用量に大きな変化はありません。つまり、スクリプトの実行中にメモリが徐々に使い果たされていません。

  2. Popen呼び出しにclose_fds = Trueを追加しましたが、違いはありませんでした。同じエラーでスクリプトがクラッシュしました。ここここで提案。

  3. ここで提案されているように、RLIMIT_DATAとRLIMIT_ASの両方で(-1、-1)を示したrlimitsを確認しました

  4. スワップスペースがないことが原因である可能性があることが記事で示唆されていますが、実際にはスワップがオンデマンドで利用可能であり(Webホストによると)、これもここで偽の原因として提案されました。

  5. これは、Pythonソースコードとここでのコメントによってバックアップされた.communicate()を使用する動作であるため、プロセスは閉じられています

チェック全体は、GitHubの 442行目から定義されたgetProcesses関数を使用し確認できます。これは、520行目からdoChecks()によって呼び出されます。

スクリプトは、クラッシュする前に次の出力でstraceを使用して実行されました。

recv(4, "Total Accesses: 516662\nTotal kBy"..., 234, 0) = 234
gettimeofday({1250893252, 887805}, NULL) = 0
write(3, "2009-08-21 17:20:52,887 - checks"..., 91) = 91
gettimeofday({1250893252, 888362}, NULL) = 0
write(3, "2009-08-21 17:20:52,888 - checks"..., 74) = 74
gettimeofday({1250893252, 888897}, NULL) = 0
write(3, "2009-08-21 17:20:52,888 - checks"..., 67) = 67
gettimeofday({1250893252, 889184}, NULL) = 0
write(3, "2009-08-21 17:20:52,889 - checks"..., 81) = 81
close(4)                                = 0
gettimeofday({1250893252, 889591}, NULL) = 0
write(3, "2009-08-21 17:20:52,889 - checks"..., 63) = 63
pipe([4, 5])                            = 0
pipe([6, 7])                            = 0
fcntl64(7, F_GETFD)                     = 0
fcntl64(7, F_SETFD, FD_CLOEXEC)         = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7f12708) = -1 ENOMEM (Cannot allocate memory)
write(2, "Traceback (most recent call last"..., 35) = 35
open("/usr/bin/sd-agent/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/usr/bin/sd-agent/agent."..., 52) = 52
open("/home/admin/sd-agent/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/home/admin/sd-agent/dae"..., 60) = 60
open("/usr/bin/sd-agent/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/usr/bin/sd-agent/agent."..., 54) = 54
open("/usr/lib/python2.4/sched.py", O_RDONLY|O_LARGEFILE) = 8
write(2, "  File \"/usr/lib/python2.4/sched"..., 55) = 55
fstat64(8, {st_mode=S_IFREG|0644, st_size=4054, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d28000
read(8, "\"\"\"A generally useful event sche"..., 4096) = 4054
write(2, "    ", 4)                     = 4
write(2, "void = action(*argument)\n", 25) = 25
close(8)                                = 0
munmap(0xb7d28000, 4096)                = 0
open("/usr/bin/sd-agent/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/usr/bin/sd-agent/checks"..., 60) = 60
open("/usr/bin/sd-agent/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/usr/bin/sd-agent/checks"..., 64) = 64
open("/usr/lib/python2.4/subprocess.py", O_RDONLY|O_LARGEFILE) = 8
write(2, "  File \"/usr/lib/python2.4/subpr"..., 65) = 65
fstat64(8, {st_mode=S_IFREG|0644, st_size=39931, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d28000
read(8, "# subprocess - Subprocesses with"..., 4096) = 4096
read(8, "lso, the newlines attribute of t"..., 4096) = 4096
read(8, "code < 0:\n        print >>sys.st"..., 4096) = 4096
read(8, "alse does not exist on 2.2.0\ntry"..., 4096) = 4096
read(8, " p2cread\n        # c2pread    <-"..., 4096) = 4096
write(2, "    ", 4)                     = 4
write(2, "errread, errwrite)\n", 19)    = 19
close(8)                                = 0
munmap(0xb7d28000, 4096)                = 0
open("/usr/lib/python2.4/subprocess.py", O_RDONLY|O_LARGEFILE) = 8
write(2, "  File \"/usr/lib/python2.4/subpr"..., 71) = 71
fstat64(8, {st_mode=S_IFREG|0644, st_size=39931, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d28000
read(8, "# subprocess - Subprocesses with"..., 4096) = 4096
read(8, "lso, the newlines attribute of t"..., 4096) = 4096
read(8, "code < 0:\n        print >>sys.st"..., 4096) = 4096
read(8, "alse does not exist on 2.2.0\ntry"..., 4096) = 4096
read(8, " p2cread\n        # c2pread    <-"..., 4096) = 4096
read(8, "table(self, handle):\n           "..., 4096) = 4096
read(8, "rrno using _sys_errlist (or siml"..., 4096) = 4096
read(8, " p2cwrite = None, None\n         "..., 4096) = 4096
write(2, "    ", 4)                     = 4
write(2, "self.pid = os.fork()\n", 21)  = 21
close(8)                                = 0
munmap(0xb7d28000, 4096)                = 0
write(2, "OSError", 7)                  = 7
write(2, ": ", 2)                       = 2
write(2, "[Errno 12] Cannot allocate memor"..., 33) = 33
write(2, "\n", 1)                       = 1
unlink("/var/run/sd-agent.pid")         = 0
close(3)                                = 0
munmap(0xb7e0d000, 4096)                = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x589978}, {0xb89a60, [], SA_RESTORER, 0x589978}, 8) = 0
brk(0xa022000)                          = 0xa022000
exit_group(1)                           = ?

1
「パイプ」、ファイル記述子、またはこれらに関連するカーネルリソースが不足していますか?
Blauohr

チェック/var/log/messages、またはdmesgコマンド。
mark4o 2009

これに関連するログには何もありません。
davidmytton 2009

これに対する解決策を得たことがありますか?非常に似た症状があります。私には十分な予備メモリがありますが、スワップを追加した後(いくつかの回答が示唆するように)、問題はなくなります。あなたはその時から今までの数ヶ月間に何かを見つけたのかと思っただけです。-ありがとう!
dpb 2012年

私は同じ問題に遭遇していますが、解決策はありません-アイデアはありますか?

回答:


88

一般的なルール(IEでバニラカーネル)として、fork/ cloneと障害ENOMEM 、具体的に発生理由のいずれかの神、メモリ不足の状態に正直dup_mmdup_task_structalloc_pidmpol_dupmm_initなどしゃがれ声)、またはので、security_vm_enough_memory_mmあなたを失敗しながら、強制オーバーコミットポリシーを

フォークの試行時に、フォークに失敗したプロセスのvmsizeを確認することから始め、次にオーバーコミットポリシーに関連する空きメモリ(物理およびスワップ)の量と比較します(数値をプラグインします)。

特定のケースでは、Virtuozzoには 追加チェックオーバーコミット執行を。さらに、私はあなたがコンテナからスワップとオーバーコミット設定をどの程度制御できるかわかりません(制御の結果に影響を与えるために)。

さて、実際に前進するために、私はあなたに2つのオプション残っていると言います

  • より大きなインスタンスに切り替える、または
  • コーディングの労力をかける スクリプトのメモリフットプリントより効果的に制御する費やす

NOTEそれはそれはあなたではないことが判明したが、いくつかの他の男はあなたがamockを実行するのと同じサーバー上の別のインスタンスに併置場合のコーディング作業が無駄にすべてであってもよいこと。

メモリに関してsubprocess.Popenforkclone 、内部/使用されていることすでにわかっています。つまり、呼び出すたびに、Pythonがすでに消費しているメモリと同じ量のメモリを要求していることになります。つまり、、つまり、何百もの追加のMBやexecなどのちっぽけな10kB実行可能ファイル。不利なオーバーコミットポリシーの場合は、すぐに表示されます。freepsENOMEM

それに代わる方法としてfork、この親ページテーブルなどのコピーの問題はvforkありませんposix_spawn。ただしsubprocess.Popenvfork/の観点からチャンクを書き換える気がなければ、スクリプトの最初(Pythonのメモリフットプリントが最小の場合)に1回だけposix_spawn使用して、次に実行するシェルスクリプトsuprocess.Popen生成することを検討してください/freeps / sleep及び任意の他のAでスクリプトと並行してループします。スクリプトの出力をポーリングするか、同期的に読み取ります。非同期で処理する他のものがあれば、別のスレッドから読み取る可能性があります。Pythonでデータを処理しますが、フォークは下位プロセスに任せます。

ただし、特定のケースでは、呼び出しpsfree完全にスキップできます。この情報はprocfs、自分でアクセスするか、既存のライブラリやパッケージを介してアクセスするかに関係なく、Pythonで直接利用できます。場合psfree唯一のユーティリティは、あなたが実行していたし、その後のことができますを廃止subprocess.Popen完全に

最後に、subprocess.Popen関係する限り、スクリプトでメモリリークが発生しても、最終的には壁にぶつかります。それを監視し、メモリリークチェックします


7
ガベージコレクターがしばらく実行されていなかった場合は、gc.collect()直前に実行するとsubprocess.Popen役立つことがわかりました。
letmaik 14

私は、ヘルパースクリプト戦略を処理するためのデーモンを書いた:github.com/SeanHayes/errand-boy 私は私のクライアントの一つと私たちの「メモリを割り当てることができません」のトラブルはなくなっていると生産にそれを使用しています。
–SeánHayes 14

簡単な診断を/proc/fd/maps
お願いし

18

出力を見ると、free -m実際には使用可能なスワップメモリ​​がないようです。Linuxでスワップが常にオンデマンドで自動的に利用可能になるかどうかはわかりませんが、同じ問題が発生しており、ここでの回答のどれも役に立ちませんでした。ただし、スワップメモリ​​を追加すると、私の問題が修正され、同じ問題に直面している他の人に役立つ可能性があるため、1 GBのスワップを追加する方法について回答を投稿します(Ubuntu 12.04でも、他のディストリビューションでも同様に機能するはずです)。

最初に、有効なスワップメモリ​​があるかどうかを確認できます。

$sudo swapon -s

空の場合は、有効なスワップがないことを意味します。1GBのスワップを追加するには:

$sudo dd if=/dev/zero of=/swapfile bs=1024 count=1024k
$sudo mkswap /swapfile
$sudo swapon /swapfile

次の行をに追加fstabして、スワップを永続的にします。

$sudo vim /etc/fstab

     /swapfile       none    swap    sw      0       0 

ソースと詳細情報はここにあります


1
それで同じ問題またはその他の問題は解決しましたか?
Dima Tisnek

CentOS 6.4では、これでうまくいきました。awstatsのインストール中にエラーが発生しました。ありがとうございます。
Ruslan Abuzant 2016

これでコードを実行できるようになりましたが、実際には問題に対処していません。これはおそらく私が使用するライブラリにあります。
philmaweb

1
あなたは私の問題を修正しました。ありがとう!+1
sscirrus 2017年

8

スワップは以前に提案された赤いニシンではないかもしれません。直前の問題のpythonプロセスの大きさはENOMEM

カーネル2.6の下で/proc/sys/vm/swappiness、カーネルがスワップをどの程度積極的に切り替えるかを制御し、カーネルがovercommit*ウィンクとノッドでメモリをどのくらい正確に配分できるかをファイルします。Facebookの関係ステータスと同様に、それは複雑です。

...しかし、実際にはスワップはオンデマンドで利用できます(Webホストによると)...

ただし、free(1)コマンドの出力に従っていないため、サーバーインスタンスによって認識されるスワップ領域はありません。さて、あなたのウェブホストは確かにこのトピックについて私よりはるかに多くを知っているかもしれませんが、私が使用した仮想RHEL / CentOSシステムはゲストOSで利用可能なスワップを報告しています。

Red Hat KB Article 15252の適応:

Red Hat Enterprise Linux 5システムは、匿名メモリとシステムV共有メモリの合計がRAMの約3/4未満である限り、スワップスペースがなくても問題なく動作します。.... RAMが4GB以下のシステムで 、最低2GBのスワップ領域が[推奨されます]

/proc/sys/vm設定をプレーンなCentOS 5.3インストールと比較します。スワップファイルを追加します。ラチェットを下げてswappiness、あなたがもう生きているかどうか確かめてください。


Pythonプロセスのサイズを確認する最良の方法は何ですか?PS?
davidmytton

ps -o user,pid,vsz="Mem(Kb)" -o cmd $PYTHON_PIDやtop(1)のようなものがそれを行うべきです。
ピルクロー2009

7

簡単に修正するには、

echo 1 > /proc/sys/vm/overcommit_memory

システムに十分なメモリがあることが確実な場合。Linux over commit heuristicを参照してください。


1
どうもありがとうございます!そのような簡単な解決策、あなたは私の日を救いました)
igolkotek

5

私はあなたの顧客/ユーザーがclone()システムコールを妨害しているカーネルモジュールまたはドライバーをロードしていることを疑い続けています(おそらく、LIDSなどのあいまいなセキュリティ強化ですが、カーネルデータ構造のいくつかを埋めています)。fork()/のために必要ですclone()が動作する(プロセステーブル、ページテーブル、ファイル記述子テーブルなど)。

fork(2)manページの関連部分は次のとおりです。

エラー
       EAGAIN fork()は、親のページテーブルをコピーし、タスク構造を割り当てるための十分なメモリを割り当てることができません
              子。

       EAGAIN呼び出し元のRLIMIT_NPROCリソース制限が発生したため、新しいプロセスを作成できませんでした。に
              この制限を超える場合、プロセスにはCAP_SYS_ADMINまたはCAP_SYS_RESOURCE機能のいずれかが必要です。

       ENOMEM fork()は、メモリが不足しているため、必要なカーネル構造の割り当てに失敗しました。

ストック、汎用カーネルで起動し、最小限のモジュールとドライバーのセット(アプリケーション/スクリプトを実行するために最低限必要)のみをロードした後、ユーザーにこれを試すことをお勧めします。そこから、それがその構成で機能すると仮定すると、その構成と問題が発生している構成の間でバイナリ検索を実行できます。これは、標準のsysadminトラブルシューティング101です。

あなたの関連する行straceは:

clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7f12708) = -1 ENOMEM (Cannot allocate memory)

...私は他の人がスワップとメモリの可用性について話したことを知っています(そして、RAMディスク上にある場合でも、皮肉なことに、少なくとも小さなスワップパーティションをセットアップすることをお勧めします... Linuxカーネルのコードパス利用可能なスワップがほんの少しでも、利用可能なスワップがゼロであるもの(例外処理パス)よりもはるかに広範囲にわたって実行されています。

しかし、これはまだ赤いニシンだと思います。

freeキャッシュとバッファが使用している0(ゼロ)メモリを報告しているという事実は非常に不安です。ここでのfree出力...とおそらくアプリケーションの問題は、何らかの方法でメモリ割り当てに干渉している独自のカーネルモジュールが原因であると思います。

fork()/ clone()のマニュアルページによると、呼び出しがリソース制限違反(RLIMIT_NPROC)を引き起こす場合、fork()システムコールはEAGAINを返す必要があります...ただし、EAGAINが返されるかどうかはわかりませんその他のRLIMIT *違反。いずれにしても、ターゲット/ホストに何らかの奇妙なVormetricまたはその他のセキュリティ設定がある場合(またはプロセスが何らかの奇妙なSELinuxポリシーで実行されている場合でも)、この-ENOMEM障害が発生している可能性があります。

通常の一般的なLinux / UNIXの問題である可能性はほとんどありません。そこには、非標準的なことが起こっています。


1
サーバーは、仮想化にVirtuozzoを使用するメディアテンプレート(dv)ベースで実行されています。
davidmytton

Virtuozzoメッセージボードとバグ追跡システムを検索し、Virtuozzoサブシステム自体へのアップグレードを探してみてください。
ジム・デニス

2

あなたは使ってみましたか:

(status,output) = commands.getstatusoutput("ps aux")

これでまったく同じ問題が解決したと思いました。しかし、その後、私のプロセスはスポーンに失敗するのではなく、殺されてしまいました。これはさらに悪いことです。

いくつかのテストの結果、これは古いバージョンのpythonでのみ発生することがわかりました:2.6.5では発生しますが、2.7.2では発生しません

私の検索は私をここに導いたpython-close_fds-issueが表示されましたが、closed_fdsの設定を解除しても問題は解決しませんでした。それはまだ一読の価値があります。

私はpythonがそれを監視するだけでファイル記述子をリークしていることを発見しました:

watch "ls /proc/$PYTHONPID/fd | wc -l"

あなたと同じように、コマンドの出力をキャプチャし、OOMエラーを回避したいのですが、バグの少ないバージョンのPythonを使用するのが唯一の方法のようです。理想的ではない...


0

munmap(0xb7d28000、4096)= 0
write(2、 "OSError"、7)= 7

次のようなずさんなコードを見たことがあります。

serrno = errno;
some_Syscall(...)
if (serrno != errno)
/* sound alarm: CATROSTOPHIC ERROR !!! */

これがpythonコードで何が起こっているかを確認する必要があります。Errnoは、進行中のシステムコールが失敗した場合にのみ有効です。

追加するように編集:

このプロセスがどれだけ長く続くかはあなたにはわかりません。メモリの可能な消費者

  • フォークされたプロセス
  • 未使用のデータ構造
  • 共有ライブラリ
  • メモリマップファイル

2
はい、しかし、OPのトレースから、最初のsyscallの失敗-clone()から-が報告されているENOMEMであることがわかります。このエラーは、Cライブラリerrnoが途中で何度もリセットされても、トレースバックの構築を通じてpythonの低メモリの障害に沿って保持されます。
ピルクロウ2009

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.