С помощью docker stats
вы можете видеть использование памяти контейнера с течением времени.
Есть ли способ найти то, что было самым высоким значением использования памяти при запуске docker stats
?
С помощью docker stats
вы можете видеть использование памяти контейнера с течением времени.
Есть ли способ найти то, что было самым высоким значением использования памяти при запуске docker stats
?
Я взял выборку 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
Если вам нужно найти пиковое использование, вам лучше запросить опцию .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 строки в секунду, поэтому файл быстро увеличится, если вы этого не сделаете.
Я бы посоветовал это для сравнительного анализа и устранения неполадок, а не для использования на производственных контейнерах
вы можете использовать команду:
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.
В моем случае я хотел отслеживать док-контейнер, который запускает тесты для моего веб-приложения. Набор тестов довольно большой, он включает в себя тесты 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 #
не только показывает реальное время, но и записывает в файл статистикиsort -n stats | tail