Назад | Перейти на главную страницу

Утечка памяти докеров?

Я использую 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

Проверьте строки, содержащие определенно проиграл или наверное проиграл чтобы подтвердить утечку памяти.