容器智能运维平台提供内存诊断功能,可以覆盖Kubernetes集群上常见的内存问题,包括内存泄漏、内存碎片化、OOM等。诊断结果以图表的方式展示系统内存整体使用情况,将容器内的缓存和共享内存归属到具体的文件夹下,清晰展示系统内存使用情况,便于运维。本文介绍内存诊断的具体内容。
内存诊断包括内存总览、内存分析和OOM分析,用于浏览节点及Pod内存使用情况,可以帮您快速了解系统的内存状态。
根据集群配置,具体检查项可能稍有不同。实际结果请以诊断页面结果为准。
使用故障诊断功能时,系统将在您的集群节点上执行数据采集程序并收集检查结果。采集的信息包括系统版本,负载、Docker、Kubelet等运行状态及系统日志中关键错误信息。数据采集程序不会采集您的业务信息及敏感数据。
内存总览
内存总览主要对内存相关风险一键检查,快速识别系统是否存在内存问题。主要包括以下检查项。
检查项 | 说明 |
内存泄露 | 排查操作系统内核是否存在泄露,以及泄露的类型,支持slab、Vmalloc和伙伴系统(allocpage)三种泄露识别。 |
内存利用率 | 系统内存利用率。 |
Memcg残留 | 评估Memory cgroup是否存在残留,过多的残留会严重影响系统性能,以及造成统计数据异常。 |
内存碎片化 | 评估系统是否存在内存碎片化,内存碎片化会导致系统性能下降。 |
THP浪费率 | 评估透明大页浪费率。 |
内存总览以图表形式展示系统所有内存的使用情况,包括内核内存、用户态的应用内存和空闲内存。
内核内存(kernel):操作系统内核内存总使用量。
应用内存(app):用户态程序内存总使用量。
空闲内存(free):系统空闲内存。
相关概念
名词 | 解释 |
内存泄露 | 指程序动态分配的内存由于某种原因未释放,造成系统内存利用率升高,导致程序运行速度减慢甚至系统崩溃等严重后果。 |
内存利用率 | 内存利用率=(总内存-可用内存)x100/总内存,其中文件缓存属于可用内存,不影响内存利用率。 |
Memcg残留 | 当内存控制组(Memory cgroup)由于系统异常,没有正常释放时,Memcg残留会影响系统性能。 |
内存碎片化 | 内存碎片是指系统长时间远行后,由于空闲的连续内存区域太小,导致不能满足系统连续内存分配请求,从而出现内存分配延时,引起业务抖动。 |
THP浪费率 | THP(Transparent Huge Page)是指内核中2 MiB或1 GiB大小的大页面(普通的小页面大小为4 KiB)。 当系统开启透明大页时,内核会根据进程的实际情况动态分配透明大页,透明大页可以减少TLB(Translation Lookaside Buffer) Miss的出现概率,从而提升应用程序的性能。 THP带来性能提升的同时,产生了一定副作用,即可能产生Memory bloating(内存膨胀)问题。由于透明大页申请释放的粒度为2 MiB(即512个小页面),透明大页更容易产生内存浪费,进而导致内核分配的内存容量大于实际需要的内存容量。Memory bloating可能引发OOM(Out Of Memory)。例如,一个应用程序实际需要使用2个小页面,即8 KiB内存,但内核分配了1个透明大页。此时,除去应用程序实际需要的内存(2个小页面),透明大页剩下的内存(510个小页面)大小均为0。最终可能会因RSS(Resident Set Size)内存用量增加而导致OOM。 THP浪费率=THP零页数x100%/THP总页面数。 |
伙伴系统 | 伙伴系统是Linux内核用来管理物理内存页的一种算法,它管理起来的内存分为了不同的组,总共11组,每个组中的内存块大小都是一样的,都是2的幂次方个物理页,一个内存页一般是4 KB,所以大小一般是4 KB、8 KB、16 KB、32 KB……4 MB。 |
Slab | Linux操作系统的一种基于伙伴系统的小内存分配器。 |
Vmalloc | Linux操作系统的一种基于伙伴系统的非线性映射内存分配器。 |
filecache | Linux在读写文件时,用内存缓存磁盘文件的内容,程序访问文件时直接操作内存,从而加快程序对文件的读写。 |
匿名内存 | 在系统运行过程中动态分配(new、malloc、mmap)给进程的堆和栈所占的内存,没有实际的文件名与之相关联。 |
共享内存 | 共享内存允许两个或更多进程访问同一块内存,是进程通信方式之一。 |
tmpfs | Linux临时文件系统,是一种基于内存的文件系统,读写的文件内容只存在内存中。 |
hugetlb | 基于文件系统的大页内存。 |
内核内存
内核态内存重点关注Sunreclaim及伙伴系统的使用量,内存泄露通常都是指这两个指标异常。
指标 | 说明 |
Sreclaimable | Slab可回收内存。 |
Sunreclaim | Slab不可回收内存。 |
PageTables | 内核页表占用内存。 |
Vmalloc | 内核调用Vmalloc分配的内存。 |
KernelStack | 进程的内核堆栈总内存。 |
AllocPages | 内核调用alloc_pages等接口直接从伙伴系统分配的内存量,此类内存无法通过任何节点文件获取,使用过多会造成内存黑洞。 |
应用内存
用户态的应用内存重点关注匿名内存、共享内存及文件缓存内存。
指标 | 说明 |
filecache | 文件缓存内存,此类内存可以通过drop caches回收。 |
anon | 匿名内存,程序堆和栈内存,匿名内存占用过多,需要评估业务进程是否有内存泄露,系统是否开启了透明大页。 |
mlock | 系统锁住的内存量。 |
huge | hugetlb大页内存量。 |
buffer | 块设备以及文件系统元信息占用的内存量。 |
shmem | 共享内存(tmpfs)。业务进程退出后,经常会忘记删除tmpfs文件,或者在打开状态直接删掉tmpfs文件,都会操作shmem泄露。 |
内存分析
内存分析包括进程内存和Pod内存分析。
进程内存
以进程维度按内存大小排序,并分解成匿名内存、文件缓存和共享内存。
Pod内存
Pod内存分析功能够解析容器组和容器内部文件缓存和共享内存对应的文件,以及文件缓存活跃和非活跃的占比。
检查项 | 说明 |
Pod | Pod名称。 |
容器 | 容器名称。 |
文件名 | 文件名全路径。 |
缓存 | 文件占用的缓存(filecache)大小。 |
容器内缓存 | 文件占用缓存在容器内的大小(存在不同容器的进程操作相同文件)。 |
活跃缓存 | 文件缓存最近已被使用部分的大小。 |
非活跃缓存 | 文件缓存处于最近未被使用的大小。 |
OOM分析
对系统发生的OOM进行快速诊断,并输出诊断结论,主要包括以下内容。
检查项 | 说明 |
主机OOM次数 | 从开机到诊断时刻,主机OOM总次数。 |
剩余内存 | 系统剩余内存。 |
Low水线 | 系统配置的Low水线,剩余内存低于Low水线时,会触发内存异步回收。 |
容器 | Pod名字、容器ID或者cgroup名称。 |
limit | 容器设置的内存limit。 |
usage | 容器内存使用量。 |
OOM次数 | 容器发生OOM总次数。 |
OOM类型 | OOM的类型,目前包括Host(主机)和cgroup。 |