この記事は、Azure NetApp Files 用のファイルシステム キャッシュのベスト プラクティスを理解するのに役立ちます。
NFS 先行読み取りは、アプリケーションによる I/O 要求に先立って、ファイルからのブロックを予測的に要求するものです。 これは、クライアントのシーケンシャルな読み取りスループットを向上させることを目的として設計されています。 最近まで、最新のすべての Linux ディストリビューションでは先行読み取り値を、マウントされたファイルシステムの rsize の 15 倍に相当するように設定していました。
次の表は、所定の rsize マウント オプションごとに、既定の先行読み取り値を示したものです。
マウントされたファイルシステムの rsize |
先行読み取りするブロック |
|---|---|
| 64 KiB | 960 KiB |
| 256 KiB | 3,840 KiB |
| 1,024 KiB | 15,360 KiB |
RHEL 8.3 および Ubuntu 18.04 によって、クライアントのシーケンシャル読み取りパフォーマンスに悪影響を及ぼすおそれのある変更が導入されました。 以前のリリースとは異なり、これらのディストリビューションでは、使用される rsize マウント オプションに関係なく、先行読み取りを既定値の 128 KiB に設定します。 より大きな先行読み取り値を持つリリースから、既定で 128 KiB となっているリリースにアップグレードすると、シーケンシャルな読み取りパフォーマンスが低下していました。 ただし、先行読み取り値は、動的にも、永続的にも調整することが可能です。 たとえば、SAS GRID を使用したテストでは、15,360 KiB の読み取り値が (3,840 KiB、960 KiB、および 128 KiB と比較して) 適していました。 15,360 KiB を超える場合については、正または負の影響を判断するのに十分なテストが行われていません。
次の表に、現在利用可能なディストリビューションごとに先行読み取り値の既定値を示します。
| 流通 | Release | 先行読み取りするブロック |
|---|---|---|
| RHEL | 8.3 | 128 KiB |
| RHEL | 7.X、8.0、8.1、8.2 | 15 X rsize |
| SLES | 12.X – 15SP2 以上 | 15 X rsize |
| ウブントゥ | 18.04 – 20.04 以上 | 128 KiB |
| ウブントゥ | 16.04 | 15 X rsize |
| Debian | 最大 10 まで | 15 X rsize |
NFS ごとのファイルシステムの先行読み取りを操作する方法
NFS 先行読み取りは、NFS ファイルシステムのマウント ポイントで定義されます。 既定の設定を表示し、動的に、および永続的に設定することができます。 便宜上、Red Hat によって作成された次の bash スクリプトが提供されており、マウントされた NFS ファイルシステムの先行読み取りの表示、または動的な設定を行えます。
先行読み取りは、次のスクリプトを使用して NFS マウントごとに動的に定義することも、このセクションで示すように、udev ルールを使用して永続的に定義することもできます。 マウントされた NFS ファイルシステムに対して先行読み取りを表示または設定するには、次のスクリプトを bash ファイルとして保存し、ファイルのアクセス許可を変更して実行可能ファイル (chmod 544 readahead.sh) にしてから、示されているように実行します。
先読み値を表示または設定する方法
現在の先行読み取り値 (戻り値の単位は KiB) を表示するには、次のコマンドを実行します。
./readahead.sh show <mount-point>
先行読み取りの新しい値を設定するには、次のコマンドを実行します。
./readahead.sh set <mount-point> [read-ahead-kb]
例
#!/bin/bash
# set | show readahead for a specific mount point
# Useful for things like NFS and if you do not know / care about the backing device
#
# To the extent possible under law, Red Hat, Inc. has dedicated all copyright
# to this software to the public domain worldwide, pursuant to the
# CC0 Public Domain Dedication. This software is distributed without any warranty.
# For more information, see the [CC0 1.0 Public Domain Dedication](http://creativecommons.org/publicdomain/zero/1.0/).
E_BADARGS=22
function myusage() {
echo "Usage: `basename $0` set|show <mount-point> [read-ahead-kb]"
}
if [ $# -gt 3 -o $# -lt 2 ]; then
myusage
exit $E_BADARGS
fi
MNT=${2%/}
BDEV=$(grep $MNT /proc/self/mountinfo | awk '{ print $3 }')
if [ $# -eq 3 -a $1 == "set" ]; then
echo $3 > /sys/class/bdi/$BDEV/read_ahead_kb
elif [ $# -eq 2 -a $1 == "show" ]; then
echo "$MNT $BDEV /sys/class/bdi/$BDEV/read_ahead_kb = "$(cat /sys/class/bdi/$BDEV/read_ahead_kb)
else
myusage
exit $E_BADARGS
fi
NFS マウントの先行読み取り永続的に設定する方法
NFS マウントの先行読み取りを永続的に設定するには、次のように udev ルールを記述します。
/etc/udev/rules.d/99-nfs.rulesを作成してテストします。SUBSYSTEM=="bdi", ACTION=="add", PROGRAM="<absolute_path>/awk -v bdi=$kernel 'BEGIN{ret=1} {if ($4 == bdi) {ret=0}} END{exit ret}' /proc/fs/nfsfs/volumes", ATTR{read_ahead_kb}="15380"udevルールを適用します。sudo udevadm control --reload