Jenkins CI-메모리를 할당 할 수 없습니다


9

로컬 컴퓨터의 우분투 10.4 (vmware fusion 사용)에서 jenkins-ci를 성공적으로 테스트했습니다. 이제 hosteurope의 가상 서버에 설치하고 사용하고 싶습니다. 기본 설치에는 문제가 없었지만 이제 빌드 프로젝트에 문제가 있습니다.

저장소에서 수은 업데이트를 가져온 후 개미가 호출되고 빌드 프로젝트에서 다음 오류가 발생합니다.

"빌드 파일 : /var/lib/jenkins/workspace/concrete5-seed-clean/build.xml [property] java.io.IOException :"/ usr / bin / env 프로그램을 실행할 수 없습니다 ": java.io.IOException : error = 12, 메모리를 할당 할 수 없습니다 "

hosteurope ( http://faq.hosteurope.de/index.php?cpid=13918 )의 가상 서버에서 힙 크기에 대한 알려진 문제가 있으므로 힙 크기를 수동으로 설정하려고했습니다.

# for ant
export ANT_OPTS="-Xms512m -Xmx512m"

# jenkins
# edited /etc/default/jenkins, added line 
JAVA_ARGS="-Xms512m -Xmx512m"
# restarted jenkins via /etc/init.d/jenkins restart 

ant에 대해 이것을 설정하면 "ant -diagnostics"명령이 실행되고 오류가 발생하지 않지만 프로젝트를 빌드하려고 할 때 오류가 계속 발생합니다.

서버 세부 정보 :-http: //www.hosteurope.de/produkt/Virtual-Server-Linux-L

  • 우분투 10.4 LTS
  • 램 : 1GB / 동적 2GB

내 질문 :-Jenkins에 1GB이면 충분합니까, 아니면 서버를 업그레이드해야합니까? -이 오류는 개미 또는 젠킨스 때문입니까?

업데이트 : 개미 옵션 -Xmx128m -Xms128m으로 실행했지만 때로는 오류가 다시 발생합니다. (이것은 나를 놀라게합니다. 왜냐하면 지금은 그것을 재생할 수 없습니다 : /)

대단히 감사합니다!

건배, 마티아스


jenkins 구성 파일을 설정하여이 문제를 해결했습니다. JENKINS_JAVA_OPTIONS = "-Djava.awt.headless = true -Xms500m -Xmx1000m"
herbertD

답변:


10

Orien은 정확합니다. ProcessBuilder 또는 Runtime.exec 또는 외부 프로세스를 실행하는 JVM의 다른 수단 (예 : ant를 실행하는 다른 JVM, git 명령 등)에 의해 트리거 된 fork () 시스템 호출입니다.

Jenkins 메일 링리스트에 다음과 같은 게시물이 있습니다 : "git"프로그램을 실행할 수 없습니다 ... error = 12, 메모리를 할당 할 수 없습니다

SCons dev 목록에 문제에 대한 좋은 설명이 있습니다. fork () + exec () vs posix_spawn ()

솔루션이 포함 된 오래된 JVM 버그 보고서가 있습니다. S10에서 포크가 아닌 posix_spawn을 사용하여 스왑 소진을 피하십시오 . 그러나 의견이 제안한 것처럼 실제로 JDK7로 만들 었는지 확실하지 않습니다.

요약하면, 유닉스 계열 시스템에서 한 프로세스 (예 : JVM)가 다른 프로세스 (예 : git)를 시작해야하는 fork()경우 현재 프로세스와 모든 메모리를 효과적으로 복제 하는 시스템 호출이 수행 됩니다 (Linux 및 기타는이를 복사로 최적화) -on-write이므로 자식이 메모리에 쓰려고 시도 할 때까지 메모리가 실제로 복사되지 않습니다. 그런 다음 복제 프로세스는 다른 프로세스를 호출 exec()하여 다른 프로세스 (예 : git)를 시작합니다.이 시점에서 상위 프로세스에서 복사 된 모든 메모리가 운영 체제에 의해 폐기 될 수 있습니다. 상위 프로세스가 많은 양의 메모리를 사용하는 경우 (JVM 프로세스에서와 같이) fork()운영 체제에 실제로는 하위 프로세스가 실제로는 두 개의 사본을 보유 할 수있는 메모리 + 스왑이 충분하지 않다고 판별하면 호출 이 실패 할 수 있습니다. 복사 된 메모리를 사용하십시오.

몇 가지 해결책이 있습니다.

  • 머신에 물리적 메모리 / RAM을 더 추가하십시오.

  • fork()스왑 공간이 엄격하게 필요하지 않더라도 스왑 공간을 추가 하여 작동 을 속이십시오 . 이것은 스왑 파일을 추가하기가 쉽기 때문에 선택한 솔루션이며 오버 커밋으로 인해 프로세스가 종료 될 가능성을 갖고 싶지 않습니다.

  • Linux에서는 overcommit_memoryvm 시스템 ( / proc / sys / vm / overcommit_memory ) 옵션을 활성화 하십시오 . 오버 커밋을 사용하면 호출 fork()이 항상 성공하고 자식 프로세스가 실제로 해당 메모리 사본을 사용하지 않으므로 모든 것이 좋습니다. 물론 오버 커밋을 사용하면 프로세스가 실제로 사용 가능한 것보다 많은 메모리를 사용하려고 시도하고 커널에 의해 종료 될 수 있습니다. 이것이 적절한 지 여부는 기계의 다른 용도에 따라 다릅니다. 미션 크리티컬 머신은 아마도 메모리 부족 킬러가 실행되는 위험을 감수해서는 안됩니다. 그러나 다운 타임을 감당할 수있는 내부 개발 서버는 오버 커밋을 활성화하기에 좋은 장소입니다.

  • fork()+ exec()를 사용 하지 않고 사용 posix_spawn()가능한 경우 사용하도록 JVM을 변경하십시오 . 위의 JVM 버그 보고서에서 요청하고 SCons 메일 목록에 언급 된 솔루션입니다. java_posix_spawn 에서도 구현됩니다 .

    해당 수정 사항이 JDK7로 만들어 졌는지 확인하려고합니다. 그렇지 않다면 Jenkins 사람들이 java_posix_spawn과 같은 해결 방법에 관심이 있는지 궁금합니다. Apache commons-exec 에 통합하려고 시도한 것 같습니다 .

    Programmieraffe, 100 % 확신 할 수는 없지만 링크가 수정 사항이 JDK7 및 JDK6 1.6.0_23 이상임을 제안합니다. 기록을 위해 OpenJDK 1.6.0_18을 실행 중이었습니다.

참조 /programming/1124771/how-to-solve-java-io-ioexception-error-12-cannot-allocate-memory-calling-run를


자세한 답변을 주셔서 감사합니다! 관련 게시물에서 Alf Høgemark는 현재이 문제가 해결되었다고 말합니다 : ( stackoverflow.com/a/9127548/809939 ) 누군가 이것을 확인할 수 있습니까? Java 버전도 업데이트하려고합니다.
Programmieraffe

추가 질문 : 무엇을 제안 하시겠습니까? 오버 커밋 메모리 설정? 안부, Matthias
Programmieraffe

1
스왑 파일을 추가하는 것은 쉽고 간단합니다. Ubuntu 12.04의 경우 (일반적으로 Linux에 적용해야하지만)이 기사는 간단합니다 : digitalocean.com/community/articles/…
davemyron

1

예외 메시지를 참고하십시오 Cannot run program "/usr/bin/env": java.io.IOException: error=12, Cannot allocate memory". Java 프로세스가 명령을 실행하기 위해 새 프로세스를 분기하려고 /usr/bin/env하지만 운영 체제에 새 프로세스를 작성하기위한 메모리 자원이 부족합니다. 이것은 메모리가 부족한 Java VM과 같지 않으므로 -Xmx 플래그를 사용하면 문제가 해결되지 않습니다. 빌드를 실행하는 동안 메모리 리소스를 모니터링해야합니다. 스왑 공간을 늘리면 문제가 해결 될 수 있습니다.


호스트 컴퓨터 시스템이 아닌 메모리가 부족한 Java 가상 머신 (힙 또는 스택 중 하나)입니다.
mdpc

내 원래 답변의 간결함을 실례합니다. JVM에 메모리가 부족하지 않은 이유를 설명하기 위해 업데이트했습니다.
orien

0

Jenkins가 ANT_OPTS를 대체했을 가능성이 있습니다. 환경 (쉘, Jenkins 등)과 독립적으로 메모리 할당을 제어 할 수 있도록 빌드 파일에서 직접 옵션을 설정할 수도 있습니다. 빌드 파일에서 (예 :

<java fork="true" classname="..." >
    <jvmarg line="-Xms512M -Xmx512M" />
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.