Linux NFS 并发

本页介绍了如何针对 NetApp Volumes 调整 Linux NFS 客户端并发性。

并发是指客户端与卷之间一次可以未完成的 NFS 操作数量。调整并发有助于您使客户端与服务器限制保持一致,并避免因队列深度过大而导致性能下降。

在 Linux 上,并发由槽表条目 (NFSv3) 或 NFSv4.1 会话槽控制,而不是由装载选项控制。请在装载之前或在更改后重新装载 NFS 文件系统之前配置这些设置。

如需了解装载选项(例如 nconnect),请参阅 Linux NFS 装载选项。如需详细了解配置顺序,请参阅优化 Linux NFS 客户端

术语

以下关键术语与 Linux NFS 并发相关:

  • RPC slot table:客户端上未完成的 NFS RPC 操作(NFSv3)的每个 TCP 连接限制。

  • 会话槽:NFSv4.1 对客户端与服务器之间会话的未完成命令的限制。

  • 存储端点:客户端装载的单个卷 IP 地址。

  • nconnect:一种挂载选项,用于打开与同一端点的多个 TCP 连接;它可将每个连接的并发性倍增。

Linux 参数

下表列出了用于为每个协议版本配置 NFS 并发性的参数和配置文件:

协议 参数 配置
NFSv3 sunrpc.tcp_max_slot_table_entries /etc/sysctl.confsysctl -p
NFSv3 sunrpc.tcp_slot_table_entries 某些发行版;请参阅您的发行版文档
NFSv4.1 max_session_slots /etc/modprobe.d/(例如 nfsclient.conf),重新启动

NFSv3

以下部分介绍了 NFSv3 客户端和服务器限制、nconnect 对并发性的影响、如何估算并发性要求,以及如何配置槽位限制。

客户端和服务器限制

NFSv3 不协商客户端与服务器之间的并发。各方会应用各自的限额。

  • NetApp Volumes NFSv3 服务器:每个 TCP 连接最多 128 个执行上下文。

  • 新版 Linux 客户端(默认)sunrpc.tcp_max_slot_table_entries = 65536

默认客户端槽数超过服务器限制是不必要的。如果客户端发送的未完成操作数量超过服务器可高效处理的数量,服务器可能会减小 TCP 窗口,从而影响性能。

建议:将每个连接的 sunrpc.tcp_max_slot_table_entries 设置为 128 或更低。对于具有许多客户端和连接的环境,请将每个存储端点的未完成槽总用量保持在 10,000 或更低。

nconnect 如何影响 NFSv3 并发

单个客户端的大致最大并发数按以下公式计算:

(sunrpc.tcp_max_slot_table_entries per connection) x (nconnect value)

并发值受每个连接的服务器 (128) 和工作负载要求的限制。

示例 1:默认 slot,无 nconnect

  • 一个 TCP 连接。

  • 客户端最多可以尝试 65,536 次未完成的操作,但服务器每个连接最多接受 128 次。

  • 受服务器限制(128)约束的有效并发。

示例 2:128 个 slot,无 nconnect

  • sunrpc.tcp_max_slot_table_entries=128

  • 一次连接。

  • 客户端和服务器在 128 个未完成的操作上保持一致。

示例 3:100 个 slot,nconnect=8

  • 8 个 TCP 连接。

  • 每个连接最多可有 100 个未完成的操作。

  • 一个客户端最多可有 800 个未完成的操作(8 x 100),但受每个连接 128 个的服务器限制。

示例 4:许多客户端(EDA 样式)

  • 250 个客户端,每个客户端都有 sunrpc.tcp_max_slot_table_entries=8 和没有 nconnect

  • 每个客户端每个连接最多可有 8 个未完成的操作。

  • 所有客户端的总和:一个卷 IP 最多可有 2,000 个未完成的操作(250 x 8),这符合 1 万个槽位的端点准则。

扩容客户端时,请使用较低的单客户端槽值。请在单个高吞吐量客户端上使用 nconnect,而不是将其用作整个服务器场的槽规划替代方案。

使用利特尔定律估算所需的并发

您可以使用以下公式来估算工作负载所需的并发数:

并发 =(操作速率)x(延迟时间,以秒为单位)

示例:多个客户端,一个端点

以 256 KiB 的平均 I/O 和 10 毫秒的延迟为目标,实现 4,000 MiBps 的吞吐量:

  • 操作速率:大约 16,000 IOPS。

  • 并发数:大约 16,000 x 0.010 = 160。

  • 如果客户数量为 1,250,则每个客户的广告资源位约为 160 / 1,250 = 0.13 个(如果平均分配)。为每个客户端使用一个较小的整数(例如 2、4 或 8),以在 10,000 个插槽的上限内保持一定的空间。

设置 sunrpc.tcp_max_slot_table_entries (NFSv3)

在许多 Linux 发行版中,systemd-sysctl 在加载 sunrpc 内核模块之前运行。启动时,系统会忽略 sunrpc.*/etc/sysctl.conf/etc/sysctl.d/ 中的条目。如果您不使用以下持久性方法之一,则在启动后运行 sysctl -p 仅在下次重新启动之前有效。

方法 1:如果测试表明低于 128 的值就足够了,请使用该值。除非您的分发文档另有说明,否则请将 tcp_slot_table_entriestcp_max_slot_table_entries 设置为相同的值。

更改这些设置后,请装载或重新装载 NFS 文件系统。槽设置适用于在设置生效后创建的 RPC 传输。

方法 2(推荐)/etc/modprobe.d/ 中的模块选项

模块参数在 sunrpc 首次在启动后使用 NFS 时应用。这些设置在重新启动后会保留,从而避免了在启动时进行 sysctl 配置。

  1. 创建 /etc/modprobe.d/sunrpc.conf

    options sunrpc tcp_slot_table_entries=128 tcp_max_slot_table_entries=128
    
  2. 如果您的发行版在 modprobe 更改后需要重新构建 initramfs,请执行此操作,这在模块位于 initramfs 中时是 RHEL 上的常见做法。如需了解详情,请参阅 Linux 供应商文档。

  3. 仅当您没有有效的 NFS 装载且您的操作手册允许时,才可重新启动或卸载并重新加载 sunrpc

  4. 验证 sunrpc 是否已加载,以及是否已设置预期值:

    cat /proc/sys/sunrpc/tcp_slot_table_entries
    cat /proc/sys/sunrpc/tcp_max_slot_table_entries
    
  5. 装载或重新装载 NetApp Volumes 导出。

NFSv4.1

以下部分介绍了 NFSv4.1 会话协商的工作方式,提供了性能优化示例,并说明了如何配置会话槽限制。

会话协商

NFSv4.1 在客户端和服务器之间建立会话。客户端和服务器通过选择两个支持的值中较低的一个来协商未完成命令的最大数量 (max_reqs)。

  • NetApp Volumes NFSv4.1 服务器:每个会话 180 个命令。

  • Linux 客户端默认值:64 (max_session_slots)。

  • 协商的会话:客户端和服务器值的最小值,通常为 64(使用默认客户端时)。

与服务器的每个 TCP 连接最多支持 128 个未完成的 NFS 命令。默认情况下,会话槽数为 64,连接数为 1,因此并发数限制为 64。如需跨连接使用更多会话槽,请仅针对非 Kerberos 装载使用 nconnect=2 或更高级别。如需详细了解装载选项,请参阅 Linux NFS 装载选项

示例 1默认 64 个会话槽,无 nconnect

  • 一次连接。

  • 会话最多可有 64 个未完成的命令。

示例 264 个会话槽,nconnect=2

  • 会话仍限制为总共 64 个时段,这些时段分布在两个连接中,每个连接大约 32 个时段。

  • 此配置通过降低每个连接的队列深度来缩短延迟时间,而不会增加总并发数。

示例 3max_session_slots=180,无 nconnect

  • 会话允许 180 个命令,并且一个连接最多只能有 128 个未完成的操作。

  • 有效限制为 128。

示例 4max_session_slots=180, nconnect=2

  • 会话最多可以在两个连接中使用 180 个命令,即每个连接大约 90 个命令。

  • 如果要在会话级层面上突破单连接 128 的上限,则需要进行此配置。

如需在没有 Kerberos 的 NetApp Volumes 上实现最高的 NFSv4.1 并发性,请设置 max_session_slots=180 并使用 nconnect=2 或更高版本。使用工作负载测试此配置。

为 NFSv4.1 设置了最大会话槽数

  1. 创建 /etc/modprobe.d/nfsclient.conf

    options nfs max_session_slots=180
    
  2. 重新启动客户端。

  3. 在至少存在一个 NFSv4.1 装载后,验证配置:

    systool -v -m nfs
    
  4. 确认输出中显示 max_session_slots

这些更改需要重启标准 Linux NFS 客户端封装。请相应地规划维护。

多客户和大容量卷

  • 多个虚拟机,一个卷 IP:减少每个客户端的 sunrpc.tcp_max_slot_table_entries

  • 具有多个 IP 的大容量:插槽限制适用于每个客户端到 IP 的连接。尽可能将客户端分布在各个端点上。如需了解详情,请参阅连接具有多个存储端点的大容量

后续步骤