source

Python 하위 프로세스."OSError: [Errno 12] 메모리를 할당할 수 없습니다"를 엽니다.

manycodes 2023. 8. 19. 10:29
반응형

Python 하위 프로세스."OSError: [Errno 12] 메모리를 할당할 수 없습니다"를 엽니다.

참고: 이 질문은 원래 여기서 질문한 것이지만, 허용 가능한 답변이 실제로 발견되지 않았음에도 불구하고 현상금 시간이 만료되었습니다.저는 원래 질문에 제공된 모든 세부 사항을 포함하여 이 질문을 다시 합니다.

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. 호스트에 따르면 스왑 공간이 없는 것이 원인일 수 있지만 실제로는 온디맨드 방식으로 스왑을 사용할 수 있으며, 여기서도 잘못된 원인으로 제시되었습니다.

  5. Python 소스 코드와 여기에 있는 주석으로 백업된 .communicate()를 사용하는 동작이기 때문에 프로세스가 닫힙니다.

전체 검사는 GitHub에서 442행에서 정의한 getProcesses 함수로 확인할 수 있습니다.이를 520행부터 doChecks()라고 합니다.

충돌 전에 다음 출력을 사용하여 스크립트를 추적하여 실행했습니다.

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)                           = ?

일적으바로반 (서닐라커널에)바▁()fork/clone에 대한 실패.ENOMEM 특히 신에게 정직한 기억력 부족 상태 때문에 발생합니다.dup_mm,dup_task_struct,alloc_pid,mpol_dup,mm_init등), 또는 이유security_vm_enough_memory_mm오버 커밋 정책을 적용하는 동안 실패했습니다.

먼저 포크 시도 시 포크에 실패한 프로세스의 vms 크기를 확인한 다음 오버커밋 정책과 관련된 사용 가능한 메모리 양(물리적 및 스왑)과 비교합니다(숫자 플러그인).

특정한 경우 Virtuozzo에는 오버 커밋 시행에 대한 추가 검사가 있습니다.또한 컨테이너 에서 (시행 결과에 영향을 미치기 위해) 오버 스왑오버 커밋 구성을 얼마나 제어할 수 있는지 잘 모르겠습니다.

이제 실제로 앞으로 나아가기 위해서는 두 가지 옵션이 남아있다고 말씀드리고 싶습니다.

  • 더 큰 인스턴스로 전환하거나
  • 스크립트의 메모리 설치 공간을 보다 효과적으로 제어하기 위해 코딩 노력을 기울입니다.

만약 당신이 아닌 다른 사람이 당신이 모의 실행을 하고 있는 것과 같은 서버의 다른 인스턴스에 공모한 것으로 밝혀진다면, 코딩 노력은 모두 헛수고가 될 수도 있습니다.

메모리 측면에서는 /under clone사용한다는 것을 이미 알고 있습니다. 즉, 호출할 때마다 Python이 이미 소비하고 있는 메모리보다 한 배 더 많은 메모리를 요청해야 합니다. 즉, 수백 MB의 추가 메모리를 모두 사용할 수 있습니다.exec 10KB의와 같은 free또는ps바람직하지 않은 오버 커밋 정책의 경우 다음과 같이 표시됩니다.ENOMEM.

fork이 상위 페이지 테이블 등이 없는 경우 복사 문제는 및 . . 그러나 당신이 청크를 다시 쓰고 싶지 않다면subprocess.Popen vfork/posix_spawn용▁using다니를 사용하는 것을 고려해 .suprocess.Popen스크립트를 시작할 때 한 번만(파이썬의 메모리 공간이 최소일 때) //pssleep 스크립트와 평행한 루프에서 실행되는 스크립트를 생성합니다. 스크립트의 출력을 폴링하거나 동시에 읽습니다.비동기식으로 처리해야 하는 다른 작업이 있는 경우 별도의 스레드에서 데이터 크런치를 Python에서 수행하되 포크 작업은 하위 프로세스에 맡깁니다.

그러나 특정한 경우에는 호출을 건너뛸 수 있습니다.ps그리고.free정보는 Python에서 당신이 직접 또는 기존 라이브러리 및/또는 패키지를 통해 직접 쉽게 이용할 수 있습니다.ps그리고.free당신이 운영하고 있던 유일한 유틸리티였고, 그러면 당신은 완전히 없앨 수 있습니다.

마지막으로, 당신이 무엇을 하든지 간에subprocess.Popen걱정되는 것은 스크립트가 메모리를 누출하더라도 결국에는 여전히 벽에 부딪힐 것이라는 점입니다.메모리 누수 여부를 확인합니다.

을 보고 .free -m제가 보기에 당신은 실제로 사용 가능한 스왑 메모리가 없는 것 같습니다.Linux에서 스왑이 항상 온디맨드 방식으로 자동으로 사용 가능한지는 확실하지 않지만, 저는 같은 문제를 겪고 있었고 여기 있는 답변 중 어떤 것도 도움이 되지 않았습니다.그러나 스왑 메모리를 추가하여 문제를 해결함으로써 동일한 문제에 직면한 다른 사용자에게 도움이 될 수 있으므로 1GB 스왑을 추가하는 방법에 대한 답변을 게시합니다(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 

출처 및 자세한 정보는 여기에서 확인할 수 있습니다.

쉬운 해결책으로, 당신은 할 수 있습니다.

echo 1 > /proc/sys/vm/overcommit_memory

시스템에 충분한 메모리가 있는지 확인할 수 있습니다.commit 휴리스틱을 통한 Linux 참조.

스왑은 이전에 제안된 레드 헤링이 아닐 수 있습니다.문제의 파이썬 프로세스는 직전에 얼마나 큰가요?ENOMEM?

2에서 커2.6서/proc/sys/vm/swappiness커널이 스왑을 얼마나 적극적으로 전환할지 제어합니다.overcommit*파일은 커널이 윙크와 끄덕임으로 메모리를 얼마나 정확하게 할당할 수 있는지를 나타냅니다.당신의 페이스북 관계 상태처럼, 그것은 복잡합니다.

...하지만 실제로는 웹 호스트에 따라 온디맨드로 스왑을 사용할 수 있습니다.

하지만 당신의 출력에 따르면 그렇지 않습니다.free(1)명령 - 서버 인스턴스에서 인식되는 스왑 공간이 없음을 나타냅니다.웹는 이 주제에 더 있을 입니다. RHEL는 RHEL/Cent입니다.사용한 OS 시스템에서 게스트 OS에 사용할 수 있는 스왑을 보고했습니다.

Red Hat KB 문서 15252:

Red Hat Enterprise Linux 5 시스템은 익명 메모리와 시스템 V 공유 메모리의 합계가 RAM 용량의 약 3/4 미만이면 스왑 공간이 전혀 없이 정상적으로 실행됩니다.RAM이 4GB 이하인 시스템은 최소 2GB의 스왑 공간을 사용하는 것이 좋습니다.

교를 ./proc/sys/vm일반 CentOS 5.3 설치로 설정할 수 있습니다.스왑 파일을 추가합니다.swappiness더 이상 살지 말지.

는 당신의 하여 "" "/" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "clone()call ( 일부 보안 이지만 더 것은, LID만더가모?▁kernel▁)▁struct▁for▁▁necessary에 한 커널 데이터 .fork()/clone()작동(프로세스 테이블, 페이지 테이블, 파일 설명자 테이블 등).

▁of▁▁portion다▁herefork(2) page 파일:

오류EGAIN 포크()는 부모 페이지 테이블을 복사하고 작업 구조를 할당할 수 있는 충분한 메모리를 할당할 수 없습니다.어린아이.

EAGAIN 호출자의 RLIMIT_NPROC 리소스 제한이 발생했기 때문에 새 프로세스를 만들 수 없습니다.로.이 제한을 초과하면 프로세스에 CAP_가 있어야 합니다.SYS_ADMIN 또는 CAP_SYS_RESOURCE 기능.

메모리가 부족하여 ENOMEM 포크()가 필요한 커널 구조를 할당하지 못했습니다.

저는 사용자가 재고, 일반 커널로 부팅하고 최소한의 모듈과 드라이버 세트(애플리케이션/스크립트 실행에 필요한 최소)만 로드한 후에 이것을 시도하도록 제안합니다.여기서 해당 구성에서 작동한다고 가정하면 해당 구성과 문제를 나타내는 구성 간에 이진 검색을 수행할 수 있습니다.이것은 표준 sysadmin 문제 해결 101입니다.

에 있는 행.strace다음과 같습니다.

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

다른 사용자들이 스왑 및 메모리 가용성에 대해 이야기한 적이 있는 것으로 알고 있습니다. 아이러니하게도 RAM 디스크에 있더라도 최소한 작은 스왑 파티션을 설정하는 것이 좋습니다.사용 가능한 스왑이 아주 조금이라도 있을 때 리눅스 커널을 통과하는 코드 경로는 사용 가능한 스왑이 없는 경우(예외 처리 경로)보다 훨씬 광범위하게 실행되었습니다.

하지만 저는 이것이 여전히 적폐라고 의심합니다.

▁▁fact은▁the실.free캐시에서 사용 중인 0(ZERO) 메모리를 보고하고 있으며 버퍼가 매우 불편합니다.나는 의심이 듭니다.free출력... 및 애플리케이션 문제는 메모리 할당을 방해하는 일부 독점 커널 모듈로 인해 발생할 수 있습니다.

fork()/clone()의 man pages에 따르면 호출로 인해 리소스 제한 위반(RLIMT_NPROC)이 발생할 경우 fork() 시스템 호출이 EAGAIN을 반환해야 합니다...그러나 EAGAIN이 다른 RLIMIT* 위반에 의해 반환되는지 여부는 명시되어 있지 않습니다.대상/호스트에 일종의 이상한 Vormetric 또는 기타 보안 설정이 있는 경우(또는 일부 이상한 SELinux 정책에서 프로세스가 실행 중인 경우에도) 이 -ENOMEM 오류가 발생할 수 있습니다.

일반적인 Linux/UNIX 문제일 가능성은 거의 없습니다.당신은 그곳에서 비표준적인 무언가를 하고 있습니다.

다음을 사용해 보셨습니까?

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

저는 이것이 저와 똑같은 문제를 해결했다고 생각했습니다.하지만 제 과정은 결국 산란에 실패하는 대신 죽임을 당했고, 더 나쁜 것은..

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

검색을 통해 python-close_fds-issue를 찾았지만 closed_fds를 설정하지 않으면 문제가 해결되지 않았습니다.그것은 여전히 읽을 가치가 충분히 있습니다.

감시만 해도 파이썬이 파일 설명자를 유출하고 있다는 것을 알게 되었습니다.

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

당신처럼, 저도 명령어의 출력을 캡처하고 OOM 오류를 방지하고 싶습니다.하지만 사람들이 덜 버그가 많은 버전의 파이썬을 사용하는 것이 유일한 방법인 것 같습니다.이상적이지 않아요...

아마도 당신은 간단하게

$ sudo bash -c "echo vm.overcommit_memory=1 >> /etc/sysctl.conf"
$ sudo sysctl -p

제 경우에는 효과가 있습니다.

참조: https://github.com/openai/gym/issues/110#issuecomment-220672405

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

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

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

당신은 이것이 파이썬 코드에서 일어나고 있는 것인지 확인해야 합니다.Errno는 진행 중인 시스템 호출이 실패한 경우에만 유효합니다.

추가할 편집 내용:

당신은 이 과정이 얼마나 오래 지속되는지 말하지 않습니다.메모리의 잠재적 소비자

  • 분기된 과정
  • 사용되지 않는 데이터 구조
  • 공유 라이브러리
  • 메모리 매핑된 파일

언급URL : https://stackoverflow.com/questions/1367373/python-subprocess-popen-oserror-errno-12-cannot-allocate-memory

반응형