[英]How to record the peak memory usage of a Docker container?
我正在運行一些短暫的 docker 容器,每個容器都執行一些內存密集型批處理。 我正在尋找一種方法來找到每個容器在運行時命中的峰值memory 使用量。 了解這一點將使我能夠優化運行這些容器的基礎設施,以備將來運行。
實現此目的的一種天真的方法是將docker stats
的流式 output 重定向到某個文件: 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
鏈接:
docker stats
有--format
選項來自定義 output。 例如我們可以 output 只有 memory 用法:
docker stats --no-stream --format '{{.MemUsage}}' CONTAINER_ID
516KiB / 8GiB
命令中的CONTAINER_ID
必須替換為我們容器的 ID(我們可以使用docker ps
獲得)。
516KiB 是容器當前的 memory 使用量,8GiB 是容器允許使用的最大 memory。
在 GNU/Linux 上,我們可以從 output 中過濾掉 memory 使用情況,並cut
並將 output 重定向到一個文件中:
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 docker-stats
文件中,我們將得到一個分辨率為一秒的容器的 memory 使用值列表。 當然,如果一個峰值持續不到一秒,我們可能會錯過它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.