Docker查看应用的实际内存
前言
我們把應(yīng)用部署到Docker里面之后,有什么辦法查看這個應(yīng)用占用了多少內(nèi)存呢?
docker本身提供了一個命令讓我們可以直接看到當(dāng)前時間所有容易占用的情況。
docker?stats?--no-stream從上面來看,這幾個應(yīng)用用的內(nèi)存加起來已經(jīng)是將近12G了。
但是,這個時候看到機(jī)器使用的內(nèi)存還不到2G。
第一反應(yīng)就是,docker 這個統(tǒng)計太離譜,太坑人了。
查了一番資料過后,其實是計算的問題,也不能說那個是錯的。
注:這里的 docker 版本是 Docker version 20.10.2, build 2291f61
一般來說應(yīng)用對內(nèi)存的占用,這個指標(biāo)其實是十分重要的,不然內(nèi)存泄漏都難以發(fā)現(xiàn)。
如果我們想要看到應(yīng)用比較真實的內(nèi)存要怎么做呢?
處理方案
其實可以分成兩個步驟
找到應(yīng)用的真實進(jìn)程Id(宿主機(jī)里面的)
從宿主機(jī)的 /proc/pid/status 去看 VmRSS 的值
找 Pid
docker inspect 命令可以看到當(dāng)前容器的一些信息,里面也包含了我們要找的這個 Pid。
docker?inspect?-f?'{{.State.Pid}}'?容器ID這個時候就找到了對應(yīng)的Pid了。
ps 看了一下這個Pid確實是應(yīng)用的。
這個時候第一步就完成了。
查 VmRSS
有了 Pid 之后,要查內(nèi)存就比較容易了。
直接 cat /proc/pid/status 就能看到了。
雖說這樣能找到某個應(yīng)用具體的內(nèi)存,但是每次都這樣去操作一遍也是挺麻煩的。
而且這樣操作一次只能查一個應(yīng)用,想看多個應(yīng)用還要分多次。
既然有了上面的步驟,那么我們就可以把這個整理成一個腳本,每次執(zhí)行一下這個腳本就可以了。
#?找出所有運行的容器 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"#?當(dāng)前容器的Pidpid=`docker?inspect?-f?'{{.State.Pid}}'?${array[0]}`#?當(dāng)前容器的內(nèi)存mem=$(cat?/proc/$pid/status|grep?-e?VmRSS|?awk?'{print?$2}')#?輸出結(jié)果printf?"%-15s?%-30s?%-15s\n"?${array[0]}?${array[1]}?$[$mem?/?1024]M done? 執(zhí)行上面的腳本后,就可以看到當(dāng)前正在運行的容器的內(nèi)存占用情況了。現(xiàn)在看上去,占用大概是1G多,加上其他的內(nèi)存占用,這個值看上去就和 free 看到的不到2G的使用內(nèi)存比較接近了。
總結(jié)
以上是生活随笔為你收集整理的Docker查看应用的实际内存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国产CPU群雄逐鹿谁主沉浮
- 下一篇: Asp.Net Core之Identit