Linux查看Buffer&Cache被哪些进程占用

Buffer和Cache

  • Buffer 是缓冲区,而 Cache 是缓存,两者都是数据在内存中的临时存储。
  • Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们既会用在读请求中,也会用在写请求中。
  • 磁盘是一个块设备,可以划分为不同的分区;在分区之上再创建文件系统,挂载到某个目录,之后才可以在这个目录中读写文件。
  • Linux 中“一切皆文件”,平时提到的“文件”是普通文件,磁盘是块设备文件。
  • 在读写普通文件时,会经过文件系统,由文件系统负责与磁盘交互;而读写磁盘或者分区时,就会跳过文件系统,也就是所谓的“裸I/O“。这两种读写方式所使用的缓存是不同的,也就是文中所讲的 Cache 和 Buffer 区别。
  • Buffers 是内核缓冲区用到的内存,对应的是 /proc/meminfo 中的 Buffers 值。
  • Cache 是内核页缓存和 Slab 用到的内存,对应的是 /proc/meminfo 中的 Cached 与 SReclaimable 之和。
  • 从写的角度来说,不仅可以优化磁盘和文件的写入,对应用程序也有好处,应用程序可以在数据真正落盘前,就返回去做其他工作。
  • 从读的角度来说,既可以加速读取那些需要频繁访问的数据,也降低了频繁 I/O 对磁盘的压力。

如何查看Buffer&Cache使用率高的进程有哪些

推荐一个工具hcache

wget https://silenceshell-1255345740.cos.ap-shanghai.myqcloud.com/hcache
chmod 755 hcache && mv hcache /usr/local/bin/

hcache常用命令

  • 全局显示10个最大的被缓存文件
hcache --top10
mark
  • 查看指定进程所使用的缓存使用情况
mark
  • 定位到被缓存的最大文件后,然后可以使用lsof得到当前文件的一些进程信息了
mark

手动回收Buffer&Cache

  • 清除pagecache: echo 1 > /proc/sys/vm/drop_caches
  • 清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache: echo 2 > /proc/sys/vm/drop_caches
  • 清除pagecache和slab分配器中的缓存对象: echo 3 > /proc/sys/vm/drop_caches: