如何找出Docker运行执行的RAM最多消耗多少?

时间:2017-06-29 12:50:10

标签: docker memory-management ram

我创建了一个新的docker服务,并确定了它所需的资源。由于将RAM应用于新服务是贪婪的 - 说容器可以有8GB的RAM来获取它们 - 我不想浪费集群的资源。

现在我正在尝试找出Docker在其峰值时运行的内存量。

例如,我创建了一个httpie-image(对于正确的偏执,我执行的Dockerfile is also on dockerhub

0

我知道有一个docker stats命令,但它似乎显示当前内存使用情况,我真的不想监视它。

如果我在容器结束后运行它,它将显示d。 (要获取容器ID,我使用$ docker run -itd k0pernikus/httpie-docker-alpine HEAD https://stackoverflow.com/ 132a93ffc9e297250b8ca37b2563aa2b5e423e146890fe3383a91a7f26ef990c $ docker stats 132a93ffc9e297250b8ca37b2563aa2b5e423e146890fe3383a91a7f26ef990c 标志。)

CONTAINER                                                          CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
132a93ffc9e297250b8ca37b2563aa2b5e423e146890fe3383a91a7f26ef990c   0.00%               0 B / 0 B           0.00%               0 B / 0 B           0 B / 0 B           0

它会显示:

<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
  <ribbon>
    <tabs>
      <tab idMso="TabAddIns" label="NEW_TAB">
        <group id="StatsGroup" label="Statistics">
          <labelControl id="lblSmallText" label="Stats are:  "/>
          <labelControl id="lblNormalText" label="Dollars Saved"/>
          <labelControl id="lblBigText"       label="$12345"/>
          <!--
          <labelControl id="lblNormalText" label="as of today"/>
          -->          
        </group>        
      </tab>
    </tabs>
  </ribbon>  
</customUI>

然而它最多消耗了多少RAM?

1 个答案:

答案 0 :(得分:1)

tl; dr:

  • 启用内存记帐
  • cat /sys/fs/cgroup/memory/docker/${CONTAINER_ID}/memory.max_usage_in_bytes

Docker uses cgroups under the hood。我们只需要问内核正确的问题即可,即cat是正确的文件。为此,必须启用内存记帐(如文档中所述)。

在基于systemd的系统上,这非常简单。为docker守护进程创建一个嵌入式配置:

systemctl set-property docker.service MemoryAccounting=yes
systemctl daemon-reload
systemctl restart docker.service

(这会增加一点开销,尽管每次容器分配RAM时必须更新一个计数器。更多详细信息:https://lwn.net/Articles/606004/

然后使用您可以通过docker inspect发现的完整容器ID:

docker inspect --format="{{.Id}}" $CONTAINER_NAME

您可以获得使用的最大内存:

cat /sys/fs/cgroup/memory/docker/${CONTAINER_ID}/memory.max_usage_in_bytes

容器必须运行才能正常工作。