ls -l、du、findなどのメタデータ操作が遅い
1つのディレクトリのファイル数が100,000を超えると、メタデータの操作(ls -l
、du
、find
など)が遅くなります。
通常、100,000ファイルを含むファイル・ストレージ・ディレクトリに対するls -l
は、10秒以内に完了すると予想されます。ディレクトリ・サイズがファイル・ストレージの書込みスループットに大きな影響を与えるわけではありません。読取り/書込みの速度が遅い場合は、NFSマウント・オプションrsize
およびwsize
を1048576未満の値で使用していないことを確認してください。ベスト・プラクティスは、マウント・オプションrsize
およびwsize
を指定せず、デフォルト値の1048576です。
原因:ファイル・ストレージでは、100,000ファイルを含むディレクトリに対するls
、du
、find
、rsync
などのディレクトリ・スキャン操作は時間がかかります。
解決策:
-
大量のファイルを1つのディレクトリに格納せずに、ファイルをサブディレクトリに再分散します。ディレクトリ・サイズを常に100,000ファイル以下にするために、サブディレクトリを使用することをお薦めします。
ヒント
サブディレクトリを使用してディレクトリ・サイズを小さく保つことが、ファイル・ストレージのベスト・プラクティスです。 ls -l
のかわりにls -ld
またはstat
を使用します。サイズの大きいディレクトリでは、これらの操作のほうがls -l
よりもはるかに高速です。例:
[opc@instance01 dd]$ time ls -l|wc -l 401425 real 0m39.786s user 0m4.389s sys 0m5.403s [opc@instance01 dd]$ time ls -ld drwxrwxr-x. 4 opc opc 401424 Apr 17 14:18 . real 0m0.009s user 0m0.001s sys 0m0.003s [opc@instance01 dd]$ time stat .|grep Size Size: 401424 Blocks: 785 IO Block: 32768 directory real 0m0.010s user 0m0.002s sys 0m0.003s [opc@instance01 dd]$
-
場合によっては、NFSクライアントの問題によって、ディレクトリ・スキャン操作がループに入り、スキャン時間が長くなることがあります。この問題は、次のOracle Linuxバージョンに影響を与えていました:
- Oracle Linux 6
- Unbreakable Enterprise Kernel (UEK)バージョンが4.14.35-1902.301.1より前のOracle Linux 7
Oracle Linux 6を使用している場合は、Oracle Linux 7以降にアップグレードします。最新バージョンを推奨します。
Oracle Linux 7のユーザーは、
uname -a
コマンドを実行してUEKのバージョンを確認できます。UEKバージョンが4.14.35-1902.301.1より前の場合は、新しいカーネル・バージョンにアップグレードします。この動作を解決するパッチは2020年4月17日に提供されており、Oracle Kspliceとともにインストールできます。Oracle Kspliceを使用すると、再起動せずに、重要なセキュリティ更新およびその他のクリティカルなカーネル更新を適用できます。Oracle Kspliceがインスタンスにインストールされている必要があります。Kspliceのインストール後、使用可能なKspliceパッチをインストールできます。手順は、Oracle Kspliceを参照してください。
パッチのインストール後に、有効なカーネル・バージョンを確認できます。Ksplice
uptrack
では、uname
コマンドの出力は変更されません。uname
は、インスタンスが起動されたカーネルのバージョンを引き続き反映します。かわりに、
uptrack-uname
を使用して、インスタンスが実行している有効なカーネルを確認します。uptrack-uname
のフォーマットはuname
と同じで、-r
や-a
を含む共通のuname
フラグがサポートされます。例:
$ uptrack-uname -r 4.14.35-1902.302.2.el7uek.x86_64
-
ディレクトリ・スキャン操作によって
READDIRPLUS
NFSコールが呼び出されます。ディレクトリに多数のファイルが含まれている場合、これにはコストがかかります。インスタンスは、マウント時にnordirplus
オプションを使用してREADDIRPLUS
コールを無効にできます。インスタンスでREADDIRPLUS
NFS操作を無効にするには:- インスタンス上でターミナル・ウィンドウを開きます。
-
umount
コマンドを使用してファイル・システムをアンマウントします。例:sudo umount 10.x.x.x:/fs-export-path /mnt/yourmountpoint
-
ファイル・システムを再マウントし、
-o nordirplus
オプションを含めてREADDIRPLUS
を無効にします。例:sudo mount -o nordirplus 10.x.x.x:/fs-export-path /mnt/yourmountpoint