4.3 커널에서 "자원을 일시적으로 사용할 수 없음"으로 스레드 작성에 실패


39

여러 컨테이너가있는 Arch Linux (커널 4.3.3-2)에서 도커 서버를 실행하고 있습니다. 마지막으로 재부팅 한 후 컨테이너 내의 도커 서버와 임의의 프로그램이 스레드를 만들 수 없거나 자주 포크하지 않는다는 메시지와 함께 충돌합니다. 특정 오류 메시지는 프로그램에 따라 다르지만 대부분 특정 오류를 언급하는 것 같습니다 Resource temporarily unavailable. 오류 메시지의 예는이 게시물의 끝 부분을 참조하십시오.

이제이 오류 메시지를받은 사람이 많으며 이에 대한 답변이 많이 있습니다. 정말 실망스러운 것은 모든 사람이 문제가 어떻게 해결 될 수 있는지를 추측하는 것처럼 보이지만 , 문제의 가능한 여러 원인 중 어떤 것이 있는지 식별 하는 방법을 지적하는 사람은 아무도 없다는 것 입니다.

오류의 가능한 5 가지 원인과 시스템에 해당 오류가 없는지 확인하는 방법을 수집했습니다.

  1. /proc/sys/kernel/threads-max( source )에 구성된 스레드 수에는 시스템 전체에 제한이 있습니다. 제 경우에는로 설정되어 60613있습니다.
  2. 모든 스레드는 스택에서 약간의 공간을 차지합니다. 스택 크기 제한은 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고정 표시기 컨테이너 내부.
  3. 모든 스레드는 약간의 메모리를 사용합니다. 가상 메모리 제한은을 사용하여 구성됩니다 ulimit -v. 내 시스템에서이를로 설정 unlimited하고, 메모리 내 3기가바이트의 80 %는 무료입니다.
  4. 을 사용하는 프로세스 수에는 제한이 있습니다 ulimit -u. 이 경우 스레드는 프로세스로 계산됩니다 ( source ). 내 시스템에서 한계는로 설정되고 30306docker 데몬 및 내부 도커 컨테이너의 경우 한계는 1048576입니다. 현재 실행중인 스레드 수는 실행 ls -1d /proc/*/task/* | wc -l하거나 ps -elfT | wc -l( source ) 를 실행 하여 찾을 수 있습니다 . 내 시스템에서 700와 사이 에 800있습니다.
  5. 열린 파일 수에는 제한이 있으며 일부 소스 에 따르면 스레드를 만들 때도 관련이 있습니다. 제한은을 사용하여 구성됩니다 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

1
최근에 4.3 커널로 업그레이드 했습니까?
Roni Choudhury

아주 잘 가능합니다. 왜?
cdauth

1
놀랍습니다. 커널 4.2.5-1로 다운 그레이드되었으며 모든 것이 다시 작동합니다! 이 문제의 원인과 4.3으로 수정하는 방법에 대한 단서가 있습니까?
cdauth

무엇이 원인인지 전혀 알지 못합니다. 문제를 해결하는 방법은 주제의 Arch Linux 포럼 스레드가 "SOLVED":-P로 표시되기를 기다리는 것입니다.
Roni Choudhury

1
+1 같은 문제가 없었 더라도 훌륭하게 질문하고 연구 한 질문
Roy Truelove

답변:


47

TasksMaxsystemd 속성으로 인해 문제가 발생 합니다. 그것은 시스템 228에서 소개되었고 리눅스 커널 4.3에서 소개 된 cgroups pid 서브 시스템을 사용합니다. 512커널 4.3 이상이 실행 중이면 systemd에서 작업 제한이 활성화됩니다. 이 기능은 여기 에 발표 되어이 풀 요청 에 도입되었으며 기본값은 이 풀 요청에 의해 설정되었습니다 . 커널을 4.3으로 업그레이드 한 후 systemctl status docker다음 Tasks줄을 표시합니다 .

# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/etc/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2016-01-15 19:58:00 CET; 1min 52s ago
     Docs: https://docs.docker.com
 Main PID: 2770 (docker)
    Tasks: 502 (limit: 512)
   CGroup: /system.slice/docker.service

섹션 TasksMax=infinity에서 설정 하면 문제가 해결됩니다. 일반적으로에 있지만 패키지 관리자가 재정의하지 않도록 넣을 수도 있습니다 .[Service]docker.servicedocker.service/usr/share/systemd/system/etc/systemd/system

끌어 오기 요청이 증가하고있다 TasksMax고정 표시기 예 systemd 파일 및 아치 리눅스 버그 리포트는 패키지에 대해 동일한을 달성하기 위해 노력하고있다. Arch Linux 포럼lxc에 관한 Arch Linux 버그 보고서에 대한 추가 논의가 있습니다 .

DefaultTasksMax[Manager]섹션에서 /etc/systemd/system.conf또는 /etc/systemd/user.conf사용자 실행 서비스 섹션에서 를 사용하여의 기본값을 제어 할 수 TasksMax있습니다.

또한 Systemd는 login-shell에서 실행되는 프로그램에 제한을 적용합니다. 이 값은 4096사용자 당 ( 기본값 으로 증가12288 ) UserTasksMax[Login]섹션 에서 와 같이 구성됩니다 /etc/systemd/logind.conf.


1
FWIW, 서비스 파일은 /lib/systemd/system/docker.service데비안 테스트 중이었습니다.
Compiler

2
FWIW systemctl set-property docker.service TasksMax=4096는 현재 실행중인 서비스의 속성을 설정하고 해당 도커 설치를위한 올바른 위치에 후속 재부팅에 대한 설정을 유지 한다고 말합니다 .
Nakedible

이것은 일반적인 접근 방식 입니다. 그러나 제안한 Docker 변경 사항은이 답변을 게시 한 후 2016-02-09에 되돌려 졌으며이 복귀는 Docker 버전 1.10.1에서 전 세계에 릴리스되었습니다.
JdeBP

남자 고마워 고마워! 나는 이것을 위해 tooooo 오랫동안 찾고있다
achabahe

구성 파일을 변경 한 경우 (마인은 /etc/systemd/system/docker.service.d/50-TasksMax.confUbuntu 16에 있음)을 실행해야합니다 systemctl daemon-reload. A는 이렇게 sudo service docker restart작동하지 않습니다.
osman

4

cdauth의 답변은 정확하지만 추가해야 할 또 다른 세부 사항이 있습니다.

systemd 229 및 4.3 커널을 사용하는 Ubuntu 16.04 시스템에서 UserTasksMax가 새로 증가 된 기본값 12288로 설정된 경우에도 기본적으로 세션 범위에서 512 pid 제한이 적용되었습니다. 따라서 모든 사용자 세션 범위는 512 스레드로 제한되었습니다.

나는 제한을 제거하는 것으로 유일한 방법은 세트로했습니다 DefaultTasksMax=unlimited/etc/systemd/system.confsystemctl daemon-reexec(또는 재부팅).

발행 systemctl status, 세션 범위 선택 및을 통해 이러한 상황이 발생했는지 확인할 수 있습니다 cat /sys/fs/cgroup/pids/user.slice/user-${UID}.slice/session-FOO.scope/pids.max.


/etc/systemd/system.conf를 변경하고 재부팅했습니다. Docker는 여전히 작업 제한을 512로 나열합니다. 위의 @Nakedible의 주석을 사용하여 사용 가능한 작업을 업데이트했습니다.
벤 매튜스

1
고마워 라이언! @ BenMathews 아마도 우분투 16.04에서 모두 유효한 문제 이기 때문에 제대로 작동하려면 둘 다 수정해야 합니다 . 이 문제는 쉘의 사용자가 아닌 데몬이 시작한 컨테이너에 적용되는 것으로 보입니다. 따라서 모든 것이 @reboot lxc-autostart제대로 표시되고 부팅시 자동 시작을 위해 crontab에 추가 하고 재부팅 후 갑자기 컨테이너가 무너집니다.
qris

1

스레드를 읽은 후

이 솔루션은 저에게 효과적이었습니다 docker -d --exec-opt native.cgroupdriver=cgroupfs. 나는 사실에 추가 OPTIONS에서 /etc/sysconfig/docker...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.