docker - 如何记录 Docker 容器的内存使用峰值?
问题描述
我正在运行许多短命的 docker 容器,每个容器都执行一些内存密集型批处理。我正在寻找一种方法来找到每个容器在运行时命中的峰值内存使用量。了解这一点将使我能够优化运行这些容器的基础设施,以备将来运行。
实现这一点的一种天真的方法是将流输出重定向docker stats
到某个文件:docker stats container_id > stats.log
. 但是,这需要为每个容器运行一个进程,然后对非常详细的日志进行排序以找到峰值使用量。我想知道是否没有更简单的方法。
解决方案
PID=1
如果你对容器内部的进程感兴趣,你可以PID
在主机上找到这个进程,然后使用:
grep VmPeak /proc/$PID/status
带有mongo
容器的示例:
这个容器有一个进程:
$ docker container exec -it mongo top -bn 1
top - 10:04:51 up 32 min, 0 users, load average: 0.36, 0.52, 0.55
Tasks: 2 total, 1 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 6.1 us, 2.0 sy, 0.3 ni, 90.6 id, 0.7 wa, 0.0 hi, 0.3 si, 0.0 st
KiB Mem : 6103572 total, 2642744 free, 1352032 used, 2108796 buff/cache
KiB Swap: 1942896 total, 1942896 free, 0 used. 4277928 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
64 root 20 0 38624 3116 2724 R 6.7 0.1 0:00.89 top
1 mongodb 20 0 1094540 80100 35916 S 0.0 1.3 0:22.51 mongod
要从PID
主机的角度了解此过程:
$ docker inspect -f '{{.State.Pid}}' mongo
2532
最后:
$ grep VmPeak /proc/2532/status
VmPeak: 1094540 kB
链接:
推荐阅读
- r - 根据两个日期列展开行
- javascript - 从 js 数组中删除双引号
- javascript - 如何使用本机反应启用 Proguard?
- sql - 如何找到一个事件时间戳与其后的第一个事件时间戳之间的差异,该时间戳与原始事件不同?
- python - (Py2neo) - 如何在没有密码的情况下获取 neo4j 数据库中关系的 end_node
- html - html是结构化、非结构化还是半结构化数据?
- r - 如何设置 if 语句来选择保留我需要的行?(或删除我不需要的)
- python - 我想知道'pandas ewm'的原理
- c# - 如何使用图像控件居中和裁剪图像
- file-io - 读取用 zstd 压缩的 parquet 文件