4.11. 启用 NFS 内容的客户端缓存
FS-Cache 是客户端上的一个持久本地缓存,文件系统可以使用它通过网络检索数据,并将其在本地磁盘上缓存。这有助于最小化网络流量。
4.11.1. NFS 缓存如何工作
下图显示了 FS-Cache 的工作原理:
FS-Cache 旨在对系统的用户和管理员尽可能透明。FS-Cache 允许服务器上的文件系统直接与客户端的本地缓存交互,而无需创建一个过度挂载的文件系统。使用 NFS 时,挂载选项指示客户端挂载启用了 FS-cache 的 NFS 共享。挂载点将导致两个内核模块的自动上传:fscache
和 cachefile
。cachefilesd
守护进程与内核模块进行通信来实施缓存。
FS-Cache 不会改变通过网络工作的文件系统的基本操作。它只是为文件系统提供一个永久位置,以便其可以缓存数据。例如,无论是否启用了 FS-Cache,客户端仍然可以挂载 NFS 共享。此外,缓存的 NFS 可以处理不能全部放入缓存的文件(无论是单独的还是总体的),因为文件可以部分缓存,且不必预先完全读取。FS-Cache 还会隐藏发生在客户端文件系统驱动程序的缓存中的所有 I/O 错误。
要提供缓存服务,FS-Cache 需要一个缓存后端,cachefiles
服务。FS-Cache 需要挂载的基于块的文件系统,该文件系统支持块映射(bmap
)和扩展属性作为其缓存后端:
- XFS
- ext3
- ext4
FS-Cache 无法任意缓存任何文件系统,无论是通过网络还是其他方式:必须更改共享的文件系统的驱动程序,以允许与 FS-Cache、数据存储或检索以及元数据设置和验证进行交互。FS-Cache 需要来自缓存文件系统的 索引密钥 和 一致性数据 来支持持久性:使用索引密钥匹配文件系统对象来缓存对象,使用一致性数据来确定缓存对象是否仍然有效。
使用 FS-Cache 是各种因素之间的一种折衷。如果 FS-Cache 被用来缓存 NFS 流量,则它可能使客户端减慢,但可以通过满足本地读请求而无需消耗网络带宽,来大大减少网络和服务器负载。
4.11.2. 安装和配置 cachefilesd 服务
Red Hat Enterprise Linux 只提供 cachefiles
缓存后端。cachefilesd
服务启动并管理 cachefiles
。/etc/cachefilesd.conf
文件控制 cachefile
如何提供缓存服务。
先决条件
-
挂载在
/var/cache/fscache/
目录下的文件系统是ext3
、ext4
或xfs
。 -
挂载在
/var/cache/fscache/
下的文件系统使用扩展属性,如果您在 RHEL 8 或更高版本上创建了文件系统,则这是默认设置。
流程
安装
cachefilesd
软件包:# dnf install cachefilesd
启用并启动
cachefilesd
服务:# systemctl enable --now cachefilesd
验证
使用
fsc
选项挂载 NFS 共享以使用缓存:要临时挂载一个共享,请输入:
# mount -o fsc server.example.com:/nfs/projects/ /mnt/
要永久挂载一个共享,请在
/etc/fstab
文件中的条目中添加fsc
选项:<nfs_server_ip_or_hostname>:/<exported_share> <mount point> nfs fsc 0 0
显示 FS-cache 统计信息:
# cat /proc/fs/fscache/stats
其它资源
-
/usr/share/doc/cachefilesd/README
文件 -
kernel-doc
软件包提供的/usr/share/doc/kernel-doc-<kernel_version>/Documentation/filesystems/caching/fscache.rst
4.11.3. 共享 NFS 缓存
因为缓存是持久的,所以缓存中的数据块会根据由四个键组成的序列来索引的:
- 第 1 级:服务器详情
- 第 2 级:有些挂载选项;安全类型;FSID;唯一标识符字符串
- 第 3 级:文件处理
- 第 4 级:文件中的页号
为避免超级块之间一致性管理问题,所有需要缓存数据的 NFS 超级块都有唯一的 2 级密钥。通常,具有同样的源卷和选项的两个 NFS 挂载共享一个超级块,因此共享缓存,即使它们在该卷中挂载了不同的目录。
例 4.1. NFS 缓存共享:
以下两个挂载可能共享超级块,因为它们具有相同的挂载选项,特别是因为它们来自 NFS 服务器上的同一个分区:
# mount -o fsc home0:/nfs/projects /projects # mount -o fsc home0:/nfs/home /home/
如果挂载选项不同,它们不共享超级块:
# mount -o fsc,rsize=8192 home0:/nfs/projects /projects # mount -o fsc,rsize=65536 home0:/nfs/home /home/
用户不能在具有不同通信或协议参数的超级块之间共享缓存。例如,无法在 NFSv4.0 和 NFSv3 之间或在 NFSv4.1 和 NFSv4.2 之间共享缓存,因为它们强制使用不同的超级块。另外,设置参数,如读大小(rsize
),可防止缓存共享,因为它强制使用不同的超级块。
4.11.4. NFS 缓存限制
NFS 有一些缓存限制:
- 为直接 I/O 打开共享文件系统的文件将自动绕过缓存。这是因为这种访问类型必须与服务器直接进行。
- 从共享文件系统打开一个文件直接 I/O 或写入清除文件缓存的副本。FS-Cache 不会再次缓存文件,直到它不再为直接 I/O 或写操作而打开。
- 另外,FS-Cache 的这个发行版本只缓存常规 NFS 文件。FS-Cache 不会缓存目录、符号链接、设备文件、FIFO 和套接字。
4.11.5. 缓存剔除是如何工作的
cachefilesd
服务的工作原理是将来自共享文件系统的远程数据缓存到本地磁盘上的空闲空间。这可能会消耗所有可用空间,如果磁盘还包含根分区,则这可能会导致问题。要对此进行控制,cachefilesd
尝试通过丢弃缓存中旧的对象(如最近较少访问的对象)来维护一定数量的空闲空间。此行为被称为缓存剔除。
缓存筛选是根据底层文件系统中可用块的百分比以及可用文件的百分比来实现的。/etc/cachefilesd.conf
中有控制六个限制的设置:
- brun N% (块百分比)、frun N% (文件百分比)
- 如果缓存中空闲空间的数量和可用文件的数量超过这两个限制,则关闭筛选。
- bcull N% (块百分比)、fcull N% (文件百分比)
- 如果缓存中可用空间的数量或文件的数量低于其中任何一个限制,则启动筛选。
- bstop N% (块百分比)、fstop N% (文件百分比)
- 如果缓存中可用空间的数量或可用文件的数量低于其中任何一个限制,则不允许进一步分配磁盘空间或文件,直到筛选再次引发超过这些限制的情况。
每个设置的 N
的默认值如下:
-
brun/frun
: 10% -
bcull/fcull
: 7% -
bstop/fstop
: 3%
在配置这些设置时,必须满足以下条件:
-
0 ≤
bstop
<bcull
<brun
< 100 -
0 ≤
fstop
<fcull
<frun
< 100
这些是可用空间和可用文件的百分比,不会显示为 100 减去 df
程序所显示的百分比。
筛选同时依赖于 bxxx 和 fxxx 对;用户不能单独处理它们。