ls -l、du、findなどのメタデータ操作が遅い

1つのディレクトリのファイル数が100,000を超えると、メタデータの操作(ls -ldufindなど)が遅くなります。

通常、100,000ファイルを含むファイル・ストレージ・ディレクトリに対するls -lは、10秒以内に完了すると予想されます。ディレクトリ・サイズがファイル・ストレージの書込みスループットに大きな影響を与えることはありません。読取り/書込みの速度が遅い場合は、NFSマウント・オプションrsizeおよびwsizeを10488576未満の値で使用していないことを確認してください。ベスト・プラクティスは、マウント・オプションrsizeおよびwsizeを指定せず、デフォルト値の1048576のままにすることです。

Cause: Directory scanning operations such as ls, du, find, and rsync on a directory containing 100,000 files takes longer in File Storage.

解決策:

  1. 大量のファイルを1つのディレクトリに格納せずに、ファイルをサブディレクトリに再分散します。ディレクトリ・サイズを常に100,000ファイル以下にするために、サブディレクトリを使用することをお薦めします。

    ヒント

    サブディレクトリを使用したディレクトリ・サイズの保持は、ファイル・ストレージでのベスト・プラクティスです。
  2. 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]$
  3. 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を使用して、インスタンスが実行している effectiveカーネルを表示します。uptrack-unameのフォーマットは unameと同じで、-r-aを含む共通の unameフラグがサポートされます。

    例: 

    $ uptrack-uname -r
    4.14.35-1902.302.2.el7uek.x86_64
  4. ディレクトリ・スキャン操作によってREADDIRPLUS NFSコールが呼び出されます。ディレクトリに多数のファイルが含まれている場合、これにはコストがかかります。インスタンスは、マウント時にnordirplusオプションを使用してREADDIRPLUSコールを無効にできます。インスタンスでREADDIRPLUS NFS操作を無効にするには:

    1. インスタンス上でターミナル・ウィンドウを開きます。
    2. umountコマンドを使用してファイル・システムをアンマウントします。例:

      sudo umount 10.x.x.x:/fs-export-path /mnt/yourmountpoint
    3. ファイル・システムを再マウントし、-o nordirplusオプションを含めてREADDIRPLUSを無効にします。例:

      sudo mount -o nordirplus 10.x.x.x:/fs-export-path /mnt/yourmountpoint