Как найти MAX-память из статистики докеров?

С помощью docker stats вы можете видеть использование памяти контейнера с течением времени.

Есть ли способ найти то, что было самым высоким значением использования памяти при запуске docker stats?

Ответ 1

Я взял выборку script из здесь и агрегированные данные @pl_rock. Но будьте осторожны - команда sort сравнивает только строковые значения, поэтому результаты обычно неправильны (но хорошо для меня). Также помните, что докер иногда сообщает о неправильных номерах (т.е. Более распределенной памяти, чем в физической памяти).

Вот script:

#!/bin/bash

"[email protected]" & # Run the given command line in the background.
pid=$!

echo "" > stats

while true; do
  sleep 1
  sample="$(ps -o rss= $pid 2> /dev/null)" || break

  docker stats --no-stream --format "{{.MemUsage}} {{.Name}} {{.Container}}" | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0 }' >> stats
done

for containerid in `awk '/.+/ { print $7 }' stats | sort | uniq`
do
    grep "$containerid" stats | sort -r -k3 | tail -n 1
done

Ответ 2

Если вам нужно найти пиковое использование, вам лучше запросить опцию .MemPerc и рассчитать ее на основе общего объема памяти (если вы не ограничили объем памяти, доступный для контейнера). .MemUsage имеет единицы измерения, которые меняются в течение срока службы контейнера, что портит результат.

docker stats --format 'CPU: {{.CPUPerc}}\tMEM: {{.MemPerc}}'

Вы можете передавать текущий журнал в файл (или скрипт).

Чтобы получить максимальный объем памяти в соответствии с первоначальным запросом:

(timeout 120 docker stats --format '{{.MemPerc}}' <CONTAINER_ID> \
  | sed 's/\x1b\[[0-9;]*[a-zA-Z]//g' ; echo) \
  | tr -d '%' | sort -k1,1n | tail -n 1

А затем вы можете запросить у системы общий объем ОЗУ (опять же, при условии, что вы не ограничивали объем доступной для докера ОЗУ) и рассчитать:

awk '/MemTotal/ {print $2}' /proc/meminfo

Вам нужно знать, сколько времени будет работать контейнер при использовании тайм-аута, как указано выше, но если docker stats был запущен без этого в фоновом режиме, представленном сценарием, он может убить его, как только контейнер завершит работу.

...

Эта команда позволяет вам генерировать временные ряды загрузки процессора/памяти:

(timeout 20 docker stats --format \
  'CPU: {{.CPUPerc}}\tMEM: {{.MemPerc}}' <CONTAINER_ID> \
  | sed 's/\x1b\[[0-9;]*[a-zA-Z]//g' ; echo) \
  | gzip -c > monitor.log.gz

Обратите внимание, что это pipe в gzip. В этой форме вы получаете ~ 2 строки в секунду, поэтому файл быстро увеличится, если вы этого не сделаете.

Я бы посоветовал это для сравнительного анализа и устранения неполадок, а не для использования на производственных контейнерах

Ответ 3

вы можете использовать команду:

docker stats --no-stream | awk '{ print $3 }' | sed '1d'|sort | tail -1

Это даст большую память контейнеру.

Позвольте мне объяснить команду:

 --no-stream :          Disable streaming stats and only pull the first result
 awk '{ print $3 }' :   will print MEM USAGE
 sed '1d' :             will delete first entry that is %
 sort :                 it will sort the result
 tail -1 :              it will give last entry that is highest. 

Ответ 4

В моем случае я хотел отслеживать док-контейнер, который запускает тесты для моего веб-приложения. Набор тестов довольно большой, он включает в себя тесты javascript в реальном браузере и потребляет значительное количество как памяти, так и времени.

В идеале я хотел наблюдать за текущим использованием памяти в режиме реального времени, но также сохранять историю для последующего анализа.

Я получил измененную и упрощенную версию кейранского решения:

CONTAINER=$(docker ps -q -f name=CONTAINER_NAME)
FORMAT='{{.MemPerc}}\t{{.MemUsage}}\t{{.Name}}'

docker stats --format $FORMAT $CONTAINER | sed -u 's/\x1b\[[0-9;]*[a-zA-Z]//g' | tee stats

Примечание:

  • CONTAINER=$(docker ps -q -f name=NAME) # найти контейнер по имени, но есть другие варианты
  • FORMAT='{{.MemPerc}} ...}} # MemPerc идет первым (для сортировки); в противном случае вы можете быть креативным
  • sed -u # флаг -u важен, он отключает буферизацию
  • | sed -u 's/\x1b\[[0-9;]*[a-zA-Z]//g' # удаляет escape-последовательности ANSI
  • | tee stats # не только показывает реальное время, но и записывает в файл статистики
  • Я Ctrl-C команда вручную, когда она готова - не идеально, но хорошо для меня
  • после этого легко найти максимум с чем-то вроде sort -n stats | tail