You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Oracle Linux 7 如何排查占用大量buff/cache内存的进程

Oracle Linux 7 如何排查占用大量buff/cache内存的进程

别担心,我来帮你一步步梳理排查这个问题——buff/cache占用过高看起来棘手,但其实只要找对工具和方法,就能精准定位到背后的关联进程。

先搞懂buff/cache的本质

首先得明确:buff/cache是Linux系统为了提升IO性能自动分配的缓存——buffer负责磁盘块的读写缓存,cache负责文件内容的缓存。系统会在内存充足时自动利用空闲内存做缓存,内存紧张时又会自动回收,正常情况下不用过度担心,但如果要找出具体是哪些进程导致缓存占用过高,我们可以用以下几种方法。

方法1:通过/proc文件系统直接关联进程与缓存

这是最直接的原生方法,不需要额外安装工具,利用Linux自带的/proc文件系统就能实现:

每个进程的/proc/<pid>/smaps文件里,记录了该进程所有内存映射的详细信息,其中Cached字段就是该进程对应的文件缓存大小(单位为KB)。

操作步骤:

  1. 先确定你怀疑的进程PID(比如你提供的mongod进程PID是1485)
  2. 查看该进程的缓存总和:
# 替换为目标进程的PID
PID=1485
echo "进程PID $PID 的文件缓存总大小:"
grep -E 'Cached:' /proc/$PID/smaps | awk '{sum += $2} END {print sum/1024 " MB"}'
  1. 如果要批量统计所有进程的缓存占用,还可以用这个脚本(按缓存大小从大到小排序):
for PID in /proc/[0-9]*; do
  PID_NUM=$(basename $PID)
  PROC_NAME=$(ps -p $PID_NUM -o comm= 2>/dev/null)
  if [ -n "$PROC_NAME" ]; then
    CACHED=$(grep -E 'Cached:' $PID/smaps 2>/dev/null | awk '{sum += $2} END {print sum/1024}')
    echo "PID $PID_NUM | 进程名 $PROC_NAME | 缓存大小 ${CACHED:-0} MB"
  fi
done | sort -k4 -n -r

方法2:用fincore工具定位缓存的文件与进程

fincore是专门用来分析文件系统缓存的工具,能直接告诉你哪些文件被缓存到内存中,以及对应的关联进程。

操作步骤:

  1. 先安装fincore(Oracle Linux 7需要先启用EPEL源):
sudo yum install -y oracle-epel-release-el7
sudo yum install -y fincore
  1. 查看系统中被缓存的文件(按缓存大小排序):
# 遍历所有进程打开的文件,只显示被缓存的部分
fincore --summarize --only-cached /proc/*/fd/* | sort -k4 -n -r

输出里的路径/proc/<pid>/fd/<fd>可以直接提取出PID,对应到具体进程。
3. 针对特定目录(比如mongod的数据目录)精准排查:

fincore --summarize --only-cached /var/lib/mongo/*

这样就能快速确认是不是数据库文件被大量缓存了。

方法3:结合你已经在用的smem做深化分析

你已经用了smem来统计进程内存,其实它还能帮我们结合缓存做更全面的分析:

  1. 查看系统内存与缓存的整体分布:
smem -t -k -w

这个命令会输出系统级的内存统计,清晰展示swap、cache、buffer的整体占用情况。
2. 配合lsof关联进程与大文件:

# 先找出mongod打开的大文件
lsof -p 1485 | grep -E 'REG' | sort -k7 -n -r
# 再用fincore查看这些文件的缓存状态
fincore --summarize --only-cached /path/to/mongod/data/file

辅助排查:确认缓存增长的触发原因

除了找进程,还可以用以下命令判断缓存增长的背景:

  • vmstat 1:观察bi/bo(块设备读写)列,如果bi数值很高,说明有大量磁盘读操作,系统会自动把读入的内容缓存起来。
  • iostat -x 1:查看磁盘IO的详细统计,比如%util(磁盘利用率)和rMB/s(读速度),如果读操作频繁,缓存自然会持续增长。

针对你的案例的小建议

从你提供的server2数据来看,buff/cache占了47G,而mongod是内存占用最大的进程,很大概率是mongod读取了大量数据文件,系统为了提升后续读写性能,把这些文件内容缓存到了内存中。你可以先用方法1的命令查询mongod进程的缓存总和,应该能找到对应的数据。

另外关于监控的问题,建议把监控指标从used改成availablefree -mh里的available列),这个值已经考虑了可回收的buff/cache,能更准确反映系统实际可用内存,避免再出现误判。

备注:内容来源于stack exchange,提问作者yabberth

火山引擎 最新活动