Я использую Docker 0.9.0
uname -a
Linux 3.11.0-18-generic #32-Ubuntu SMP Tue Feb 18 21:11:14 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
У меня работает сразу 40 контейнеров. Каждый контейнер довольно прост - он запускает фрагмент кода в процессе Node. Бесконечный цикл прослушивает дополнительные фрагменты кода для запуска в Node.
Время от времени я помечаю эти контейнеры как убитые и запускаю другой контейнер, чтобы занять его место. У меня были ошибки памяти. Иногда все дает сбой, и Docker сообщает, что «не может выделить память для нового контейнера», а иногда просто тайм-аут сокета.
Постоянные сообщения кошек в меминфо и звонки "бесплатно". Этот отчет предполагает, что у меня есть много памяти не используется.
Команда
ps --sort -rss -eo rss,pid,command | grep docker
при разных сценариях говорит мне, что по мере того, как новые контейнеры заменяют старые контейнеры, память размера резидентного набора постоянно увеличивается. Если я остановлю службу как есть и подожду час, она несколько уменьшится, но никогда не достигнет предыдущего уровня. Например, он никогда не упадет до уровня, на котором были созданы исходные 40 контейнеров.
pmap `pidof docker`
Tells показывает, что все записи [anon] - насколько я понимаю, это память, зарезервированная malloc.
Точка сбоя составляет ~ 2 ГБ, выделенных для RSS демона Docker, по сравнению с ~ 40 МБ в свежем виде.
Я не уверен, что это [другая] ошибка Docker / утечка памяти.
Как это может привести к ошибке нехватки памяти при условии, что свободно сообщает, что 4.5G не используется?
В моей системе нет свопа.
ВАЖНАЯ ИНФОРМАЦИЯ: Docker не может удалить убитые контейнеры через Remote API из-за ошибки драйвера AUFS. По этой причине я полагаюсь на внешний cron для удаления остановленных контейнеров через интерфейс командной строки.
Ты можешь использовать Valgrind чтобы найти проблемы, связанные с памятью:
Использование:
valgrind --tool=memcheck program_name (/sbin/docker or wharever the path to docker is)
valgrind --leak-check=yes program_name
Пример:
valgrind --leak-check=yes /sbin/httpd
Проверьте строки, содержащие определенно проиграл или наверное проиграл чтобы подтвердить утечку памяти.