This page describes how to tune NFS read-ahead on Linux clients that mount NetApp Volumes. Read-ahead lets the kernel prefetch file blocks before an application requests them, which improves sequential read throughput. Read-ahead doesn't replace mount options or concurrency tuning; configure those first. For more information, see Optimize Linux NFS clients.
Before you begin
Complete the following prerequisites before you tune NFS read-ahead:
If you plan to tune the slot table or session slots, complete Linux NFS concurrency first.
Mount the volume with appropriate Linux NFS mount options, including
rsize. For more information, see Linux NFS mount options.Tune read-ahead after you mount the volume.
Read-ahead overview
When an application reads a file sequentially, the Linux NFS client can request additional data beyond the current read. This hides network latency and raises throughput for sequential workloads, such as log playback, media streaming, bulk copy, and some analytics scans.
Read-ahead is configured per mount point. It is less effective for random-read workloads than for sequential read workloads.
Defaults and rsize
Many Linux distributions set read-ahead to approximately 15 times rsize. Some
distributions use a fixed 128 KiB read-ahead regardless of rsize, which can
reduce sequential read performance after an upgrade. Check the current value on
your mounted file system before you change it.
View read-ahead for a mount
Each NFS mount point has a corresponding backing block device under
/sys/class/bdi/. To find the backing block device identifier (BDI) and view
the current read_ahead_kb value, complete the following steps:
Locate the mount in
/proc/self/mountinfoand note the BDI identifier in the third field.Read the value in kilobytes:
cat /sys/class/bdi/BDEV/read_ahead_kb
Choose a read-ahead value
Use the following guidelines to select an appropriate read-ahead value for your workload:
If you don't need maximum performance, keep your distribution's default and don't tune read-ahead.
Start with 15 times
rsize(in KiB) if your distribution no longer sets it automatically.For
rsize=1048576(1 MiB), 15 timesrsizeis approximately 15,360 KiB (15 MiB).Increase or decrease the value in steps and measure performance using your application and
nfsiostat. Test values larger than 15,360 KiB before production use.
Read-ahead interacts with the page cache. Workloads that bypass the cache
(O_DIRECT) don't benefit from read-ahead as sequential cached reads do.
Persist read-ahead across reboots
Dynamic changes apply until you unmount or reboot. To persist these changes for
NFS mounts, create a udev rule.
Create
/etc/udev/rules.d/99-nfs-readahead.rulesand adjust theread_ahead_kbvalue as needed: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"Use an absolute path to
awkon your system in thePROGRAM=attribute.Reload
udev:sudo udevadm control --reload
Remount the NFS volumes or reboot to trigger the rules for new BDI devices.
Test the udev rules on a non-production host first. Incorrect rules might
affect non-NFS block devices if the match expression is wrong.
Workload guidance
Consider the following guidance based on your workload type when tuning read-ahead:
Random reads (OLTP, small random I/O): keep the default read-ahead.
Sequential reads (media, bulk copy, and some high performance computing): increase to 15 times
rsizeand measure.Mixed: tune only if profiling shows a sequential-read bottleneck.
Low
rsize(64 KiB) with a 128 KiB default read-ahead: consider increasing read-ahead to 960 KiB or higher.
Combine read-ahead tuning with appropriate rsize, nconnect, and concurrency
settings.