如何从码头工人统计数据中找到最大内存?



通过docker stats,您可以查看容器随时间推移的内存使用情况。

有没有办法找到运行docker stats时内存使用量的最高值是多少?

如果需要查找峰值使用情况,最好请求.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

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

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

如上所述,您需要知道使用超时时容器将运行多长时间,但如果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

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

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

我从这里获取了一个采样脚本,并按@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

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

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

我最终使用了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 stats

笔记:

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

您可以使用命令:

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. 

最新更新