Linux查看哪些进程占用的系统 buffer/cache 较高 hcache、lsof命令

1、什么是buffer/cache ?

buffer/cache 其实是作为服务器系统的文件数据缓存使用的,尤其是针对进程对文件存在 read/write 操作的时候,所以当你的服务进程在对文件进行读写的时候,Linux内核为了提高服务的读写速度,则将会把文件放在此处的 buffer/cache 中进行缓存使用,由于 Linux服务的特点便是任何事物都会以文件的形式进行存在,所以你会发现不管你是否对文件做了大规模的读写,机器的 buffer/cache 是一直都存在的,并且持续的增高不下,这是因为服务器所产生的网络连接也好,用户协议的(UDP)套接字也好,这部分的数据系统都会为应用程序创建对应的文件描述符,而这些文件描述符的使用,则又都会重新进入 buffer/cache 中做读写使用,所以这也是你的机器始终都会存在较高 buffer/cache 的原因,(因为所有的文件读写都会用到 buffer/cache,在内存合理的情况下)

2、buffer/cache 需要注意的一些特点

在服务内存够用的情况下,Linux内核为了加快对文件的读写效率会将文件放入之buffer/cache 中 以保证读写效率,但其实,尽管当你的应用程序对文件的读写运行结束后,buffer/cache 也不会自动释放该部分内存,而是作为缓冲进行保留,等到你的服务进程在下一次进行相同文件的读写时就可以直接使用,省去了各种重新进行内存初始化的操作;所以这将会导致,当你的应用进程频繁对不同的文件进行读写时,你会发现服务所可以直接使用的free内存将会越来越少的一个重要原因;难道 buffer/cache 在这样无休止的缓存当中就不会自动释放?当然不是,当服务器在内存压力较大的情况下时,则将会自动进行内存的回收,作为free空间分给其它进程使用,这其中主要回收的一个内存则是 buffer/cache 的缓冲区内存块;

3、如何进行手动 buffer/cache 回收?

除了在系统进程内存使用较大压力的情况下进行内存的回收外,我们也可以进行手动的buffer/cache回收,但由于buffer/cache主要是用于文件的读写使用,所以进行文件回收时,一般常伴随系统的IO彪高,因为系统内核也对比cache中的数据与硬盘中的数据是否一致,如果不一致需要写会,然后才能进行内存的回收

将内存中数据强制先刷新到磁盘中
sync;

#清理Buffer缓存区域
echo 3 > /proc/sys/vm/drop_caches 表示清除pagecache和slab分配器中的缓存对象
echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。
echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
1、hcache的下载地址
wget https://silenceshell-1255345740.cos.ap-shanghai.myqcloud.com/hcache -O /usr/local/bin/hcache
chmod +x /usr/local/bin/hcache
2、hcache常用命令
hcache --top 10           # 全局显示10个最大的被缓存文件
lsof 缓存文件名           #查看当前所开启该文件的所有进程信息
lsof -p ID                 # 获取当前进程号所打开的所有文件信息
<think>我们被要求查看Linux系统中哪些进程占用了buff/cache。根据引用[2]和引用[4],我们可以使用一个名为`hcache`的工具来查看哪些进程占用buffer/cache。###步骤说明:1.**安装hcache工具**:首先需要下载并安装`hcache`工具。该工具是`pcstat`的一个增强版本,可以显示每个进程占用的缓存情况。2.**使用hcache查看占用缓存的进程**:安装后,我们可以通过运行`hcache`命令查看缓存占用情况。###具体操作:####1.下载并安装hcache根据引用[2],我们可以使用以下命令下载并安装:```bashwgethttps://silenceshell-1255345740.cos.ap-shanghai.myqcloud.com/hcachechmod755hcache&&mvhcache/usr/local/bin/```####2.使用hcache查看占用buff/cache进程安装完成后,可以使用以下命令查看缓存占用情况:```bashsudohcache--top10```这个命令会显示占用缓存最多的前10个进程(包括它们缓存的文件和大小)。**常用选项**:-`--sort-by`:按指定字段排序(如`size`、`pid`等)-`--topN`:显示前N个结果-`--bname`:只显示二进制文件的名字(而不显示完整路径)**示例命令**:```bash#按缓存大小降序排列,显示前20个进程sudohcache--sort-bysize--top20#查看指定进程(如nginx)的缓存占用sudohcache-p$(pgrepnginx)```###替代方案:使用`smem`工具如果没有`hcache`,也可以使用`smem`工具查看内存占用情况(包括USS/PSS/RSS):```bash#安装smemsudoaptinstallsmem#Debian/Ubuntusudoyuminstallsmem#CentOS/RHEL#按PSS排序显示进程内存smem-spss-r```###手动分析(不推荐)如果不想安装额外工具,可以通过以下步骤手动分析(但比较繁琐):1.使用`find`命令查找被缓存的文件:```bashsudofind/proc/*/fd-typel-lname'/*'-execls-l{}\;2>/dev/null```2.结合`lsof`命令查看哪些进程打开了这些文件:```bashlsof-p<pid>```>**注意**:手动分析过程复杂且不直观,强烈建议使用`hcache`工具[^2][^4]。---###缓存回收建议如果确定某些进程占用的缓存不再需要,可以尝试手动释放缓存(根据引用[1]和引用[3]):```bash#释放pagecacheecho1>/proc/sys/vm/drop_caches#释放slab分配器中的对象echo2>/proc/sys/vm/drop_caches#同时释放pagecache和slabecho3>/proc/sys/vm/drop_caches```**注意**:释放缓存是临时性的,新的文件操作会重新占用缓存。生产环境谨慎操作,可能影响性能[^1][^3]。§§相关问题§§1.如何防止Linux系统缓存(buff/cache)占用过高?2.除了`hcache`,还有哪些工具可以查看内存缓存占用?3.为什么Linux系统会使用buff/cache?它有什么作用?4.手动释放buff/cache系统性能有什么影响?</think>### 查看Linux占用buff/cache进程Linux系统中,buff/cache主要用于磁盘读写缓存和内存管理。要查看具体哪些进程占用了buff/cache,推荐以下方法: #### 1. 使用`hcache`工具(最推荐) ```bash # 安装hcache wget https://silenceshell-1255345740.cos.ap-shanghai.myqcloud.com/hcache chmod 755 hcache && sudo mv hcache /usr/local/bin/ # 查看占用buff/cache最多的前10个进程 sudo hcache --sort-by cache -t 10 ``` **输出示例**: ``` PID NAME SIZE CACHE 1234 java 1.2GB 850MB 5678 nginx 320MB 210MB 9012 mysql 500MB 180MB ... ``` **参数说明**: - `--sort-by cache`:按缓存占用排序 - `-t N`:显示前N个进程[^2] #### 2. 使用`smem`工具(无需安装) ```bash # 安装smem(Debian/Ubuntu) sudo apt install smem # 查看缓存占用 smem -s swap -r -k -c "pid user command swap uss pss rss cache" ``` **关键列**: - `cache`:进程占用的缓存大小 - `rss`:常驻内存集大小 - `pss`:按比例分配的内存大小[^4] #### 3. 使用`pcstat`工具(文件级分析) ```bash # 安装pcstat go get github.com/tobert/pcstat # 查看特定进程的缓存文件 pcstat -pid $(pgrep nginx) ``` #### 4. 手动分析(基础方法) ```bash # 1. 找到缓存占用大的内存页 grep -r ^ /proc/*/smaps 2>/dev/null | awk '/^\/proc/{match($0,"[0-9]+",a);pid=a[0]}/Size:/{size+=$2}/Shared_Clean:/{clean+=$2}END{print pid,size" kB",clean" kB"}' | sort -k3 -nr # 2. 根据PID查进程名 ps -p <PID> -o comm= ``` ### 缓存管理建议 如果发现特定进程占用过多缓存: ```bash # 释放缓存(生产环境慎用) echo 3 | sudo tee /proc/sys/vm/drop_caches ``` **注意**: 1. 缓存是Linux性能优化机制,无需频繁清理 2. 优先分析异常进程而非直接清缓存 3. 数据库服务(如MySQL)会主动使用缓存提升性能[^3][^4] --- ### 关键原理说明 - **buff**:块设备缓冲,用于磁盘读写加速 - **cache**:文件系统缓存,存储频繁访问的文件 - 两者都可通过`drop_caches`释放: ```bash echo 1 > /proc/sys/vm/drop_caches # 释放pagecache echo 2 > /proc/sys/vm/drop_caches # 释放slab缓存 echo 3 > /proc/sys/vm/drop_caches # 同时释放两者[^1][^3] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值