Docker查看應用的實際內存

前言

咱們把應用部署到Docker裏面以後,有什麼辦法查看這個應用佔用了多少內存呢?docker

docker自己提供了一個命令讓咱們能夠直接看到當前時間全部容易佔用的狀況。ui

docker stats --no-stream

從上面來看,這幾個應用用的內存加起來已是將近12G了。code

可是,這個時候看到機器使用的內存還不到2G。orm

第一反應就是,docker 這個統計太離譜,太坑人了。blog

查了一番資料事後,實際上是計算的問題,也不能說那個是錯的。進程

注: 這裏的 docker 版本是 Docker version 20.10.2, build 2291f61內存

通常來講應用對內存的佔用,這個指標實際上是十分重要的,否則內存泄漏都難以發現。部署

若是咱們想要看到應用比較真實的內存要怎麼作呢?it

處理方案

其實能夠分紅兩個步驟io

  1. 找到應用的真實進程Id(宿主機裏面的)
  2. 從宿主機的 /proc/pid/status 去看 VmRSS 的值

找 Pid

docker inspect 命令能夠看到當前容器的一些信息,裏面也包含了咱們要找的這個 Pid。

docker inspect -f '{{.State.Pid}}' 容器ID

這個時候就找到了對應的Pid了。

ps 看了一下這個Pid確實是應用的。

這個時候第一步就完成了。

查 VmRSS

有了 Pid 以後,要查內存就比較容易了。

直接 cat /proc/pid/status 就能看到了。

雖然說這樣能找到某個應用具體的內存,可是每次都這樣去操做一遍也是挺麻煩的。

並且這樣操做一次只能查一個應用,想看多個應用還要分屢次。

既然有了上面的步驟,那麼咱們就能夠把這個整理成一個腳本,每次執行一下這個腳本就能夠了。

# 找出全部運行的容器
idNames=`docker ps --format "{{.ID}}|{{.Names}},"`

# 按,號分隔
OLD_IFS="$IFS"
IFS=","
arr=($idNames)
IFS="$OLD_IFS"

# 輸出 Title
printf "%-15s %-30s %-15s\n" Id Name Mem

# 遍歷全部容器
for item in ${arr[@]}
do
    # 容器ID和容器名字 按 | 分隔
    OLD_IFS="$IFS"
    IFS="|"
    array=($item)
    IFS="$OLD_IFS"
    
    # 當前容器的Pid
    pid=`docker inspect -f '{{.State.Pid}}' ${array[0]}`
    
    # 當前容器的內存
    mem=$(cat /proc/$pid/status|grep -e VmRSS| awk '{print $2}')

    # 輸出結果
    printf "%-15s %-30s %-15s\n" ${array[0]} ${array[1]} $[$mem / 1024]M
done

執行上面的腳本後,就能夠看到當前正在運行的容器的內存佔用狀況了。

如今看上去,佔用大概是1G多,加上其餘的內存佔用,這個值看上去就和 free 看到的不到2G的使用內存比較接近了。

相關文章
相關標籤/搜索