内存碎片化五

如何具体查看 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/meminfoBuffersCached,可以监控随时间的变化。


4. 通过 tophtop 监控

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 监控 buffercache 变化
占用进程 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 缓存是否过度占用内存

  • 找到可能导致内存泄漏的 kmallocdentry 等对象。


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,可以考虑清理缓存,否则 不需要手动干预

posted on 2025-03-31 19:43  吃草的青蛙  阅读(166)  评论(0)    收藏  举报

导航