一、问题描述
我司平台研发的devops平台底层采用k8s实现,k8s自带cadvisor进行集群指标收集,根据官网,我们选用了container_memory_working_set_bytes(容器的工作集使用量)作为内存使用量的观察项,但随着后续使用过程中发现该指标上升到一定大小后就会维持不变,并不像应用实际内存使用量,没出现波动;
来自kubernetes对该问题的讨论(讨论了5年多了):https://github.com/kubernetes/kubernetes/issues/43916
二、原因分析
⚠️以下是建立在关闭swap交换分区的前提下分析
经过一系列分析发现使用container_memory_working_set_bytes不合理,应该使用container_memory_rss来表示应用实际内存使用量;
我最开始受cadvisor git问题栏中描述的影响,里面描述说:k8s kill pod时是根据该指标使用情况来判断的,所以下意识认为该指标表示pod实际内存使用量;官网说的没有问题,container_memory_working_set_bytes指标就是k8s来控制pod是否被kill的依据参考,但不代表container_memory_working_set_bytes接近pod limit后就一定会被kill,这里涉及到下面要详细分析的pod内存分布情况;
- 获取pod内存记录信息
在cadvisor中,采集应用内存信息具体实现实际是获取docker cgroup中memory.stat中的内容,下面是通过cat /sys/fs/cgroup/memory/memory.stat获取到的pod内存数据:
K8s环境下内存指标分析:container_memory_working_set_bytes与container_memory_rss

最低0.47元/天 解锁文章
2410

被折叠的 条评论
为什么被折叠?



