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 -
ディレクトリ・スキャン操作によって
READDIRPLUSNFSコールが呼び出されます。ディレクトリに多数のファイルが含まれている場合、これにはコストがかかります。インスタンスは、マウント時にnordirplusオプションを使用してREADDIRPLUSコールを無効にできます。インスタンスでREADDIRPLUSNFS操作を無効にするには:- インスタンス上でターミナル・ウィンドウを開きます。
-
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