名称 | 类型 | 单位 | 说明 |
---|---|---|---|
container_memory_rss | gauge | 字节数bytes | RSS内存,即常驻内存集(Resident Set Size),是分配给进程使用实际物理内存,而不是磁盘上缓存的虚拟内存。RSS内存包括所有分配的栈内存和堆内存,以及加载到物理内存中的共享库占用的内存空间,但不包括进入交换分区的内存。 |
container_memory_usage_bytes | gauge | 字节数bytes | 当前使用的内存量,包括所有使用的内存,不管有没有被访问。 |
container_memory_max_usage_bytes | gauge | 字节数bytes | 最大内存使用量的记录。 |
container_memory_cache | gauge | 字节数bytes | 高速缓存(cache)的使用量。cache是位于CPU与主内存间的一种容量较小但速度很高的存储器,是为了提高cpu和内存之间的数据交换速度而设计的。 |
container_memory_swap | gauge | 字节数bytes | 虚拟内存使用量。虚拟内存(swap)指的是用磁盘来模拟内存使用。当物理内存快要使用完或者达到一定比例,就可以把部分不用的内存数据交换到硬盘保存,需要使用时再调入物理内存 |
container_memory_working_set_bytes | gauge | 字节数bytes | 当前内存工作集(working set)使用量。 |
container_memory_failcnt | counter | 次 | 申请内存失败次数计数 |
container_memory_failures_total | counter | 次 | 累计的内存申请错误次数 |
一般来说:
container_memory_max_usage_bytes > container_memory_usage_bytes >= container_memory_working_set_bytes > container_memory_rss
如果说开发想看自己应用实际内存占用,那就可以用rss,表达式如下:
sum by(container_name) (container_memory_rss{pod_name="$pod", container_name=~"$container", container_name!="POD"})
有时候在容器中可能会出现 WSS过高的情况,如下图所示:
container_memory_working_set_bytes 指标的组成实际上是 RSS + Cache。而 Cache 高的情况,常见于进程有大量文件 IO,占用 Cache 可能就会比较高。
可以通过回收 页缓存(page cache) 来临时解决:
echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。
echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
echo 3 > /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的缓存对象。