Следует ли Docker освободить всю память, когда все контейнеры закрыты? - PullRequest
0 голосов
/ 19 июня 2020

Я отлаживаю возможную утечку памяти в веб-службе, запущенной как сеть Docker. У сервиса есть интерфейс Javascript, Flask REST API, Dask рабочий пул, spaCy инструментарий естественного языка ... все работает. Я вижу периодические проблемы с нехваткой памяти и пытаюсь разобраться в том, что может происходить.

Я могу запустить эту систему на своем ноутбуке, MacBook Pro с 16 ГБ памяти, где Я использую Docker Desktop. Когда нет запущенных контейнеров, Activity Monitor показывает com. docker .hyperkit, используя около 12 ГБ. Затем я запускаю сеть Docker, которая в конечном итоге запускает 14 контейнеров для размещения различных компонентов. Я выполняю довольно большую пакетную работу в сети Docker. Он работает в течение часа, в течение которого объем памяти com. docker .hyperkit увеличивается примерно до 18 ГБ. Это неудивительно - это служба, интенсивно использующая память. Но когда я останавливаю все контейнеры в сети, я ожидаю, что использование памяти com. docker .hyperkit упадет до 12 ГБ. Вместо этого он остается на уровне 18 ГБ. Единственный способ вернуть его к 12 ГБ - это перезапустить Docker рабочий стол.

Это ожидаемое поведение? Похоже на утечку памяти в Docker.

1 Ответ

1 голос
/ 19 июня 2020

Нет, он не должен освобождать память, и да, это ожидаемое поведение.

Нет возможности запускать контейнеры docker изначально на MacOS, поэтому вы запускаете их внутри виртуальной машины. Виртуальной машине назначается память, которую она назначает процессам, выполняющимся внутри этой виртуальной машины. Когда эти процессы внутри виртуальной машины завершаются, ресурсы возвращаются виртуальной машине, но не родительской MacOS. Именно так работает виртуальная машина, и тот факт, что она не занимала всю память до предела, указанного в настройках Docker сразу при запуске, сам по себе впечатляющий подвиг.

Сами контейнеры являются процессами выполняются в этой виртуальной машине, и они вернут всю свою память обратно виртуальной машине при выходе. Если вы запустите что-то вроде docker run --rm busybox free, вы, вероятно, увидите, что память используется и освобождается внутри виртуальной машины.

Для получения дополнительной информации об этом, есть несколько обширных потоков в выпусках github. Большинство комментариев к этим потокам, по-видимому, исходят от пользователей, предполагающих, что MacOS использует контейнеры, а не виртуальную машину, которая запускает контейнеры. Даже при полном бездействии эта виртуальная машина будет использовать некоторые ресурсы для запуска ядра, демонов выполнения контейнера, кода разделения тома, кода переадресации портов и т. Д. c. Под крышками есть много magi c, чтобы docker не выглядел как виртуальная машина для пользователя, так что вы можете просто передавать пути и подключаться к портам на стороне MacOS. Самый полезный для меня комментарий в ветке здесь: https://github.com/moby/hyperkit/issues/231#issuecomment -448416559

...