Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to find MAX memory from docker stats?

Tags:

docker

With docker stats you can see the memory usage of a container over time.

Is there a way to find what the highest value of memory usage was while running docker stats?

like image 332
grayaii Avatar asked Mar 15 '17 12:03

grayaii


People also ask

How do I know how much Docker memory I have?

If you need more detailed information about a container's resource usage, use the /containers/(id)/stats API endpoint. On Linux, the Docker CLI reports memory usage by subtracting cache usage from the total memory usage.

How much memory does a Docker container have?

The maximum amount of memory the container can use. If you set this option, the minimum allowed value is 6m (6 megabytes). That is, you must set the value to at least 6 megabytes.

What is PIDs in Docker stats?

PIDs. the number of processes or threads the container has created. Running docker stats on multiple containers by name and id against a Linux daemon.

What is default Docker memory limit?

By default, the container can swap the same amount of assigned memory, which means that the overall hard limit would be around 256m when you set --memory 128m .


2 Answers

I took a sampling script from here and aggregated data by @pl_rock. But be careful - the sort command only compares string values - so the results are usually wrong (but ok for me). Also mind that docker is sometimes reporting wrong numbers (ie. more allocated mem than physical RAM).

Here is the script:

#!/bin/bash  "$@" & # 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     # maybe: | sort -r -k3 -h | head -n 1     # see comment below (didnt tested) done 
like image 196
zbycz Avatar answered Oct 23 '22 14:10

zbycz


If you need to find the peak usage you are better off requesting the .MemPerc option and calculating based on the total memory (unless you restricted the memory available to the container). .MemUsage has units which change during the life of the container which mess with the result.

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

You can stream an ongoing log to a file (or script).

To get just the max memory as originally requested:

(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

And then you can ask the system for its total RAM (again assuming you didn't limit the RAM available to docker) and calculate:

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

You would need to know how long the container is going to run when using timeout as above, but if docker stats was run without this in background submitted by a script it could kill it once the container completed.

...

This command allows you to generate a time-series of the cpu/memory load:

(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

Note that it pipes into gzip. In this form you get ~2 rows per second so the file would get large rapidly if you don't.

I'd advise this for benchmarking and trouble shooting rather than use on production containers

like image 34
Keiran Raine Avatar answered Oct 23 '22 16:10

Keiran Raine