Estou executando um servidor docker no Arch Linux (kernel 4.3.3-2) com vários contêineres. Desde a minha última reinicialização, o servidor de docker e os programas aleatórios nos contêineres falham com uma mensagem sobre a impossibilidade de criar um encadeamento ou (com menos frequência) de bifurcar. A mensagem de erro específica é diferente dependendo do programa, mas a maioria delas parece mencionar o erro específico Resource temporarily unavailable
. Veja no final deste post alguns exemplos de mensagens de erro.
Agora, existem muitas pessoas que receberam essa mensagem de erro e muitas respostas a elas. O que é realmente frustrante é que todo mundo parece estar especulando como o problema poderia ser resolvido, mas ninguém parece indicar como identificar qual das muitas causas possíveis para o problema está presente.
Eu coletei estas 5 causas possíveis para o erro e como verificar se elas não estão presentes no meu sistema:
- Há um limite para todo o sistema no número de threads configurados em
/proc/sys/kernel/threads-max
( origem ). No meu caso, isso está definido como60613
. - Cada thread ocupa algum espaço na pilha. O limite de tamanho da pilha é configurado usando
ulimit -s
( origem ). O limite para o meu shell costumava ser8192
, mas eu o aumentei colocando* soft stack 32768
em/etc/security/limits.conf
, então eleulimit -s
agora retorna32768
. Também a ampliei para o processo da janela de encaixe, inserindoLimitSTACK=33554432
em/etc/systemd/system/docker.service
( source) e verifiquei que o limite se aplica examinando/proc/<pid of docker>/limits
e executandoulimit -s
dentro de um contêiner de janela de encaixe. - Cada thread ocupa um pouco de memória. Um limite de memória virtual é configurado usando
ulimit -v
. No meu sistema, ele está definido comounlimited
e 80% dos meus 3 GB de memória estão livres. - Há um limite no número de processos usando
ulimit -u
. Threads contam como processos neste caso ( origem ). No meu sistema, o limite é definido como30306
, e para o daemon de encaixe e dentro dos contêineres de encaixe, o limite é1048576
. O número de threads em execução no momento pode ser encontrado executandols -1d /proc/*/task/* | wc -l
ou executandops -elfT | wc -l
( origem ). No meu sistema eles estão entre700
e800
. - Há um limite no número de arquivos abertos, o que, de acordo com algumas fontes, também é relevante ao criar threads. O limite é configurado usando
ulimit -n
. No meu sistema e na janela de encaixe, o limite está definido como1048576
. O número de arquivos abertos pode ser encontrado usandolsof | wc -l
( fonte ), no meu sistema30000
.
Parece que antes da última reinicialização eu estava executando o kernel 4.2.5-1, agora estou executando o 4.3.3-2. O downgrade para 4.2.5-1 corrige todos os problemas. Outras postagens mencionando o problema são isso e isso . Abri um relatório de bug para o Arch Linux .
O que mudou no kernel que pode estar causando isso?
Aqui estão alguns exemplos de mensagens de erro:
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