Я создал контейнер, в котором создал ~ 10 процессов. Я хочу проанализировать, сколько памяти они потребляют. Для этого я побежал top
внутри контейнера, и docker stats
вне.
В top
, Я вижу 10 процессов, каждый из которых занимает 50 МБ резидент объем памяти. Так что я ожидал docker stats
чтобы отобразить как минимум 500 МБ памяти, используемой контейнером, но отображается только 140 МБ.
Откуда это несоответствие? Какое реальное потребление памяти?
вывод htop:
вывод статистики докеров:
В Linux процесс fork () ed изначально ссылается на те же страницы памяти, что и его родитель, в схеме копирования при записи. Запуск нескольких копий одного и того же объекта обеспечивает очень хороший коэффициент дедупликации.
Использование памяти контейнера - это точное потребление. Его реализация cgroups использует ядро для отслеживания ресурсов. (То же самое относится и к другим пользователям cgroups, таким как фрагменты systemd.) Но достижение предела по умолчанию вызовет убийцу OOM.
Практический предел находится где-то между наблюдаемым использованием контейнера и суммой размера резидентного набора. Консервативно, вы можете начать с 500 МБ. Это намного лучше, чем неограниченный лимит всей вашей памяти в 62 000 МБ.