共用方式為


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 規則,如下所示:

  1. 建立及測試 /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"
    
  2. 套用 udev 規則:

       sudo udevadm control --reload
    

下一步