docker中内存泄漏,不同内存record方法的准确度对比

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 %不准确,可能是因为其他相关的进程关闭,没有统计进来。

所以,最终结论是:

统计docker中的内存泄漏。用docker stats或统计全部进程的MEM %都是可以的,free -h也可以辅助记录内存变化的趋势。但是统计RES - SHR是不准确的,不建议使用这个指标!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值