如何从docker stats中找到MAX内存?

gra*_*aii 17 docker

随着docker stats时间的推移你可以看到容器的内存使用情况.

有没有办法找到运行时内存使用率最高的值docker stats

zby*_*ycz 6

我从这里获取了一个采样脚本,并通过@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
Run Code Online (Sandbox Code Playgroud)

  • 最后一个循环中的行应该是: `grep "$containerid" stats | 排序-r -k3 -h | head -n 1` 1. 头,而不是尾,如果你想要最大值 2. 排序命令的 -h 让它知道它是某种人类可读的格式,并且它现在可以很好地解释 docker 输出,例如“426MiB”(应该,然而,针对字符串比较进行测试,也许这只是运气) (2认同)

Ale*_*xis 6

就我而言,我想监视一个为我的 Web 应用程序运行测试的 docker 容器。测试套件相当大,它包括在真实浏览器中进行 JavaScript 测试,并消耗大量内存和时间。

\n

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

\n

我最终使用了Keiran 解决方案的修改和简化版本:

\n
CONTAINER=$(docker ps -q -f name=CONTAINER_NAME)\nFORMAT=\'{{.MemPerc}}\\t{{.MemUsage}}\\t{{.Name}}\'\n\ndocker stats --format $FORMAT $CONTAINER | sed -u \'s/\\x1b\\[[0-9;]*[a-zA-Z]//g\' | tee stats\n
Run Code Online (Sandbox Code Playgroud)\n

笔记:

\n
    \n
  • CONTAINER=$(docker ps -q -f name=NAME)按名称查找容器,但还有其他选项
  • \n
  • FORMAT=\'{{.MemPerc}} ...}}MemPerc 首先(用于排序);否则你可以发挥创意
  • \n
  • sed -u-u标志很重要,它会关闭缓冲
  • \n
  • | sed -u \'s/\\x1b\\[[0-9;]*[a-zA-Z]//g\'删除 ANSI 转义序列
  • \n
  • | tee stats不仅可以实时显示,还可以写入stats文件
  • \n
  • 当它准备好时,我手动按 Ctrl-C \xe2\x80\x93 并不理想,但对我来说还可以
  • \n
  • 之后很容易找到最大值,例如sort -n stats | tail
  • \n
\n


Kei*_*ine 5

如果您需要找到峰值使用量,最好请求该.MemPerc选项并根据总内存进行计算(除非您限制了容器可用的内存)。 .MemUsage具有在容器生命周期中改变的单位,这会影响结果。

docker stats --format 'CPU: {{.CPUPerc}}\tMEM: {{.MemPerc}}'
Run Code Online (Sandbox Code Playgroud)

您可以将正在进行的日志流式传输到文件(或脚本)。

要获得最初请求的最大内存:

(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
Run Code Online (Sandbox Code Playgroud)

然后您可以向系统询问其总 RAM(再次假设您没有限制 docker 可用的 RAM)并计算:

awk '/MemTotal/ {print $2}' /proc/meminfo
Run Code Online (Sandbox Code Playgroud)

您需要知道在使用上述超时时容器将运行多长时间,但是如果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
Run Code Online (Sandbox Code Playgroud)

请注意,它通过管道传输到 gzip。在这种形式中,您每秒获得约 2 行,因此如果您不这样做,文件会迅速变大。

我建议将其用于基准测试和故障排除,而不是用于生产容器