我想知道我是否可以看到哪个应用程序正在使用我的 RAM 缓冲区和缓存。此外,内核中是否指定了从缓存中删除数据的时间。我的 RAM 已被缓冲区和缓存完全占用,并且它也开始占用交换空间。
free -m 的输出:
$ free -m
total used free shared buffers cached
Mem: 14034 13878 156 0 10 11362
-/+ buffers/cache: 2505 11528
Swap: 8187 478 7709
答案1
不,它不会占用交换空间。它仅用作块缓存。在大多数缓存中,缓存不能进入交换空间,但此规则也存在一些例外。例如,在快速 SSD 上缓存慢速硬盘可能是一件好事。
但是,就您而言,情况要简单得多:Linux(以及任何其他操作系统)使用全部(或几乎所有)可用内存都用于缓存硬盘。而且,这不是问题,因为如果需要新的内存页,总是可以释放读取缓存页。并且尽可能多地使用块缓存,可以使平均文件操作速度更快。
事实上,如果你想知道真实的系统的可用内存,您应该计算“缓冲区”和“缓存”,就好像它们是空闲的一样。
您在“免费”标题上看到的实际上是(通常非常小的)内存大小,甚至不能(不能)用于缓存。这不是问题,如果您的系统很慢,那不是因为这个。
导致交换使用的原因:一些内存块,对于内核来说非常未使用的,可以完全交换出去。这些是不同守护进程的内存区域,它们只留在内存中,不做任何事情。交换出它们的内存不是问题,因为它们没有用于任何事情,但是使用现在空闲的 RAM 页面进行缓存可以使您的系统更快。
哪个进程使用缓存?实际上很难找到,几乎不可能。块缓存不是由进程填充的,而是由磁盘读取操作填充的。如果磁盘块当前在缓存中(这意味着,再次读取此块不需要等待硬盘),则意味着某人读取了此块,但未注册,这是哪个进程。如果您想知道这些数据,则需要在读取时观察磁盘读取使用情况!
有一个工具可以实现这一点,它的名字是blkmon
。它能够监视块设备的读取(和写入)操作,Google 是你的朋友(或者我们正在等待你的下一个问题,在这里或在 unix SE 上)。