docker stats取值变更
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)
果然docker在2017年的一次提交中修改了docker stats的内存计算方式
具体的变化如下
1 | # 变更前 |
为了跟进一步的了解docker stats的具体情况,我对1.13.1和18.06的docker代码进行了查询
1.13.X 版本
1.13.1版本对应github仓库叫做moby
找到对应的代码位置moby/cli/command/container/stats_helpers.go
果然还是用的usage作为当前容器内存使用量
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这个函数替换掉了
alculateMemUsageUnixNoCache函数内容具体如下
1 | // calculateMemUsageUnixNoCache calculate memory usage of the container. |
参考
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