2016-11-08 3 views
1

ПреамбулаDocker не работает, как ожидалось

Я пишу немного презентации перечислить некоторые «ошибки» при использовании Докер, и я столкнулся с одним из моих собственных.

Объясняя опасности, позволяющие Docker работать без ограничений памяти, я обнаружил, что он не ведет себя так, как я ожидал.

Я создал изображение докеров с PHP-скриптом, который будет рекурсивно создавать массивы для использования памяти, сообщая, сколько памяти в настоящее время используется. Скрипт убивает себя в 1gb, если ограничение памяти не установлено.

Вы можете получить изображение здесь: https://hub.docker.com/r/gisleburt/my-memory-hog
Вы можете увидеть исходный код здесь: https://github.com/Gisleburt/my-memory-hog

Мое ожидание было то, что следующий будет препятствовать сценарий, выходящие за рамки 128mb памяти.

docker run -it --memory=128m --memory-swap=0 gisleburt/my-memory-hog 

Однако на OSX (как родной, и докер-машина, использующая драйвер виртуального окна), докер на самом деле сценарий просто перед тем 250МБ. На Ubuntu скрипт достигает 1gb и сам убивает.

Страннее еще, если мы исследуем то, что происходит с docker stats, мы можем видеть, что контейнер на самом деле не переходить это ограничение по памяти. Фактически, работая с --memory=4m на Ubuntu, docker stats все еще говорит, что он не использует больше, чем 4 Мб, хотя скрипт завершен на 1 ГБ. На Mac ограничение на 4 МБ убивает скрипт вокруг метки 5-6mb.

Я предполагаю, что мне не хватает чего-то о том, как распределена память, но я не могу понять, что это такое.

Вопрос

Почему скрипт в контейнере Docker появляются использовать больше памяти, чем контейнер Докер? Что происходит с памятью внутри и снаружи контейнера?

Version Info

Mac Клиент:

Client: 
Version:  1.12.3 
API version: 1.24 
Go version: go1.6.3 
Git commit: 6b644ec 
Built:  Thu Oct 27 00:09:21 2016 
OS/Arch:  darwin/amd64 
Experimental: true 

Mac Native:

Server: 
Version:  1.12.3 
API version: 1.24 
Go version: go1.6.3 
Git commit: 6b644ec 
Built:  Wed Oct 26 23:26:11 2016 
OS/Arch:  linux/amd64 

Mac Virtual Box Машина:

Server: 
Version:  1.12.3 
API version: 1.24 
Go version: go1.6.3 
Git commit: 6b644ec 
Built:  Thu Oct 27 00:09:21 2016 
OS/Arch:  linux/amd64 
Experimental: true 

Ubuntu Клиент:

Client: 
Version:  1.12.3 
API version: 1.24 
Go version: go1.6.3 
Git commit: 6b644ec 
Built:  Wed Oct 26 22:01:48 2016 
OS/Arch:  linux/amd64 

Ubuntu Двигатель:

Server: 
Version:  1.12.3 
API version: 1.24 
Go version: go1.6.3 
Git commit: 6b644ec 
Built:  Wed Oct 26 22:01:48 2016 
OS/Arch:  linux/amd64 

ответ

0

С помощью целого ряда людей в нашем техническом отделе, и, в частности, один из членов нашей команды операций платформы, мы работали, что происходит и -, упомянутый в reference guide.

--memory-swap Общий предел памяти (памяти + своп, формат: < номер > [< блок >]). Число - положительное целое число. Единица может быть одной из b, k, m или g.

Должно быть указано, что --memory-swap - это общий объем доступной памяти, как резидент, так и своп.

Для того, чтобы получить желаемый эффект, вы должны запустить:

docker run -it --memory=128m --memory-swap=128m gisleburt/my-memory-hog 

В этом примере memory = 128mb и memory + swap = 128mb поэтому swap = 0.

Также имеет смысл, что вы не можете указать число для --memory-swap, которое больше 0, но меньше, чем --memory.

Кроме того, в то время как --memory-swap=-1 дает «бесконечный» объем памяти через своп, по некоторым причинам, установка --memory-swap=0, кажется, делают память и поменять тот же размер, что дает вам общий объем памяти вдвое больше, чем вы ожидали ,

Вы также можете отключить подкачку, используя --memory-swappiness=0. Хотя файл подкачки может быть создан, он не будет записываться и, следовательно, не займет больше места на диске, чем пустой файл.

TL; DR:

--memory = RES 
--memory-swap = VIRT = RES + SWAP 
Смежные вопросы