Sto eseguendo un server docker su Arch Linux (kernel 4.3.3-2) con diversi container. Dal mio ultimo riavvio, sia il server docker sia i programmi casuali all'interno dei contenitori si bloccano con un messaggio sul fatto di non essere in grado di creare un thread o (meno spesso) di fork. Il messaggio di errore specifico varia a seconda del programma, ma la maggior parte sembra menzionare l'errore specifico Resource temporarily unavailable
. Vedere alla fine di questo post per alcuni messaggi di errore di esempio.
Ora ci sono molte persone che hanno avuto questo messaggio di errore e molte risposte a loro. La cosa davvero frustrante è che tutti sembrano speculare su come risolvere il problema, ma nessuno sembra indicare come identificare quale delle tante possibili cause del problema sia presente.
Ho raccolto queste 5 possibili cause dell'errore e come verificare che non siano presenti sul mio sistema:
- Esiste un limite a livello di sistema sul numero di thread configurati in
/proc/sys/kernel/threads-max
( sorgente ). Nel mio caso questo è impostato su60613
. - Ogni thread occupa dello spazio nello stack. Il limite della dimensione dello stack viene configurato utilizzando
ulimit -s
( origine ). Il limite per il mio guscio usato per essere8192
, ma ho aumentato che mettendo* soft stack 32768
in/etc/security/limits.conf
, quindi èulimit -s
ora restituisce32768
. Ho anche aumentato per il processo finestra mobile mettendoLimitSTACK=33554432
in/etc/systemd/system/docker.service
( fonte , e verificato che il limite si applica, cercando in/proc/<pid of docker>/limits
e eseguendoulimit -s
all'interno di un contenitore finestra mobile. - Ogni thread richiede un po 'di memoria. Un limite di memoria virtuale viene configurato mediante
ulimit -v
. Sul mio sistema è impostato suunlimited
e l'80% dei miei 3 GB di memoria è gratuito. - Esiste un limite al numero di processi che utilizzano
ulimit -u
. I thread contano come processi in questo caso ( fonte ). Sul mio sistema, il limite è impostato su30306
, e per il demone docker e all'interno dei contenitori docker, il limite è1048576
. Il numero di thread attualmente in esecuzione può essere scoperto eseguendols -1d /proc/*/task/* | wc -l
o eseguendops -elfT | wc -l
( origine ). Sul mio sistema sono tra700
e800
. - Esiste un limite al numero di file aperti, che secondo alcune fonti è rilevante anche per la creazione di thread. Il limite viene configurato utilizzando
ulimit -n
. Sul mio sistema e all'interno della finestra mobile, il limite è impostato su1048576
. Il numero di file aperti può essere scoperto usandolsof | wc -l
( sorgente ), sul mio sistema si tratta30000
.
Sembra che prima dell'ultimo riavvio stavo eseguendo il kernel 4.2.5-1, ora sto eseguendo 4.3.3-2. Il downgrade a 4.2.5-1 risolve tutti i problemi. Altri post che menzionano il problema sono questo e questo . Ho aperto una segnalazione di bug per Arch Linux .
Cosa è cambiato nel kernel che potrebbe causare questo?
Ecco alcuni esempi di messaggi di errore:
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