Con las docker stats , puede ver el uso de memoria de un contenedor a lo largo del tiempo.
¿Hay alguna manera de encontrar cuál fue el valor más alto de uso de memoria mientras se ejecutaban las docker stats ?
Tomé un script de muestra de aquí y agregué datos de @pl_rock. Pero tenga cuidado: el comando de sort solo compara valores de cadena, por lo que los resultados suelen ser incorrectos (pero está bien para mí). También tenga en cuenta que la ventana acoplable a veces informa números incorrectos (es decir, más memoria asignada que RAM física).
Aquí está el guión:
#!/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) doneSi necesita encontrar el uso máximo, es mejor que solicite la opción .MemPerc y calcule en función de la memoria total (a menos que haya restringido la memoria disponible para el contenedor). .MemUsage tiene unidades que cambian durante la vida útil del contenedor que alteran el resultado.
docker stats --format 'CPU: {{.CPUPerc}}\tMEM: {{.MemPerc}}'Puede transmitir un registro en curso a un archivo (o secuencia de comandos).
Para obtener solo la memoria máxima como se solicitó originalmente:
(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 1Y luego puede pedirle al sistema su RAM total (suponiendo nuevamente que no limitó la RAM disponible para la ventana acoplable) y calcular:
awk '/MemTotal/ {print $2}' /proc/meminfo Necesitaría saber cuánto tiempo se ejecutará el contenedor cuando use el tiempo de espera como se indicó anteriormente, pero si docker stats se ejecutaron sin esto en segundo plano enviado por un script, podría eliminarlo una vez que se complete el contenedor.
...
Este comando le permite generar una serie temporal de la carga de CPU/memoria:
(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.gzTenga en cuenta que se conecta a gzip. De esta forma, obtiene ~ 2 filas por segundo, por lo que el archivo aumentaría rápidamente si no lo hace.
Aconsejaría esto para la evaluación comparativa y la resolución de problemas en lugar de usarlo en contenedores de producción.
En mi caso, quería monitorear un contenedor docker que ejecuta pruebas para mi aplicación web. El conjunto de pruebas es bastante grande, incluye pruebas de JavaScript en un navegador real y consume una cantidad significativa de memoria y tiempo.
Idealmente, quería ver el uso actual de la memoria en tiempo real, pero también mantener el historial para un análisis posterior.
Terminé usando una versión modificada y simplificada de la solución de Keiran :
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 statsNotas:
CONTAINER=$(docker ps -q -f name=NAME) # busca contenedor por nombre, pero hay otras opcionesFORMAT='{{.MemPerc}} ...}} # MemPerc va primero (para ordenar); de lo contrario puedes ser creativosed -u # el indicador -u es importante, desactiva el almacenamiento en búfer| sed -u 's/\x1b\[[0-9;]*[a-zA-Z]//g' # elimina las secuencias de escape ANSI| tee stats # no solo muestra el tiempo real, sino que también escribe en el archivo de estadísticassort -n stats | tail