我从这里获取了一个采样脚本,并通过@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)
就我而言,我想监视一个为我的 Web 应用程序运行测试的 docker 容器。测试套件相当大,它包括在真实浏览器中进行 JavaScript 测试,并消耗大量内存和时间。
\n理想情况下,我想实时观察当前的内存使用情况,但也保留历史记录以供以后分析。
\n我最终使用了Keiran 解决方案的修改和简化版本:
\nCONTAINER=$(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\nRun Code Online (Sandbox Code Playgroud)\n笔记:
\nCONTAINER=$(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文件sort -n stats | tail如果您需要找到峰值使用量,最好请求该.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 行,因此如果您不这样做,文件会迅速变大。
我建议将其用于基准测试和故障排除,而不是用于生产容器
| 归档时间: |
|
| 查看次数: |
3125 次 |
| 最近记录: |