目录标题
- 🧠 一、分析内存占用的几个核心指标
- 🛠️ 二、使用 `smem` 查看每个进程内存详情
- 📦 安装(适用于所有 Linux)
- 📊 查看内存详情
- 示例输出字段说明:
- 📐 三、手动查看某进程的 Page Cache 占用
- 示例:
- 🐳 四、Kubernetes 容器层面分析:用 cgroup memory.stat
- 1️⃣ 找到容器对应的 cgroup 路径:
- 2️⃣ 查看 `memory.stat`
- 重点字段说明:
- 📦 五、快速脚本:列出每个容器的 page cache 占用(crictl 版本)
- 🔄 六、推荐工具:`cgroups-metrics-exporter` 或 Prometheus
- ✅ 总结
在容器化的 Linux 系统中(如 Kubernetes Node 上)看到内存占用高但 free
显示还有很多 buff/cache
,想进一步精细化分析 哪些进程或容器占用了多少 Page Cache,可以使用如下方法:
🧠 一、分析内存占用的几个核心指标
指标 | 含义 |
---|---|
RSS | Resident Set Size,进程实际占用物理内存(不含 cache) |
PSS | Proportional Set Size,按共享页比例分摊后的物理内存 |
USS | Unique Set Size,仅该进程独占的内存 |
Page Cache | 文件映射缓存,可能会被共享,用于缓存磁盘文件 |
🛠️ 二、使用 smem
查看每个进程内存详情
📦 安装(适用于所有 Linux)
sudo apt install smem # Debian/Ubuntu
sudo yum install smem # CentOS/RHEL
📊 查看内存详情
smem -r -k -t -P "" # 显示所有进程,包含 PSS 和缓存使用
示例输出字段说明:
PID User Command USS PSS RSS Swap
1234 root java 100MB 500MB 800MB 0KB
- PSS 比 RSS 更真实地反映进程实际内存压力
- 若进程缓存占比很高,可以说明 page cache 占用明显
📐 三、手动查看某进程的 Page Cache 占用
grep -i '^file' /proc/<pid>/smaps_rollup
示例:
grep -i '^file' /proc/1234/smaps_rollup
输出类似:
FilePss: 32184 kB
FileRss: 32600 kB
说明该进程当前 page cache 占用了约 32MB。
🐳 四、Kubernetes 容器层面分析:用 cgroup memory.stat
容器的 memory usage 统计在 cgroup 下的 /sys/fs/cgroup
路径中:
1️⃣ 找到容器对应的 cgroup 路径:
docker inspect <container_id> | grep -i cgroup
或者 Kubernetes:
crictl inspect <container_id> | grep cgroup
常见路径:
/sys/fs/cgroup/memory/kubepods.slice/kubepods-besteffort-podXXXXXX.slice/docker-<id>.scope/memory.stat
2️⃣ 查看 memory.stat
cat /sys/fs/cgroup/memory/.../memory.stat
重点字段说明:
字段 | 含义 |
---|---|
cache | page cache 使用量(KB) |
rss | 匿名内存(程序运行的真实内存) |
mapped_file | 映射的文件大小 |
pgfault/pgmajfault | 缺页异常次数 |
inactive_file , active_file | 具体 cache 使用情况 |
示例:
cache 26214400 # 约 25MB 被该容器用于缓存
rss 524288000 # 匿名内存约 500MB
📦 五、快速脚本:列出每个容器的 page cache 占用(crictl 版本)
#!/bin/bash
echo -e "ContainerID\t\tCache(KB)\tRSS(KB)"
for cid in $(crictl ps -q); do
cgroup_path=$(find /sys/fs/cgroup -name "*$cid*" 2>/dev/null | grep memory | head -n1)
if [[ -f "$cgroup_path/memory.stat" ]]; then
cache=$(grep '^cache ' $cgroup_path/memory.stat | awk '{print $2}')
rss=$(grep '^rss ' $cgroup_path/memory.stat | awk '{print $2}')
echo -e "$cid\t$cache\t\t$rss"
fi
done
🔄 六、推荐工具:cgroups-metrics-exporter
或 Prometheus
如果你想持续监控,可以使用:
cadvisor
(自动暴露容器级 memory.cache)cgroups-metrics-exporter
(专门导出 memory.stat 指标)- Prometheus +
node_exporter
(开启textfile_collector
自定义指标)
✅ 总结
方法 | 优点 | 场景 |
---|---|---|
smem + smaps_rollup | 精细分析进程级 cache | 排查单个进程内存高问题 |
memory.stat | 精确看容器级 page cache | Kubernetes 排查容器内存 |
Prometheus exporter | 自动化、长期监控 | 大规模集群、持续告警 |
drop_caches | 释放 page cache | 临时紧急处理,不建议频繁 |