Azure NetApp Files 的 NFS 預先讀取最佳做法
本文可協助您瞭解 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 進行測試發現,相較於 3,840 KiB、960 KiB 和 128 KiB,15,360 KiB 讀取值最佳。 超過 15,360 KiB 的測試量尚不足以判斷影響為正面還是負面。
下表顯示每個目前可用散發套件的預設預先讀取值。
Distribution | 版本 | 預先讀取區塊 |
---|---|---|
RHEL | 8.3 | 128 KiB |
RHEL | 7.X、8.0、8.1、8.2 | 15 X rsize |
SLES | 12.X – 至少 15SP2 | 15 X rsize |
Ubuntu | 18.04 – 至少 20.04 | 128 KiB |
Ubuntu | 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