![指示 Linux 在交换文件中缓存文件](https://linux22.com/image/559519/%E6%8C%87%E7%A4%BA%20Linux%20%E5%9C%A8%E4%BA%A4%E6%8D%A2%E6%96%87%E4%BB%B6%E4%B8%AD%E7%BC%93%E5%AD%98%E6%96%87%E4%BB%B6.png)
背景:Linux VFS 缓存会将从磁盘读取的每个文件缓存在内存中。这种情况会一直持续,直到 RAM 已满,此时最旧的文件将从缓存中被踢出。
我正在运行带有网络附加存储的 XenServer。我的服务器的根文件系统位于网络附加存储上。每个 XenServer 主机中还有一个本地磁盘。我的服务器的交换分区位于此本地存储上。在我的特定情况下,网络附加存储已加载,磁盘 io 可能非常慢。我设置了这样的设置,因为本地磁盘未使用 RAID 或以任何方式受保护。我的系统可以容忍本地磁盘故障,因为我只会丢失交换分区。
我想知道是否有人知道如何指示 Linux 用缓存文件填充交换分区(除了 RAM)?对于使用所有本地磁盘的物理服务器,这不会带来速度优势,但对于我的服务器来说,这很有意义。
答案1
您所尝试做的事情的问题在于,VFS 缓存完全由内核控制,而您的问题空间非常小众 —— 一般而言,将缓存放入交换区完全违背了缓存的目的(尽管我同意您的用例是有效的)。我的观点很简单,内核目前不太可能支持您想要做的事情(而且我当然从未听到过任何关于您想要做的事情是否可行的传言)。
如果您运行的是更“伪”的虚拟化技术,例如 qemu,您将能够“过度使用”虚拟机使用的内存。这样,虚拟机使用的内存对于主机来说将更像“常规”进程内存,然后您可以使用主机的交换空间在不需要时将其分页。如果虚拟机中的进程实际上需要所有内存,或者虚拟机中的缓存压力很大,则这可能会导致机器死机,但经过一些仔细的调整后,它可以正常工作。
在用户空间中管理此类事情的任何尝试都不太可能奏效,因为 VFS 缓存都是内核级别的,并且(再次)在用户空间中管理它的用例非常小众。如果您尝试缓存的是应用程序数据,则可以为数据提供用户空间缓存(如果您需要以文件系统的方式缓存,则可以使用 FUSE,但特定于应用程序的数据存储会更好),但这既需要大量工作(缓存并不容易做到正确),又在您需要缓存的是根文件系统时不起作用。
如果您确实认为这值得,我认为您将花费大量时间编写和调试自己的内核级代码来支持此用例。与其将问题概括为“将缓存存储在交换中”(这会立即引起很多人的警惕),更简单的可能是某种使用交换空间而不是 VFS 内存缓存的“SAN 设备缓存”机制。请注意,我说的是“更简单”,而不是“容易”——这仍然需要大量工作。
在考虑修改内核之前,我愿意花很多精力(和金钱)来提高 NAS/SAN 的性能——因为坦白地说,它比缓存更划算。使用缓存,您的初始访问是总是会和底层访问机制一样慢,如果你能让它更快,它可能会比初始访问缓慢但重复访问快速(不频繁)更能提高感知性能。另外考虑一下为所有虚拟机提供大量 RAM 的成本——你可以用一两个月的内核黑客成本购买大量 RAM。