Связывание с этой nice post на stressin g использования памяти контейнера. Вот резюме, модифицирована немного работать грузчиком вместо родового LXC:
Launch контейнер с лимитом памяти:
$ sudo docker -m 512M -it ubuntu /bin/bash
root# apt-get update && apt-get install -y build-essential
Создать файл foo.c
внутри контейнера со следующим
#include <stdlib.h>
#include <stdio.h>
int main(void) {
int i;
for (i=0; i<65536; i++) {
char *q = malloc(65536);
printf ("Malloced: %ld\n", 65536*i);
}
sleep(9999999);
}
Скомпилировать файл
gcc -o foo foo.c
Открыть новый минала контролировать использование контейнера памяти:
$ cd /sys/fs/cgroup/memory/lxc/{{containerID}}
$ while true; do echo -n "Mem Usage (mb): " && expr `cat memory.usage_in_bytes`/1024/1024; echo -n "Mem+swap Usage (mb): " && expr `cat memory.limit_in_bytes`/1024/1024; sleep 1; done
Начните потребление памяти в контейнере
$ ./foo
Теперь смотреть контейнер макс вне. Примечание. Когда вы потеряете память, malloc начнет сбой, но в противном случае контейнер остается в покое. Обычно программное обеспечение внутри контейнера вылетает из строя из-за сбоев в работе mallocs, но программное обеспечение, которое является устойчивым, будет продолжать работать.
Заключительное примечание. Флаг -m докера не учитывает подкачку и штырь отдельно. Если вы используете -m 512M
, тогда некоторые из этих 512 будут свопами, а не ОЗУ. Если вы хотите только RAM вам нужно будет использовать параметры LXC непосредственно (что означает, что вам нужно будет запустить докер с драйвером исполнения LXC вместо libcontainer)
# Same as docker -m 512m
sudo docker run --lxc-conf="lxc.cgroup.memory.limit_in_bytes=512M" -it ubuntu /bin/bash
# Set total to equal max RAM (e.g. don't use swap)
sudo docker run --lxc-conf="lxc.cgroup.memory.max_usage_in_bytes=512M" --lxc-conf="lxc.cgroup.memory.limit_in_bytes=512M" -it ubuntu /bin/bash
Существует заметная разница между использованием свопа как часть total и not - с заменой программы foo выше достижения ~ 450M быстро, а затем медленно потребляет оставшуюся часть, тогда как только с ОЗУ она сразу переходит на 511M для меня.При обмене потребление памяти контейнера помечено на уровне ~ 60 м, как только я вхожу в контейнер - это в основном своп, который считается «использованием». Без обмена моего использование памяти < 10M, когда я в контейнер
следите за этим, я вижу некоторые интересные различия между докционированными приложениями на виртуализованном сервере, стилями которого является бокс-металл. Например, OOM убьет Java на виртуализированном сервере ubuntu, на котором запущена служба Java в контейнере. Однако на металле Java соблюдает ограничения памяти, установленные через докер. [Я еще недостаточно знаю о деталях реализации между ними для хороших выводов, просто хотел поделиться) – nerdwaller