Почему Openshift сообщает о гораздо большем использовании памяти контейнера, чем тот же контейнер Docker, работающий локально? - PullRequest
3 голосов
/ 28 марта 2020

У меня есть контейнер Docker, который сообщает об использовании этого ресурса при локальном запуске:

docker run -i --rm -p 8080:8080 my-application

Как видите, контейнер использует 10,6 МБ:

docker ps -q | xargs  docker stats --no-stream             
CONTAINER ID        NAME                 CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS
b73afe5ee771        mystifying_neumann   0.00%               10.6MiB / 7.777GiB   0.13%               11.7kB / 2.38kB     0B / 0B             21

Теперь я запускаю этот контейнер в Openshift, устанавливая следующие ограничения памяти:

        resources:
          limits:
            memory: 64Mi
          requests:
            memory: 64Mi

Когда модуль запускается, я ожидал, что ~ 11MiB используется из 64MiB. Однако контейнер использует 53MiB !!! Почему эта разница?

enter image description here

1 Ответ

1 голос
/ 31 марта 2020

Я наконец нашел причину этой разницы в этих двух ссылках:

https://github.com/openshift/origin-web-console/issues/1315

https://access.redhat.com/solutions/3639191

Подведение итогов: Docker сообщает о памяти как о добавлении нескольких элементов, таких как rss и кеш:

https://docs.docker.com/config/containers/runmetrics/#metrics -from-cgroups-memory-cpu-block-io

кэш Объем памяти, используемый процессами этой группы управления, который может быть точно связан с блоком на блочном устройстве. Когда вы читаете файлы и записываете их на диск, эта сумма увеличивается. Это тот случай, если вы используете «обычный» ввод / вывод (открывать, читать, записывать системные вызовы), а также отображаемые файлы (с помощью mmap). Он также учитывает память, используемую монтируемыми tmpfs, хотя причины неясны.

rss Объем памяти, который не соответствует чему-либо на диске: стеки, кучи и анонимные карты памяти.

Openshift 3.x считывает эту информацию с помощью Heapster и не может сказать appart оба типа памяти.

Если вы проверите docker статистику контейнера, который работает внутри Openshift, вы будете найти ожидаемое (нижнее) значение.

...