docker stats取值变更

起因

监控出现在promeehtus中展现容器使用内存与docker stats展示的使用内存数据存在误差的现象

经过仔细对比发现部分机器上的docker stats使用内存与promeQL指标container_memory_usage_bytes符合,另外一部分机器上的docker stats使用内存与promeQL指标container_memory_rss符合

下面是内存指标的解释

名称 类型 单位 说明
container_memory_rss gauge 字节数 bytes RSS内存,即常驻内存集(Resident Set Size),是分配给进程使用实际物理内存,而不是磁盘上缓存的虚拟内存。RSS内存包括所有分配的栈内存和堆内存,以及加载到物理内存中的共享库占用的内存空间,但不包括进入交换分区的内存。
container_memory_usage_bytes gauge 字节数 bytes 当前使用的内存量,包括所有使用的内存,不管有没有被访问。
container_memory_cache gauge 字节数 bytes 高速缓存(cache)的使用量。cache是位于CPU与主内存间的一种容量较小但速度很高的存储器,是为了提高cpu和内存之间的数据交换速度而设计的

后面发现docker stats内存展现数据不同的机器上docker版本是不同的,贴近rss内存的机器是18.06-ce版本的而贴近usage内存的机器docker版本是1.13.1

既然docker版本存在这么大的区别,会不会可能是docker自己针对内存的计算方法发生了修改?果然经过对docker源码的查询让我发现了变化。

docker 2017年的一次MR

根据docker stats等关键词我在查到了docker相关的一个issue(https://github.com/moby/moby/issues/32253),这个问题的描述和我们情况很类似,继续向下面读发现一个MR的标志(https://github.com/docker/cli/pull/80/files)

1572505188882

果然docker在2017年的一次提交中修改了docker stats的内存计算方式

1572505624533

具体的变化如下

1
2
3
4
5
6
7
# 变更前
mem = float64(v.MemoryStats.Usage)
# 变更后
mem = calculateMemUsageUnixNoCache(v.MemoryStats)
func calculateMemUsageUnixNoCache(mem types.MemoryStats) float64 {
return float64(mem.Usage - mem.Stats["cache"])
}

为了跟进一步的了解docker stats的具体情况,我对1.13.1和18.06的docker代码进行了查询

1.13.X 版本

1.13.1版本对应github仓库叫做moby

找到对应的代码位置moby/cli/command/container/stats_helpers.go

果然还是用的usage作为当前容器内存使用量

1572506135909

https://github.com/moby/moby/blob/1.13.x/cli/command/container/stats_helpers.go#L116

18.06 版本

18.06的docker版本对应的仓库叫做docker-ce

代码位置为docker-ce/components/cli/cli/command/container/stats_helpers.go

使用内存计算的位置果然被calculateMemUsageUnixNoCache这个函数替换掉了

1572506343774
alculateMemUsageUnixNoCache函数内容具体如下

1
2
3
4
5
// calculateMemUsageUnixNoCache calculate memory usage of the container.
// Page cache is intentionally excluded to avoid misinterpretation of the output.
func calculateMemUsageUnixNoCache(mem types.MemoryStats) float64 {
return float64(mem.Usage - mem.Stats["cache"])
}

https://github.com/docker/docker-ce/blob/18.06/components/cli/cli/command/container/stats_helpers.go#L107

参考

https://blog.csdn.net/WaltonWang/article/details/53930070
https://github.com/moby/moby/issues/32253
https://github.com/docker/cli/pull/80/files
https://github.com/docker/docker-ce
https://github.com/moby/moby