如何记录 Docker 容器的峰值内存使用情况?

Vit*_*ito 7 docker

我正在运行许多短期的 docker 容器,每个容器都执行一些内存密集型批处理。我正在寻找一种方法来查找每个容器在运行时达到的峰值内存使用量。知道这一点将使我能够优化运行这些容器的基础架构,以备将来运行。

实现此目的的一种天真的方法是将流输出重定向docker stats到某个文件:docker stats container_id > stats.log. 但是,这需要为每个容器运行一个进程,然后对非常冗长的日志进行排序以找到使用高峰。我想知道是否有更简单的方法。

tgo*_*gos 7

如果你对PID=1容器内部的进程感兴趣,你可以PID在主机上找到这个进程,然后使用:

grep VmPeak /proc/$PID/status
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

要从PID主机的角度了解此过程:

$ docker inspect -f '{{.State.Pid}}' mongo
2532
Run Code Online (Sandbox Code Playgroud)

最后:

$ grep VmPeak /proc/2532/status
VmPeak:  1094540 kB
Run Code Online (Sandbox Code Playgroud)

链接:

  • 看起来在 macOS 上你可以通过读取容器内的 /proc 来获取这些数据。 (2认同)