J'exécute un serveur Docker sur Arch Linux (noyau 4.3.3-2) avec plusieurs conteneurs. Depuis mon dernier redémarrage, le serveur Docker et les programmes aléatoires des conteneurs se bloquent avec le message de ne pas pouvoir créer de fil, ou (moins souvent) de faire un fork. Le message d'erreur spécifique est différent selon le programme, mais la plupart d'entre eux semblent mentionner l'erreur spécifique Resource temporarily unavailable
. Voir à la fin de cet article quelques exemples de messages d'erreur.
Maintenant, il y a beaucoup de gens qui ont eu ce message d'erreur, et beaucoup de réponses à eux. Ce qui est vraiment frustrant, c’est que tout le monde semble spéculer sur la façon dont le problème pourrait être résolu, mais personne ne semble indiquer comment identifier l’une des nombreuses causes possibles du problème.
J'ai rassemblé ces 5 causes possibles de l'erreur et comment vérifier qu'elles ne sont pas présentes sur mon système:
- Le nombre de threads configurés dans
/proc/sys/kernel/threads-max
( source ) est limité au niveau du système . Dans mon cas, cela est réglé sur60613
. - Chaque thread prend de la place dans la pile. La taille limite de la pile est configurée avec
ulimit -s
( source ). Auparavant, la limite pour ma coquille était8192
, mais je l’ai augmentée en la mettant* soft stack 32768
dans/etc/security/limits.conf
, elleulimit -s
revient donc32768
. Je l'ai également augmenté pour le processus de menu fixe en passantLimitSTACK=33554432
dans/etc/systemd/system/docker.service
( source ) et j'ai vérifié que la limite s'appliquait en examinant/proc/<pid of docker>/limits
et en s'exécutantulimit -s
à l' intérieur d'un conteneur de menu fixe. - Chaque fil prend de la mémoire. Une limite de mémoire virtuelle est configurée à l'aide de
ulimit -v
. Sur mon système, il est réglé surunlimited
et 80% de mes 3 Go de mémoire sont libres. - Il y a une limite sur le nombre de processus utilisant
ulimit -u
. Les threads sont considérés comme des processus dans ce cas ( source ). Sur mon système, la limite est définie sur30306
, et pour le démon docker et à l'intérieur des conteneurs docker, la limite est1048576
. Le nombre de threads en cours d'exécution peut être déterminé en exécutantls -1d /proc/*/task/* | wc -l
ou en exécutantps -elfT | wc -l
( source ). Sur mon système, ils sont entre700
et800
. - Le nombre de fichiers ouverts est limité, ce qui, selon certaines sources, est également pertinent lors de la création de threads. La limite est configurée avec
ulimit -n
. Sur mon système et à l'intérieur du menu fixe, la limite est définie sur1048576
. Le nombre de fichiers ouverts peut être trouvé en utilisantlsof | wc -l
( source ), sur mon système il s'agit30000
.
Il semblerait qu'avant le dernier redémarrage, j'utilisais le noyau 4.2.5-1, maintenant j'exécute le 4.3.3-2. Le passage à la version 4.2.5-1 corrige tous les problèmes. D'autres articles mentionnant le problème sont ceci et cela . J'ai ouvert un rapport de bogue pour Arch Linux .
Qu'est-ce qui a pu changer cela dans le noyau?
Voici quelques exemples de messages d'erreur:
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