Menu Close
Settings Close

Language and Page Formatting Options

第 10 章 在 NFS 中使用缓存

除非明确指示,否则 NFS 将不会使用缓存。本段落介绍了如何使用 FS-Cache 配置 NFS 挂载。

先决条件

  • cachefilesd 软件包已安装并在运行。要确保它正在运行,请使用以下命令:

    # systemctl start cachefilesd
    # systemctl status cachefilesd

    状态必须 处于活动状态(正在运行)

  • 使用以下选项挂载 NFS 共享:

    # mount nfs-share:/ /mount/point -o fsc

    /mount/point 下文件的所有访问都将通过缓存,除非文件是为了直接 I/O 或写而打开。如需更多信息,请参阅 NFS 的缓存限制

NFS 使用 NFS 文件句柄 而不是 文件名来索引缓存内容,这意味着硬链接的文件可以正确共享缓存。

NFS 版本 3、4.0、4.1 和 4.2 支持缓存。但是,每个版本使用不同的分支进行缓存。

10.1. 配置 NFS 缓存共享

与 NFS 缓存共享相关的一些潜在问题。因为缓存是持久的,所以缓存中的数据块会根据由四个键组成的序列来索引的:

  • 第 1 级:服务器详情
  • 第 2 级:一些挂载选项;安全类型;FSID;uniquifier
  • 第 3 级:文件处理
  • 第 4 级:文件中的页号

为避免超级块之间一致性管理的问题,需要缓存数据的所有 NFS 超级块都有唯一的第 2 级键。通常,两个 NFS 挂载使用相同的源卷和选项共享超级块,因此共享缓存,即使它们在该卷中挂载不同的目录。

以下是如何通过不同选项配置缓存共享的示例。

流程

  1. 使用以下命令挂载 NFS 共享:

    mount home0:/disk0/fred /home/fred -o fsc
    mount home0:/disk0/jim /home/jim -o fsc

    这里,/home/fred/home/jim 可能会共享超级块,因为它们具有相同的选项,尤其是如果它们来自 NFS 服务器(home0)上的相同的卷/分区。

  2. 要不共享超级块,请使用 mount 命令和以下选项:

    mount home0:/disk0/fred /home/fred -o fsc,rsize=8192
    mount home0:/disk0/jim /home/jim -o fsc,rsize=65536

    在这种情况下,/home/fred/home/jim 将不会共享超级块,因为它们具有不同的网络访问参数,这些参数是第 2 级键的一部分。

  3. 要在不共享超级块的情况下缓存两个子树(/home/fred1/home/fred2)的内容 两次,请使用以下命令:

    mount home0:/disk0/fred /home/fred1 -o fsc,rsize=8192
    mount home0:/disk0/fred /home/fred2 -o fsc,rsize=65536
  4. 避免超级块共享的另一种方法是使用 nosharecache 参数显式阻止它。使用相同的示例:

    mount home0:/disk0/fred /home/fred -o nosharecache,fsc
    mount home0:/disk0/jim /home/jim -o nosharecache,fsc

    但是,在这种情况下,只允许其中一个超级块使用缓存,因为无法区分 home0:/disk0/fredhome0:/disk0/jim 的第 2 级键。

  5. 要指定对超级块的寻址,请在至少在一个挂载上添加一个 唯一标识符,例如 fsc=唯一标识符

    mount home0:/disk0/fred /home/fred -o nosharecache,fsc
    mount home0:/disk0/jim /home/jim -o nosharecache,fsc=jim

    这里,唯一标识符 jim 被添加到 /home/jim 缓存中所使用的第 2 级键中。

重要

用户不能在具有不同通信或协议参数的超级块之间共享缓存。例如,在 NFSv4.0 和 NFSv3 之间或在 NFSv4.1 和 NFSv4.2 之间无法共享,因为它们会强制使用不同的超级块。另外,设置读取大小(rsize)等参数可防止缓存共享,因为它也强制使用不同的超级块。