本页面介绍了如何在装载 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 值,请完成以下步骤:
在
/proc/self/mountinfo中找到装载,并记下第三个字段中的 BDI 标识符。以千字节为单位读取值:
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 规则。
创建
/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"在
PROGRAM=属性中使用系统上awk的绝对路径。重新加载
udev:sudo udevadm control --reload
重新装载 NFS 卷或重启,以触发新 BDI 设备的规则。
请先在非生产主机上测试 udev 规则。如果匹配表达式错误,不正确的规则可能会影响非 NFS 块设备。
工作负载指南
调整预读时,请考虑以下基于工作负载类型的指南:
随机读取(OLTP、小批量随机 I/O):保留默认预读。
顺序读取(媒体、批量复制和一些高性能计算): 增加到 15 倍的
rsize并进行衡量。混合:仅当分析表明存在顺序读取瓶颈时才进行调整。
低
rsize(64 KiB) 和 128 KiB 的默认预读:考虑 将预读增加到 960 KiB 或更高。
将预读调整与适当的 rsize、nconnect 和并发设置相结合。