4.11. 启用 NFS 内容的客户端缓存
FS-Cache 是客户端上的持久本地缓存,文件系统可以使用它通过网络检索数据并将其缓存在本地磁盘上。这有助于最小化网络流量。
4.11.1. NFS 缓存如何工作
下图显示了 FS-Cache 的工作原理:
FS-Cache 旨在对系统的用户和管理员尽可能透明。FS-Cache 允许服务器上的文件系统直接与客户端的本地缓存交互,而无需创建过度挂载的文件系统。使用 NFS 时,挂载选项指示客户端挂载启用了 FS-cache 的 NFS 共享。挂载点将导致两个内核模块的自动上传:fscache
和 cachefile
。cachefilesd
守护进程与内核模块进行通信来实施缓存。
FS-Cache 不会改变通过网络工作的文件系统的基本操作。它只是为文件系统提供一个永久位置,以便可以缓存数据。例如,客户端仍然可以挂载 NFS 共享,无论是否启用了 FS-Cache。此外,缓存的 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
文件 -
/usr/share/doc/kernel-doc-<kernel_version>/Documentation/filesystems/caching/fscache.txt
由kernel-doc
软件包提供
4.11.3. 共享 NFS 缓存
因为缓存是持久的,所以缓存中的数据块会根据由四个键组成的序列来索引的:
- 第 1 级:服务器详情
- 第 2 级:有些挂载选项;安全类型;FSID;uniquifier 字符串
- 第 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
服务的工作原理为:缓存来自共享文件系统的远程数据,以释放本地磁盘上的空间。这可能会消耗所有可用空间,如果磁盘还包含根分区,这可能会导致问题。为控制这一点,cachefiled 会尝试通过丢弃不集中访问的对象(如从缓存中访问)来维护一定数量的可用空间。这个行为被称为 cache culling。
缓存筛选是根据底层文件系统中可用块的百分比以及可用文件的百分比来实现的。/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 wagon
bstop
<bcull
<brun
< 100 -
0 wagon
fstop
<fcull
<frun
< 100
这些是可用空间和可用文件的百分比,不会显示为 100 减去 df
程序所显示的百分比。
筛选同时依赖于 bxxx 和 fxxx 对;用户不能单独处理它们。