如何从docker统计中找到最大内存?

如何从docker统计中找到最大内存?,docker,Docker,使用docker stats可以查看容器随时间的内存使用情况 运行docker stats时,是否有办法找到内存使用的最高值?您可以使用以下命令: docker stats --no-stream | awk '{ print $3 }' | sed '1d'|sort | tail -1 它将通过容器提供最高的内存 让我解释一下: --no-stream : Disable streaming stats and only pull the first result a

使用
docker stats
可以查看容器随时间的内存使用情况

运行
docker stats
时,是否有办法找到内存使用的最高值?

您可以使用以下命令:

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. 

我从@pl_rock获取了一个采样脚本,并聚合了数据。但是要小心,
sort
命令只比较字符串值,所以结果通常是错误的(但对我来说没问题)。 还要注意docker有时会报告错误的数字(即分配的内存多于物理RAM)

以下是脚本:

#!/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

如果需要查找峰值使用率,最好请求
.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
您需要知道在如上所述使用超时时容器将运行多长时间,但是如果
docker stats
在后台运行时没有脚本提交,那么一旦容器完成,它可能会杀死它

此命令允许您生成cpu/内存负载的时间序列:

(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
(超时20 docker统计数据--格式\
'CPU:{.CPUPerc}}\tMEM:{{.MemPerc}}'\
|sed的//\x1b\[[0-9;]*[a-zA-Z]//g';echo)\
|gzip-c>monitor.log.gz
请注意,它通过管道传输到gzip。在这种形式中,每秒可以获得~2行,因此如果不这样做,文件将迅速变大


我建议将其用于基准测试和故障排除,而不是在生产容器上使用。在我的例子中,我想监控一个docker容器,该容器为我的web应用程序运行测试。测试套件相当大,它在真实浏览器中包含javascript测试,并且消耗大量内存和时间

理想情况下,我希望实时观察当前的内存使用情况,但也希望保留历史记录以供以后分析

我最终使用了一个经过修改和简化的版本:

CONTAINER=$(docker ps-q-f name=CONTAINER\u 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#
    标记非常重要,它关闭缓冲
  • |sed-u's/\x1b\[[0-9;]*[a-zA-Z]//g'.
    删除ANSI转义序列
  • | tee stats#
    不仅显示实时数据,还写入stats文件
  • 当它准备好时,我可以手动Ctrl-C键–这并不理想,但对我来说还行
  • 在这之后,很容易找到类似于
    sort-n stats | tail

我认为这将通过即时检查告诉您使用最多内存的任何容器的当前值。我对问题的理解是,在docker stats运行期间,他们正在寻找所有容器中的最高内存(非即时)抱歉,我应该说得更具体一些。我想对单个容器运行docker stats一段较长的时间,并计算出它在这段时间内使用的最大内存。可能类似于“watch”docker stats container--no stream |?“。这太可怕了。上一个周期中的行应该是:
grep”$containerid“stats | sort-r-k3-h | head-n1
1。如果您希望sort命令的最大值为2.-h,那么head而不是tail会让它看起来是一种人类可读的格式,它现在可以很好地解释docker输出,例如“426MiB”(不过,应该根据字符串比较进行测试,也许这只是运气而已)
(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