Linux NFS 预读

本页面介绍了如何在装载 NetApp Volumes 的 Linux 客户端上调整 NFS 预读。借助预读,内核可以在应用请求文件块之前预提取这些文件块,从而提高顺序读取吞吐量。 预读不会取代装载选项或并发调整;请先配置这些选项。如需了解详情,请参阅优化 Linux NFS 客户端

准备工作

在调整 NFS 预读之前,请完成以下前提条件:

  • 如果您计划调整槽表或会话槽,请先完成 Linux NFS 并发

  • 使用适当的 Linux NFS 装载选项(包括 rsize)装载卷。 如需了解详情,请参阅 Linux NFS 装载选项

  • 装载卷后,调整预读。

预读概览

当应用按顺序读取文件时,Linux NFS 客户端可以请求超出当前读取范围的额外数据。这可以隐藏网络延迟,并提高顺序工作负载(例如日志回放、媒体流式传输、批量复制和一些分析扫描)的吞吐量。

预读是按装载点配置的。对于随机读取工作负载,它的效果不如顺序读取工作负载。

默认值和 rsize

许多 Linux 发行版将预读设置为大约 15 倍的 rsize。某些发行版使用固定的 128 KiB 预读,而不考虑 rsize,这可能会在升级后降低顺序读取性能。在更改之前,请检查已装载文件系统上的当前值。

查看装载的预读

每个 NFS 装载点在 /sys/class/bdi/ 下都有一个对应的后备块设备。如需查找后备块设备标识符 (BDI) 并查看当前的 read_ahead_kb 值,请完成以下步骤:

  1. /proc/self/mountinfo 中找到装载,并记下第三个字段中的 BDI 标识符。

  2. 以千字节为单位读取值:

    cat /sys/class/bdi/BDEV/read_ahead_kb
    

选择预读值

请按照以下准则为您的工作负载选择合适的预读值:

  • 如果您不需要最高性能,请保留发行版的默认值,并且不要调整预读。

  • 如果您的发行版不再自动设置预读,请从 15 倍的 rsize(以 KiB 为单位)开始。

  • 对于 rsize=1048576 (1 MiB),15 倍的 rsize 大约为 15,360 KiB (15 MiB)。

  • 逐步增加或减少该值,并使用您的应用和 nfsiostat 衡量性能。在生产环境中使用之前,请测试大于 15,360 KiB 的值。

预读与页面缓存交互。绕过缓存 (O_DIRECT) 的工作负载无法像顺序缓存读取那样从预读中受益。

在重启后保留预读

动态更改会在您卸载或重启之前生效。如需为 NFS 装载保留这些更改,请创建 udev 规则。

  1. 创建 /etc/udev/rules.d/99-nfs-readahead.rules,并根据需要调整 read_ahead_kb 值:

    SUBSYSTEM=="bdi", ACTION=="add", PROGRAM="/usr/bin/awk -v bdi=$kernel 'BEGIN{ret=1} {if ($4 == bdi) {ret=0}} END{exit ret}' /proc/fs/nfsfs/volumes", ATTR{read_ahead_kb}="15360"
    
  2. PROGRAM= 属性中使用系统上 awk 的绝对路径。

  3. 重新加载 udev

    sudo udevadm control --reload
    
  4. 重新装载 NFS 卷或重启,以触发新 BDI 设备的规则。

请先在非生产主机上测试 udev 规则。如果匹配表达式错误,不正确的规则可能会影响非 NFS 块设备。

工作负载指南

调整预读时,请考虑以下基于工作负载类型的指南:

  • 随机读取(OLTP、小批量随机 I/O):保留默认预读。

  • 顺序读取(媒体、批量复制和一些高性能计算): 增加到 15 倍的 rsize 并进行衡量。

  • 混合:仅当分析表明存在顺序读取瓶颈时才进行调整。

  • rsize (64 KiB) 和 128 KiB 的默认预读:考虑 将预读增加到 960 KiB 或更高。

将预读调整与适当的 rsizenconnect 和并发设置相结合。

后续步骤