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