docker stats 内存占用不准确
在使用docker进行地图check的过程中,发现有内存泄漏。在解决的过程中发现,使用top统计的各进程占用的内存,大于docker stats显示的内存。
top:
# 将当前的docker内,所有进程占用内存输出
top -d 2 -n 1 -b>test.txt
# 第一种方法:直接统计所有进程占用的内存(%MEM)
cat test3.txt | awk '/root/ {sum+=$10}END{print sum}'
# 第二种方法:统计RES、SHR的总和,然后相减。
# RES总数:
cat test3.txt | awk '/root/ {sum+=$6}END{print sum}'
# SHR总数:
cat test3.txt | awk '/root/ {sum+=$7}END{print sum}'
第一种结果:
31G*55.6%=17.2G
第二种方法:
(RES- SHR)/1024/1024 = 16.6G
docker stats:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
************ map_check 595.93% 11.32GiB / 31GiB 36.51% 7.33GB / 7.57GB 4.04GB / 242GB 318
结果是只有11.32G。
正好手头有docker的项目,而且正好docker中的python存在内存泄漏,就用4种方法对这个泄漏进行排查。查看哪种更准确
# 方法1,使用top,输出统计docker内所有相关python进程MEM % 之和(注意62是工作站的内存大小)
MEM_total_G=$(top -n 1 -b| awk '$12=="python3" {sum+=$10}END{sum=sum*62*0.01;print sum}')
# 方法2,使用top,统计所有python进程RES、SHR的总和,然后相减
RES_total=$(top -n 1 -b| awk '$12=="python3" {sum+=$6}END{sum=sum/1048576;print sum}')
SHR_total=$(top -n 1 -b| awk '$12=="python3" {sum+=$7}END{sum=sum/1048576;print sum}')
Sub=$(awk 'BEGIN{A="'$RES_total'"-"'$SHR_total'";print A}')
echo "RES_total = ${RES_total} G;SHR_total=${SHR_total} G;RES - SHR = ${Sub}"
# 方法3,直接输出docker stats对docker的内存统计
docker stats docker_id --no-stream | tee -a ./record1.txt
# 方法4,直接看free -h中的used
total used free shared buff/cache available
经过12小时运行,结果:
方法1:MEM % 之和,上涨22G
方法2:RES - SHR ,上涨3G (非常不准确!!)
方法3:docker stats显示占用,上涨20G
方法4:free -h中的uesd的内存。上涨22G
结论1:RES - SHR ,非常不准确!!;其他的对内存泄漏的趋势记录都比较接近
然后又统计一下,全部进程结束,泄漏的内存释放后,memory的变化:
方法1:MEM % 之和,下降41G
方法2:RES - SHR ,下降19G (非常不准确!!)
方法3:docker stats显示占用,下降46.3G
方法4:free -h中的uesd的内存。下降46.7G
结论2:RES - SHR ,非常不准确!!;docker stats、free -h的记录比较接近。MEM %不准确,可能是因为其他相关的进程关闭,没有统计进来。
所以,最终结论是: