一、问题描述
我司平台研发的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中,采集应