복붙노트

[PYTHON] 파이썬 하위 프로세스. 열기 "OSError : [Errno 12] 메모리를 할당 할 수 없습니다"

PYTHON

파이썬 하위 프로세스. 열기 "OSError : [Errno 12] 메모리를 할당 할 수 없습니다"

참고 :이 질문은 원래 여기에서 묻지 만 수용 가능한 대답이 실제로 발견되지는 않았지만 현상금 기한이 만료되었습니다. 나는 원래의 질문에 제공된 모든 세부 사항을 포함하여이 질문을 다시하고 있습니다.

파이썬 스크립트는 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 상자 나 동일한 문제를보고하는 다른 사용자와 함께 재현 할 수 없습니다.

나는 원래의 질문에서 제안 된대로 이것을 디버깅하기 위해 여러 가지를 시도했다.

전체 검사는 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. ==============================

    1.일반적인 규칙 (즉, 바닐라 커널)에서 ENOMEM을 사용한 fork / clone 실패는 하나님의 메모리 부족 상태 (dup_mm, dup_task_struct, alloc_pid, mpol_dup, mm_init 등의 크랙)에 정직하거나 또는 security_vm_enough_memory_mm 과다한 정책을 시행하는 동안 당신을 실패했습니다.

    일반적인 규칙 (즉, 바닐라 커널)에서 ENOMEM을 사용한 fork / clone 실패는 하나님의 메모리 부족 상태 (dup_mm, dup_task_struct, alloc_pid, mpol_dup, mm_init 등의 크랙)에 정직하거나 또는 security_vm_enough_memory_mm 과다한 정책을 시행하는 동안 당신을 실패했습니다.

    fork를 시도 할 때 포크에 실패한 프로세스의 vmsize를 확인한 다음 초과 커밋 정책과 관련된 여유 메모리 (물리적 및 스왑)의 양을 비교합니다 (숫자를 연결).

    특별한 경우, Virtuozzo에는 추가 커밋 적용에 대한 추가 검사가 있습니다. 또한 컨테이너 내에서 스왑 및 오버 커밋 구성에 대한 통제력 (실행 결과에 영향을 미치기 위해)을 실제로 확신 할 수 없습니다.

    이제 실제로 앞으로 나아갈 수 있도록 두 가지 옵션이 남아 있다고 말하고 싶습니다.

    다른 사람이 당신과 같은 서버에있는 다른 인스턴스에 묶여있을 때, 당신이 아니라는 것을 알게되면, 코딩 노력은 전혀 도움이되지 않을 것입니다.

    메모리 방식으로, 우리는 이미 서브 프로세스를 알고 있습니다 .Popen은 후드에서 fork / clone을 사용합니다. 즉, 파이썬이 이미 먹어 버린만큼의 메모리, 즉 수백 MB의 추가 메모리를 요청하면, 모두 무료 또는 ps와 같은 실행 가능한 10kB 실행 파일을 실행하기 위해 모두. 바람직하지 않은 초과 커밋 정책의 경우 곧 ENOMEM이 표시됩니다.

    부모 페이지 테이블 등 복사 문제가없는 포크 대신 vfork 및 posix_spawn을 사용할 수 있습니다. 그러나 하위 프로세스의 덩어리를 다시 작성하는 기분이 들지 않으면 vfork / posix_spawn 측면에서 스크립트의 시작 부분 (Python의 메모리 공간이 최소 일 때)에서 한 번만 suprocess.Popen을 사용하여 쉘 스크립트를 생성하십시오 free / ps / sleep과 스크립트에 평행 한 루프의 다른 것을 실행합니다. 비동기 적으로 돌볼 다른 것들이 있다면 스크립트의 출력을 폴링하거나 동 기적으로 읽을 수 있습니다. 파이썬에서 데이터를 처리하지만 하위 프로세스로 분기를 남겨 둡니다.

    그러나 특별한 경우에는 ps를 호출하지 않고 건너 뛰어도됩니다. 이 정보는 직접 또는 기존 라이브러리 및 / 또는 패키지를 통해 액세스할지 여부에 상관없이 procfs에서 직접 Python으로 쉽게 사용할 수 있습니다. ps 및 free가 실행중인 유일한 유틸리티 인 경우 하위 프로세스를 사용하지 않을 수 있습니다. 완전히 열어 두십시오.

    마지막으로, 하위 프로세스까지 무엇을 하든지 .Popen은 스크립트에 메모리가 누출되면 결국 벽에 부딪 힐 수 있습니다. 그것에 주목하고 메모리 누수를 확인하십시오.

  2. ==============================

    2.free -m의 출력을 보면 실제로 스왑 메모리를 사용할 수없는 것으로 보인다. Linux에서 스왑은 항상 자동으로 요청에 따라 사용할 수 있을지는 모르겠지만 동일한 문제가 있었지만 여기에 나온 답변 중 아무 것도 나를 도왔습니다. 그러나 스왑 메모리를 추가하면 내 문제가 해결되어 다른 사람들이 같은 문제에 직면하는 데 도움이 될 수 있으므로 1GB 스왑을 추가하는 방법에 대한 답을 게시합니다 (우분투 12.04에서는 다른 배포본에서도 비슷하게 작동합니다).

    free -m의 출력을 보면 실제로 스왑 메모리를 사용할 수없는 것으로 보인다. Linux에서 스왑은 항상 자동으로 요청에 따라 사용할 수 있을지는 모르겠지만 동일한 문제가 있었지만 여기에 나온 답변 중 아무 것도 나를 도왔습니다. 그러나 스왑 메모리를 추가하면 내 문제가 해결되어 다른 사람들이 같은 문제에 직면하는 데 도움이 될 수 있으므로 1GB 스왑을 추가하는 방법에 대한 답을 게시합니다 (우분투 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 
    

    근원 및 더 많은 정보는 여기에서 찾아 낼 수있다.

  3. ==============================

    3.스왑은 이전에 제안 된 붉은 청어가 아닐 수도 있습니다. ENOMEM 바로 앞에있는 파이썬 프로세스의 크기는 얼마입니까?

    스왑은 이전에 제안 된 붉은 청어가 아닐 수도 있습니다. ENOMEM 바로 앞에있는 파이썬 프로세스의 크기는 얼마입니까?

    커널 2.6에서 / proc / sys / vm / swappiness는 커널이 얼마나 적극적으로 스왑으로 전환 할지를 제어하고 커널이 윙크와 끄덕임으로 메모리를 얼마나 많이 그리고 얼마나 정확하게 할당 할지를 초과 커밋합니다. 페이스 북의 관계 상태와 마찬가지로 복잡합니다.

    free (1) 명령의 출력에 따르지 않습니다.이 명령은 서버 인스턴스가 인식하는 스왑 공간을 표시하지 않습니다. 자, 귀하의 웹 호스트는 확실히이 주제에 관한 것보다 훨씬 많은 것을 알고있을 것입니다. 그러나 제가 사용했던 가상 RHEL / CentOS 시스템은 게스트 OS에서 사용 가능한 스왑을보고했습니다.

    Red Hat KB 적용 조항 15252 :

    / proc / sys / vm 설정을 일반 CentOS 5.3 설치와 비교하십시오. 스왑 파일을 추가하십시오. swappiness 아래로 래칫하고 더 이상 살 있는지보십시오.

  4. ==============================

    4.고객 / 사용자가 일부 커널 모듈이나 드라이버를로드 한 것으로 의심됩니다. clone () 시스템 호출을 방해하고 있습니다 (아마 약간의 보안 강화, LIDS와 비슷하지만 더 모호한 것인가?) 아니면 어떤 이유로 커널 데이터를 채우고있다. fork () / clone ()이 작동하는 데 필요한 구조 (process 테이블, page 테이블, 파일 설명자 테이블 등).

    고객 / 사용자가 일부 커널 모듈이나 드라이버를로드 한 것으로 의심됩니다. clone () 시스템 호출을 방해하고 있습니다 (아마 약간의 보안 강화, LIDS와 비슷하지만 더 모호한 것인가?) 아니면 어떤 이유로 커널 데이터를 채우고있다. fork () / clone ()이 작동하는 데 필요한 구조 (process 테이블, page 테이블, 파일 설명자 테이블 등).

    다음은 fork (2) 맨 페이지의 관련 부분입니다.

    ERRORS
           EAGAIN fork() cannot allocate sufficient memory to copy the parent's page tables and allocate a task  structure  for  the
                  child.
    
           EAGAIN It  was not possible to create a new process because the caller's RLIMIT_NPROC resource limit was encountered.  To
                  exceed this limit, the process must have either the CAP_SYS_ADMIN or the CAP_SYS_RESOURCE capability.
    
           ENOMEM fork() failed to allocate the necessary kernel structures because memory is tight.
    

    사용자가 일반 커널로 부팅 한 후 최소한의 모듈 및 드라이버 세트 만로드하여 (사용자 응용 프로그램 / 스크립트를 실행하는 데 필요한 최소) 사용자가이 방법을 사용하도록하는 것이 좋습니다. 거기서부터, 그 구성에서 작동한다고 가정하면, 그 구성과 그 구성을 보여주는 이진 검색을 수행 할 수 있습니다. 이것은 표준 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 커널을 통한 코드 경로 사용할 수있는 스왑이 거의없는 경우 (예외 처리 경로)보다 훨씬 많은 스왑을 사용할 수도 있습니다.

    그러나 나는 이것이 여전히 빨간 청어라고 생각합니다.

    무료로 캐시 및 버퍼에서 사용중인 0 (제로) 메모리를보고한다는 사실은 매우 혼란 스럽습니다. 아마도 자유 출력과 여기에 응용 프로그램 문제가 어떤 식 으로든 메모리 할당을 방해하는 독점적 인 커널 모듈에 의해 발생한 것으로 의심됩니다.

    fork () / clone ()에 대한 man 페이지에 따르면, 호출이 리소스 제한 위반 (RLIMIT_NPROC)을 일으킬 경우 fork () 시스템 호출은 EAGAIN을 반환해야합니다 ... 그러나 EAGAIN이 반환 될지는 말하지 않습니다 다른 RLIMIT * 위반. 어떤 경우라도 대상 / 호스트에 이상한 Vormetric 또는 다른 보안 설정이 있거나 (심지어 이상한 SELinux 정책에 따라 프로세스가 실행중인 경우에도)이 -ENOMEM 오류가 발생할 수 있습니다.

    평범한 일상적인 Linux / UNIX 문제 일 가능성은 거의 없습니다. 비표준적인 일이 있습니다.

  5. ==============================

    5.사용 해본 적이 있습니까?

    사용 해본 적이 있습니까?

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

    나는 이것이 나에게 똑같은 문제를 고쳤다 고 생각했다. 그런데 내 과정이 결국 산란하지 못하고 살해되고 결국 더 나 빠졌다.

    몇 가지 테스트를 한 결과, 이전 버전의 Python에서만 발생했음을 발견했습니다. 2.6.5에서는 발생하지만 2.7.2에서는 발생하지 않습니다.

    내 검색은 python-close_fds-issue에서 나를 이끌었지만 closed_fds를 설정 해제해도 문제가 해결되지 않았습니다. 그것은 여전히 ​​읽을만한 가치가 있습니다.

    나는 파이썬이 파일 디스크립터를 주목하고 있음을 발견했다.

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

    너와 마찬가지로 커맨드의 출력을 포착하고 싶지만 OOM 에러를 피하기를 원한다. 그러나 사람들이 덜 버그가있는 파이썬 버전을 사용하는 유일한 방법 인 것처럼 보인다. 이상적이지는 않다 ...

  6. ==============================

    6.나는 다음과 같은 엉성한 코드를 보았다.

    나는 다음과 같은 엉성한 코드를 보았다.

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

    이것이 당신의 컴퓨터에서 일어나고 있는지 확인해야합니다. 파이썬 코드. Errno는 진행중인 시스템 호출 실패한.

    추가 편집 :

    이 과정이 얼마나 오래 지속되는지는 말하지 않습니다. 가능한 메모리 소비자

  7. ==============================

    7.쉬운 수정을 위해

    쉬운 수정을 위해

    echo 1 > /proc/sys/vm/overcommit_memory
    

    시스템에 충분한 메모리가 있는지 확인하십시오. 커밋 휴리스틱보다 Linux를 참조하십시오.

  8. from https://stackoverflow.com/questions/1367373/python-subprocess-popen-oserror-errno-12-cannot-allocate-memory by cc-by-sa and MIT license