여러 컨테이너가있는 Arch Linux (커널 4.3.3-2)에서 도커 서버를 실행하고 있습니다. 마지막으로 재부팅 한 후 컨테이너 내의 도커 서버와 임의의 프로그램이 스레드를 만들 수 없거나 자주 포크하지 않는다는 메시지와 함께 충돌합니다. 특정 오류 메시지는 프로그램에 따라 다르지만 대부분 특정 오류를 언급하는 것 같습니다 Resource temporarily unavailable
. 오류 메시지의 예는이 게시물의 끝 부분을 참조하십시오.
이제이 오류 메시지를받은 사람이 많으며 이에 대한 답변이 많이 있습니다. 정말 실망스러운 것은 모든 사람이 문제가 어떻게 해결 될 수 있는지를 추측하는 것처럼 보이지만 , 문제의 가능한 여러 원인 중 어떤 것이 있는지 식별 하는 방법을 지적하는 사람은 아무도 없다는 것 입니다.
오류의 가능한 5 가지 원인과 시스템에 해당 오류가 없는지 확인하는 방법을 수집했습니다.
/proc/sys/kernel/threads-max
( source )에 구성된 스레드 수에는 시스템 전체에 제한이 있습니다. 제 경우에는로 설정되어60613
있습니다.- 모든 스레드는 스택에서 약간의 공간을 차지합니다. 스택 크기 제한은
ulimit -s
( source )를 사용하여 구성됩니다 . 내 껍질의 한계로 사용8192
하지만, 내가 넣어 그것을 증가* soft stack 32768
로/etc/security/limits.conf
, 그것은 그래서ulimit -s
지금 반환32768
. 또한 바꾸어 고정 표시기 프로세스를 증가LimitSTACK=33554432
로/etc/systemd/system/docker.service
( 소스 , 나는 한계에보고 적용 것을 확인/proc/<pid of docker>/limits
하고 실행하여ulimit -s
고정 표시기 컨테이너 내부. - 모든 스레드는 약간의 메모리를 사용합니다. 가상 메모리 제한은을 사용하여 구성됩니다
ulimit -v
. 내 시스템에서이를로 설정unlimited
하고, 메모리 내 3기가바이트의 80 %는 무료입니다. - 을 사용하는 프로세스 수에는 제한이 있습니다
ulimit -u
. 이 경우 스레드는 프로세스로 계산됩니다 ( source ). 내 시스템에서 한계는로 설정되고30306
docker 데몬 및 내부 도커 컨테이너의 경우 한계는1048576
입니다. 현재 실행중인 스레드 수는 실행ls -1d /proc/*/task/* | wc -l
하거나ps -elfT | wc -l
( source ) 를 실행 하여 찾을 수 있습니다 . 내 시스템에서700
와 사이 에800
있습니다. - 열린 파일 수에는 제한이 있으며 일부 소스 에 따르면 스레드를 만들 때도 관련이 있습니다. 제한은을 사용하여 구성됩니다
ulimit -n
. 내 시스템 및 내부 도커에서 한도가로 설정되어1048576
있습니다. 열려있는 파일의 수 는 내 시스템에서lsof | wc -l
( source )를 사용하여 찾을 수 있습니다30000
.
마지막 재부팅 전에 커널 4.2.5-1을 실행 중이었고 이제는 4.3.3-2를 실행 중입니다. 4.2.5-1로 다운 그레이드하면 모든 문제가 해결됩니다. 문제를 언급하는 다른 게시물은 이것 과 이것 입니다. Arch Linux에 대한 버그 보고서를 열었습니다 .
커널에서 무엇이 변경 될 수 있습니까?
다음은 몇 가지 오류 메시지 예입니다.
Crash dump was written to: erl_crash.dump
Failed to create aux thread
Jan 07 14:37:25 edeltraud docker[30625]: runtime/cgo: pthread_create failed: Resource temporarily unavailable
dpkg: unrecoverable fatal error, aborting:
fork failed: Resource temporarily unavailable
E: Sub-process /usr/bin/dpkg returned an error code (2)
test -z "/usr/include" || /usr/sbin/mkdir -p "/tmp/lib32-popt/pkg/lib32-popt/usr/include"
/bin/sh: fork: retry: Resource temporarily unavailable
/usr/bin/install -c -m 644 popt.h '/tmp/lib32-popt/pkg/lib32-popt/usr/include'
test -z "/usr/share/man/man3" || /usr/sbin/mkdir -p "/tmp/lib32-popt/pkg/lib32-popt/usr/share/man/man3"
/bin/sh: fork: retry: Resource temporarily unavailable
/bin/sh: fork: retry: No child processes
/bin/sh: fork: retry: Resource temporarily unavailable
/bin/sh: fork: retry: No child processes
/bin/sh: fork: retry: No child processes
/bin/sh: fork: retry: Resource temporarily unavailable
/bin/sh: fork: retry: Resource temporarily unavailable
/bin/sh: fork: retry: No child processes
/bin/sh: fork: Resource temporarily unavailable
/bin/sh: fork: Resource temporarily unavailable
make[3]: *** [install-man3] Error 254
Jan 07 11:04:39 edeltraud docker[780]: time="2016-01-07T11:04:39.986684617+01:00" level=error msg="Error running container: [8] System error: fork/exec /proc/self/exe: resource temporarily unavailable"
[Wed Jan 06 23:20:33.701287 2016] [mpm_event:alert] [pid 217:tid 140325422335744] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread