Alibaba Cloud Linux 3インスタンス上のNFS (Network File system) ファイルシステムからファイルを読み取るためにreadやcopy_file_rangeなどのシステム呼び出しを行うと、Alibaba Cloud Linux 2インスタンス上で同じことを行う場合と比較して、読み取りパフォーマンスが大幅に低下する可能性があります。 このトピックでは、問題の原因と解決策について説明します。
問題の説明
症状
Alibaba Cloud Linux 3インスタンス上のNFSファイルシステムでは、ファイルの読み取りパフォーマンスが低下し、次のような状況が発生します。
このインスタンスは、readやcopy_file_rangeなどのシステム呼び出しを行って、NFSファイルシステムから大きなファイルを読み取るのに時間がかかります。
インスタンスは、
dd
コマンドを実行してNFSマウントポイントでファイルからデータを読み取るために、Alibaba Cloud Linux 2インスタンスよりも時間がかかります。 サンプルコマンド:dd if=<nfs_mntpoint>/<testfile> of=/dev/null bs=1M
説明サンプルコマンドは、NFSマウントポイントでテストファイルファイルからデータを読み取り、そのデータを /dev/nullデバイスに送信します。
dd
コマンドを実行すると、コマンド出力には、読み取られた合計バイト数や消費時間などの特定の情報が含まれます。 この情報を使用して、データの読み取り速度を計算し、NFSファイルシステムのパフォーマンスを評価できます。
影響
この問題は、主に次の設定のECSインスタンスで発生します。
画像: aliyun_3_x64_20G_alibase_20210415.vhd以降。
カーネル: 5.10.23-4。al8.x86_64以降。
ファイルシステム: NFSファイルシステムがマウントされ、マウントポイントのディレクトリにあるファイルが読み取られます。
原因
上流のLinuxカーネルでは、read_ahead_kb
パラメーターはブロックデバイスの先読みウィンドウサイズを示します。 先読みは、システムが近い将来にアクセスされる可能性のあるデータを予測し、そのデータをメモリにプロアクティブにロードすることを可能にするパフォーマンス最適化技術である。 先読みデータが要求された場合、システムは、ディスクI/O動作が完了するのを待つ必要なく、メモリから直接データを読み取ることができる。 これにより、レイテンシが削減され、データ読み取り効率が向上します。
Linuxカーネルバージョン5.4以前は、NFSファイルシステムでサポートされている先読みデータの量は、マウント時に設定された
rsize
値によって異なります。 rsize値は、NFSクライアントがネットワーク読み取り要求ごとに受信できるデータの最大サイズを示します。 デフォルトでは、read_ahead_kb
の値はrsize
の値の15倍です。 カーネルバージョン4.19のAlibaba Cloud Linux 2では、rsize
のデフォルト値は1,024 KB、read_ahead_kb
の値は15,360 KBです。ただし、linuxカーネルバージョン5.4でコミット (index : kernel/git/torvalds /Linux. git) が導入された後、
read_ahead_kb
パラメーターはrsize
パラメーターではなくVM_READAHEAD_PAGES
パラメーターに基づいて変化します。 カーネルバージョン5.10のAlibaba Cloud Linux 3では、read_ahead_kb
のデフォルト値は128 KBです。
したがって、Alibaba Cloud Linux 3は、Alibaba Cloud Linux 2よりも低いファイル読み取りパフォーマンスを提供します。 Alibaba Cloud Linux 3インスタンスの場合、ファイルの読み取り効率を最適化するために、先読みウィンドウのサイズを再評価および調整する必要があります。
NFSファイルシステムでは、大きな先読みウィンドウにより、大きなファイルの連続読み取りのパフォーマンスが向上する可能性があります。 ただし、ウィンドウが極端に大きい場合、特にランダムな読み取りを伴うシナリオでは、不要なデータがメモリにロードされる可能性があります。 したがって、ビジネス環境に基づいて実際のワークロードを評価し、read_ahead_kb
の値を調整して最適な先読みウィンドウサイズを取得することを推奨します。
解決策
次のいずれかの方法を使用して、read_ahead_kb
値を変更できます。
echo
コマンドを実行して、単一のファイルシステムのread_ahead_kb値を変更します。
NFSファイルシステムの先読み設定を表示します。
cat /sys/class/bdi/$(mountpoint -d <nfs_mountpoint>)/read_ahead_kb
<nfs_mountpoint>
をNFSマウントポイントの実際のパスに置き換えます。 パスを取得するには、cat /proc/self/mountinfo
コマンドを実行します。NFSファイルシステムの先読みウィンドウサイズを適切に増やします。
sudo sh -c 'echo <num> > /sys/class/bdi/<major >:< minor>/read_ahead_kb '
実際の環境に基づいて次のパラメータを設定します。
<num>
: 先読みウィンドウのサイズ。 (単位:KB)<major >:< minor>
: NFSファイルシステムのマイナーデバイス番号とマイナーデバイス番号。 数値を取得するには、sudo mountpoint -d <nfs_mountpoint>
コマンドを実行します。
サンプルコマンド:
sudo sh -c 'echo 15360 > /sys/class/bdi/0:422/read_ahead_kb '
説明複数のNFSファイルシステムをインスタンスにマウントする場合は、コマンドを繰り返し実行して、各ファイルシステムの先読み設定を変更します。
udevメカニズムを使用して、複数のファイルシステムのread_ahead_kb値を変更します。
udevメカニズムを使用してudevルールを追加し、インスタンスにマウントされているすべてのNFSファイルシステムに対してudevルールチェックイベントを手動でトリガーできます。 udevルールチェックイベントを使用すると、インスタンスにマウントされ、マウントされるすべてのNFSファイルシステムの先読み設定を自動的に変更できます。 以下の手順を実行します。
udevはLinuxカーネルのデバイスマネージャであり、ファイルの管理と操作の自動化を担当しています。 udevメカニズムは、udevデーモンをコアコンポーネントとして使用します。 udevデーモンはユーザー空間で実行され、ueventメカニズムを使用してカーネルと通信します。
NFSファイルシステムのudevルールを含む構成ファイルを開いて編集します。 設定ファイルは
/etc/udev/rules.d/
ディレクトリにあります。 設定ファイルが存在しない場合は、設定ファイルを作成します。 サンプルコマンド:sudo vim /etc/udev/rules.d/99-nfs.ru les
構成ファイルにudevルールを追加して、NFSファイルシステムが先読み設定を自動的に変更できるようにします。
この例では、
read_ahead_kb
パラメーターは15,360 KBに設定されています。 このパラメーターの値は、ビジネス要件に基づいて変更できます。SUBSYSTEM=="bdi" 、ACTION=="add" 、PROGRAM="/bin/awk -v bdi=$kernel 'BEGIN{ret=1} {if ($4=bdi) {ret=0}} END{exit ret}' /proc/fs/nfsfs/volumes" 、ATTR{read_ahead_kb}="
設定ファイルを保存して閉じます。
新しいルールが有効になるように構成ファイルをリロードします。
sudo udevadm control -- reload
udevルールチェックイベントを手動でトリガーして、マウントされているすべてのNFSファイルシステムの
read_ahead_kb
値を変更します。sudo udevadm trigger -c add -s bdi
NFS設定ファイルを変更して、バージョン2.3.3-57.0.1.al8.1以降の複数ファイルシステムのread_ahead_kb値を変更します。
Alibaba Cloud Linux 3インスタンスのNFSファイルシステムバージョンがnfs-utils-2.3.3-57.0.1.al8.1以降の場合、/etc /NFS. conf
ディレクトリにあるnfs設定ファイルを変更することで、read_ahead_kb
値を変更できます。 rpm -qa | grep nfs-utils
コマンドを実行して、NFSファイルシステムのバージョンを照会できます。
NFS設定ファイルを開いて編集します。
sudo vim /etc/nfs.conf
デフォルトの先読み設定を変更し、ファイルを保存して閉じます。
[nfsrahead] nfs=15000 nfs4=16000
NFSファイルシステムのバージョンnfsおよびnfsv4に基づいて先読み設定を変更します。
nfs
は、NFSファイルシステムのバージョンが3であることを示します。nfs4
は、NFSファイルシステムのバージョンが4であることを示します。 バージョンを照会するには、mount -v | grep nfs
コマンドを実行します。マウントされたNFSファイルシステムの場合は、ファイルシステムをアンマウントしてから再マウントし、設定を有効にします。
sudo umount <nfs_mountpoint> sudo mount -t nfs -o vers=<NFS protocol version> <NFS server address> <nfs_mountpoint>