我正在运行许多短命的码头容器,每个容器都进行一些内存密集型的批处理。我正在寻找一种方法来查找每个容器在运行时遇到的峰值内存使用情况。了解这一点将允许我优化运行这些容器的基础设施,以便将来运行。
实现这一目标的一个简单方法是将docker stats的流输出重定向到某个文件:docker stats container_id > stats.log。但是,这需要为每个容器运行一个进程,然后对非常冗长的日志进行排序,以找到峰值使用情况。我在想有没有更简单的办法。
发布于 2019-10-08 10:12:29
如果您对容器中有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链接:
发布于 2022-01-14 13:49:10
docker stats有自定义输出的--format选项。例如,我们只能输出内存使用情况:
docker stats --no-stream --format '{{.MemUsage}}' CONTAINER_ID
516KiB / 8GiB命令中的CONTAINER_ID必须替换为容器的ID (我们可以用docker ps获得)。
516 8GiB是容器的当前内存使用情况,8 8GiB是容器允许使用的最大内存。
在GNU上,我们可以使用cut从输出中筛选出内存使用情况,并将输出重定向到一个文件中:
docker stats --no-stream --format '{{.MemUsage}}' CONTAINER_ID | cut -d '/' -f 1 >>docker-stats最后,我们可以将此命令放入while循环,并在迭代之间添加一秒钟的延迟:
while true; do docker stats --no-stream --format '{{.MemUsage}}' CONTAINER_ID | cut -d '/' -f 1 >>docker-stats; sleep 1; done这样,在docker-stats文件中,我们将获得一个具有1秒分辨率的容器的内存使用值列表。当然,如果一个高峰持续不到1秒,我们可能会错过它。
https://stackoverflow.com/questions/58283529
复制相似问题