容器监控的内存使用率与实际弹性伸缩现象不一致
问题现象
容器监控的内存使用率与实际弹性伸缩现象不一致,例如容器内存使用率在界面上显示为40%左右,而HPA设置缩容阈值为70%,但界面上显示的内存使用率低于HPA阈值后并没有发生缩容。
问题根因
界面上显示的容器内存使用率与HPA弹性伸缩的内存使用率在计算方式上存在差异:
- 界面上显示的容器内存使用率计算方式为:container_memory_rss/内存Limit
container_memory_rss(即Resident Set Size,RSS)包含了部分可能并不活跃或未被有效利用的内存部分。
- HPA对于内存使用率弹性伸缩的计算方式为:container_memory_working_set_bytes/内存Request
container_memory_working_set_bytes(即Working Set Size,WSS)的计算方式如下:
在Pod中执行cat /sys/fs/cgroup/memory/memory.stat,得到total_cache(缓存内存量)、total_rss(当前应用进程实际使用内存量)、total_inactive_file(不活跃文件内存使用量)。
WSS = total_cache + total_rss - total_inactive_file
如果您的应用存在以下情况,均可能导致HPA的扩容行为与预期不符,出现界面上显示的内存使用率低于HPA缩容阈值后并没有发生缩容,或者界面上显示的内存使用率未高于HPA扩容阈值但发生扩容等现象。
- 应用缓存占用非常高,WSS明显大于RSS,导致界面上显示的容器内存使用率小于HPA计算的内存使用率。
- Limit与Request配置差异较大时,Request明显小于Limit,导致界面上显示的容器内存使用率小于HPA计算的内存使用率。