内存碎片化五
如何具体查看 buff/cache 详情?
buff/cache 主要由 buffer(缓冲区) 和 cache(页面缓存) 组成,要深入分析它们的占用情况,可以使用以下方法:
1. 直接查看 buff/cache 总占用
free -m
示例输出:
total used free shared buff/cache available
Mem: 128000 125000 1000 2000 5000 3000
Swap: 8192 5000 3192
-
buff/cache= buffer + page cache -
这个值较高时,不代表内存不足,因为它是 可回收的。
2. 通过 /proc/meminfo 详细查看
cat /proc/meminfo | grep -E "Buffers|Cached|SReclaimable|Shmem"
示例输出:
Buffers: 500000 kB # 块设备 I/O 缓冲
Cached: 4500000 kB # 文件系统缓存
SReclaimable: 500000 kB # 可回收 Slab
Shmem: 200000 kB # 共享内存(tmpfs 等)
| 参数 | 说明 |
|---|---|
| Buffers | 块设备的 I/O 缓冲(如磁盘操作) |
| Cached | 文件系统缓存(可回收) |
| SReclaimable | 可回收 Slab 缓存(可作为可用内存) |
| Shmem | 共享内存(不可回收) |
📌 计算 buff/cache 实际占用:
buff/cache = Buffers + Cached + SReclaimable
如果 SReclaimable 过高,说明 Slab 占用了较多内存,可以回收。
3. 通过 vmstat 观察变化
vmstat -s | grep -E "buffer|cache"
示例输出:
500000 K allocated to buffer
4500000 K allocated to cache
这两个值对应 /proc/meminfo 的 Buffers 和 Cached,可以监控随时间的变化。
4. 通过 top 或 htop 监控
top
按 Shift + M 按照 内存使用排序,查看哪些进程占用了大量缓存。
5. 释放 buff/cache(谨慎操作)
如果 buff/cache 过高,影响了可用内存(available 低),可以手动释放:
sync; echo 3 > /proc/sys/vm/drop_caches
解释:
-
echo 1→ 释放页缓存 -
echo 2→ 释放 dentry 和 inode 缓存 -
echo 3→ 释放所有缓存
⚠ 注意:这会影响系统性能,一般不推荐手动清理,除非 available 非常低。
6. slabtop 查看 Slab 缓存
slabtop
示例输出:
Active / Total Objects (% used) : 46450478 / 52429181 (88.6%)
Active / Total Slabs (% used) : 1448140 / 1448140 (100.0%)
Active / Total Caches (% used) : 85 / 116 (73.3%)
Active / Total Size (% used) : 9415977.82K / 10397845.84K (90.6%)
如果 Slab 过高,说明 内核分配的缓存太多,可能需要优化。
结论
| 指标 | 检查方法 | 说明 |
|---|---|---|
buff/cache 总大小 |
free -m |
主要用于 I/O 加速,可回收 |
| buffer & cache 细节 | cat /proc/meminfo |
进一步拆解 buff/cache 组成 |
| 变化趋势 | vmstat -s |
监控 buffer 和 cache 变化 |
| 占用进程 | top / htop |
观察哪些进程占用大量缓存 |
| Slab 缓存 | slabtop |
监控 Slab 分配是否异常 |
| 清理缓存(谨慎) | sync; echo 3 > /proc/sys/vm/drop_caches |
释放 buff/cache |
📌 建议:
-
buff/cache高不是问题,除非available低。 -
先观察
/proc/meminfo,再判断是否需要优化。 -
不要频繁手动释放缓存,这会降低系统性能。
要查看 Buffer(缓冲区) 和 Cache(页面缓存) 的具体内容,可以使用以下工具:
1. vmtouch(查看和操作文件缓存) 🔍
vmtouch 可以检查哪些文件或目录被缓存在内存中。
安装 vmtouch
# CentOS / RHEL
yum install vmtouch -y
# Ubuntu / Debian
apt install vmtouch -y
使用示例
vmtouch -v /path/to/directory
📌 输出示例:
Files: 100
Directories: 10
Resident Pages: 10000/20000 (50%) # 50% 的页面已缓存
Elapsed: 0.002 sec
✅ 功能:
-
查看某个目录或文件 在 page cache 中的占用情况。
-
强制加载文件到缓存:
vmtouch -t /path/to/file -
强制清除文件缓存:
vmtouch -e /path/to/file
2. fincore(查看文件缓存命中率) 📊
fincore 统计文件在 page cache 中的占用情况。
安装 fincore
# Ubuntu/Debian
apt install fincore -y
# CentOS/RHEL 需要从 EPEL 安装
yum install epel-release -y
yum install fincore -y
使用示例
fincore /var/log/syslog
📌 输出示例:
FILE PAGES RESIDENT SHARED CLEAN
/var/log/syslog 1000 800 0 800
✅ 功能:
-
PAGES:文件总共占用的内存页数。 -
RESIDENT:实际驻留在page cache中的页数。 -
SHARED/CLEAN:共享和未修改的页。
3. cachetop(实时监控缓存命中) 📡
cachetop 可以实时监控哪些进程大量使用缓存。
安装 cachetop
pip install cachetop
使用示例
cachetop
📌 输出示例:
PID UID HIT/MISS READ(MB) WRITE(MB) COMMAND
1234 root 90%/10% 50MB 5MB nginx
5678 user 80%/20% 30MB 3MB apache
✅ 功能:
-
显示 缓存命中率(HIT/MISS),高命中率表示文件主要来自缓存。
-
监控 哪些进程使用了最多的缓存。
4. slabtop(查看 Slab 缓存) 🔧
slabtop 用于查看 Slab 缓存(Slab Allocator 负责的内存分配)。
使用示例
slabtop
📌 输出示例:
Active / Total Objects (% used) : 46450478 / 52429181 (88.6%)
Active / Total Slabs (% used) : 1448140 / 1448140 (100.0%)
Active / Total Caches (% used) : 85 / 116 (73.3%)
Active / Total Size (% used) : 9415977.82K / 10397845.84K (90.6%)
✅ 功能:
-
监控 Slab 缓存是否过度占用内存。
-
找到可能导致内存泄漏的
kmalloc、dentry等对象。
5. getconf PAGE_SIZE(查看内存页大小) 📏
getconf PAGE_SIZE
📌 输出示例:
4096
✅ 功能:
-
显示 每个内存页的大小(通常是 4KB)。
-
结合
fincore可以计算 缓存占用的总大小。
6. debugfs(查看缓存的具体内容) 🧐
debugfs /dev/sda
然后执行:
stat /path/to/file
✅ 功能:
-
直接查看某个文件的 inode 信息,包括缓存状态。
7. drop_caches(清理缓存) ⚠ (谨慎使用)
sync; echo 3 > /proc/sys/vm/drop_caches
✅ 功能:
-
清除所有 Buffers 和 Cache,但不会影响正在运行的进程。
总结
| 工具 | 作用 |
|---|---|
| vmtouch | 查看哪些文件在缓存中,手动加载/清除缓存 |
| fincore | 查看文件的缓存占用情况 |
| cachetop | 监控进程的缓存命中率 |
| slabtop | 监控 Slab 缓存 |
| debugfs | 查看具体文件的缓存信息 |
| drop_caches | 手动释放缓存(谨慎使用) |
📌 推荐方案:
-
想看哪些文件在缓存中? →
vmtouch -
想查具体文件缓存大小? →
fincore -
想实时监控缓存命中率? →
cachetop -
想优化 Slab 缓存? →
slabtop
如果你的 available 低,而 buff/cache 高,可以考虑清理缓存,否则 不需要手动干预。
浙公网安备 33010602011771号