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 32768in/etc/security/limits.conf, quindi èulimit -sora restituisce32768. Ho anche aumentato per il processo finestra mobile mettendoLimitSTACK=33554432in/etc/systemd/system/docker.service( fonte , e verificato che il limite si applica, cercando in/proc/<pid of docker>/limitse eseguendoulimit -sall'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 suunlimitede 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 -lo eseguendops -elfT | wc -l( origine ). Sul mio sistema sono tra700e800. - 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