Я запускаю докер-сервер на Arch Linux (ядро 4.3.3-2) з кількома контейнерами. З моєї останньої перезавантаження і докер-сервер, і випадкові програми в контейнерах виходять з ладу з повідомленням про неможливість створення потоку або (рідше) для розщеплення. Повідомлення про конкретну помилку відрізняється в залежності від програми, але, здається, більшість із них згадує конкретну помилку Resource temporarily unavailable
. Дивіться наприкінці цієї публікації кілька прикладів повідомлень про помилки.
Зараз є багато людей, які отримали це повідомлення про помилку, і багато відповідей на них. Що насправді засмучує те, що, здається, всі спекулюють, як проблему можна було б вирішити, але, здається, ніхто не вказує, як визначити, яка з багатьох можливих причин проблеми є.
Я зібрав ці 5 можливих причин помилки та як перевірити їх відсутність у моїй системі:
- Існує загальносистемне обмеження щодо кількості потоків, налаштованих у
/proc/sys/kernel/threads-max
( джерело ). У моєму випадку це встановлено60613
. - Кожна нитка займає певний простір у стеці. Ліміт розміру стека налаштовується за допомогою
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
всередині контейнера докер. - Кожна нитка займає деяку пам’ять. Ліміт віртуальної пам'яті налаштовано за допомогою
ulimit -v
. У моїй системі встановлено значенняunlimited
, і 80% моєї 3 ГБ пам'яті є вільною. - Існує обмеження щодо кількості використовуваних процесів
ulimit -u
. Нитки вважаються процесами в цьому випадку ( джерело ). У моїй системі встановлено ліміт30306
, а для демон-докера та всередині докерних контейнерів - ліміт1048576
. Кількість поточно запущених потоків можна дізнатися, запустившиls -1d /proc/*/task/* | wc -l
або запустившиps -elfT | wc -l
( джерело ). У моїй системі вони між700
і800
. - Існує обмеження на кількість відкритих файлів, що згідно з деякими джерелами s також є актуальним при створенні потоків. Ліміт налаштовано за допомогою
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