

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# ストレージ問題のトラブルシューティング
<a name="lfs-migrate-ts"></a>

場合によっては、ファイルシステムのストレージの問題が発生することがあります。問題は、`lfs migrate` コマンドなどの `lfs` コマンドを使用してトラブルシューティングできます。

## ストレージターゲットにスペースがないことによる書き込みエラー
<a name="lfs-migrate-no-storage"></a>

[ファイルシステムストレージレイアウト](performance.md#storage-layout) で説明されているように、`lfs df -h` コマンドを使用して、ファイルシステムのストレージ使用量を確認できます。`filesystem_summary` フィールドには、ファイルシステムのストレージ使用量の合計が報告されます。

ファイルシステムのディスク使用率が 100% の場合は、ファイルシステムのストレージ容量を増やすことを検討してください。詳細については、「[ストレージ容量の管理](managing-storage-capacity.md)」を参照してください。

ファイルシステムのストレージ使用率が 100％ でなくても、書き込みエラーが発生する場合は、書き込み先のファイルが、いっぱいの OST でストライプ化されている可能性があります。

**実行するアクション**
+ 多くの OST がいっぱいになっている場合は、ファイルシステムのストレージ容量を増やしてください。[OST 上のアンバランスストレージ](#lfs-migrate-unbalanced-storage) セクションのアクションに従って、OST のアンバランスストレージをチェックします。
+ OST がいっぱいになっていない場合は、すべてのクライアントインスタンスに次の調整を適用して、クライアントのダーティページのバッファサイズを調整します。

  ```
  sudo lctl set_param osc.*.max_dirty_mb=64
  ```

## OST 上のアンバランスストレージ
<a name="lfs-migrate-unbalanced-storage"></a>

Amazon FSx for Lustre は、新しいファイルストライプを OST 全体に均等に分散します。ただし、I / O パターンまたはファイルストレージレイアウトが原因で、ファイルシステムのバランスが崩れる可能性があります。その結果、一部のストレージターゲットが満杯になり、他のストレージターゲットは比較的空のままになる可能性があります。

`lfs migrate` コマンドを使用して、ファイルやディレクトリを満杯の OST から空きのある OST に移動します。`lfs migrate` コマンドは、ブロックモードでも非ブロックモードでも使用できます。
+ **ブロックモード**は、`lfs migrate` コマンドのデフォルトモードです。ブロックモードで実行すると、`lfs migrate` はデータの移行前にまずファイルおよびディレクトリのグループロックを取得してファイルへの変更を防ぎ、移行が完了するとロックを解除します。ブロックモードは、他のプロセスがファイルを変更できないようにすることで、これらのプロセスによって移行が中断されるのを防ぎます。このモードの欠点は、アプリケーションがファイルを変更できないようにすると、アプリケーションに遅延やエラーが発生する可能性があることです。
+ **非ブロックモード**は、`lfs migrate` コマンドで `-n` オプションを指定すると有効になります。非ブロックモードで `lfs migrate` を実行すると、他のプロセスでも移行中のファイルを変更できます。`lfs migrate` がファイルの移行を完了する前にプロセスがファイルを変更した場合、`lfs migrate` はそのファイルの移行に失敗し、ファイルは元のストライプレイアウトのままになります。

このコマンドはアプリケーションに干渉する可能性が低いため、非ブロックモードを使用することをお勧めします。

**実行するアクション**

1. 比較的大きなクライアントインスタンス (Amazon EC2 `c5n.4xlarge` インスタンスタイプなど) を起動して、ファイルシステムにマウントします。

1. 非ブロックモードスクリプトまたはブロックモードスクリプトを実行する前に、各クライアントインスタンスで次のコマンドを実行し、プロセスを高速化します。

   ```
   sudo lctl set_param 'mdc.*.max_rpcs_in_flight=60'
   sudo lctl set_param 'mdc.*.max_mod_rpcs_in_flight=59'
   ```

1. スクリーンセッションを開始し、非ブロックモードスクリプトまたはブロックモードスクリプトを実行します。スプリクト内の変数は必ず適切なものに変更してください。
   + 非ブロックモードスクリプト

     ```
     #!/bin/bash
     
     # UNCOMMENT THE FOLLOWING LINES:
     #
     # TRY_COUNT=0
     # MAX_MIGRATE_ATTEMPTS=100
     # OSTS="fsname-OST0000_UUID"
     # DIR_OR_FILE_MIGRATED="/mnt/subdir/"
     # BATCH_SIZE=10
     # PARALLEL_JOBS=16 # up to max-procs processes, set to 16 if client is c5n.4xlarge with 16 vcpu
     # LUSTRE_STRIPING_CONFIG="-E 100M -c 1 -E 10G -c 8 -E 100G -c 16 -E -1 -c 32" # should be consistent with the existing striping setup
     #
     
     if [ -z "$TRY_COUNT" -o -z "$MAX_MIGRATE_ATTEMPTS" -o -z "$OSTS" -o -z "$DIR_OR_FILE_MIGRATED" -o -z "$BATCH_SIZE" -o -z "$PARALLEL_JOBS" -o -z "$LUSTRE_STRIPING_CONFIG" ]; then
         echo "Some variables are not set."
         exit 1
     fi
     
     echo "lfs migrate starts"
     while true; do
         output=$(sudo lfs find ! -L released --ost $OSTS --print0 $DIR_OR_FILE_MIGRATED | shuf -z | /bin/xargs -0 -P $PARALLEL_JOBS -n $BATCH_SIZE sudo lfs migrate -n $LUSTRE_STRIPING_CONFIG 2>&1)
         if [[ $? -eq 0 ]]; then
             echo "lfs migrate succeeds for $DIR_OR_FILE_MIGRATED at the $TRY_COUNT attempt, exiting."
             exit 0
         elif [[ $? -eq 123 ]]; then 
             echo "WARN: Target data objects are not located on these OSTs. Skipping lfs migrate"
             exit 1
         else
             echo "lfs migrate fails for $DIR_OR_FILE_MIGRATED at the $TRY_COUNT attempt, retrying..."
             if (( ++TRY_COUNT >= MAX_MIGRATE_ATTEMPTS )); then
                 echo "WARN: Exceeds max retry attempt. Skipping lfs migrate for $DIR_OR_FILE_MIGRATED. Failed with the following error"
                 echo $output
                 exit 1
             fi
         fi
     done
     ```
   + ブロックモードスクリプト
     + `OSTS` の値を OST の値に置き換えます。
     + `nproc` に整数値を指定し、同時に実行する max-procs プロセスの数を設定します。例えば、Amazon EC2 `c5n.4xlarge` インスタンスタイプには 16 の vCPUs があるため、`nproc` には `16` (または 16 未満の値) を使用できます。
     + `mnt_dir_path` にマウントディレクトリパスを指定します。

     ```
     # find all OSTs with usage above a certain threshold; for example, greater than or equal to 85% full 
     for OST in $(lfs df -h |egrep '( 8[5-9]| 9[0-9]|100)%'|cut -d' ' -f1); do echo ${OST};done|tr '\012' ','
     
     # customer can also just pass OST values directly to OSTS variable
     OSTS='dzfevbmv-OST0000_UUID,dzfevbmv-OST0002_UUID,dzfevbmv-OST0004_UUID,dzfevbmv-OST0005_UUID,dzfevbmv-OST0006_UUID,dzfevbmv-OST0008_UUID'
     
     nproc=<Run up to max-procs processes if client is c5n.4xlarge with 16 vcpu, this value can be set to 16>
     
     mnt_dir_path=<mount dir, e.g. '/my_mnt'>
     
     lfs find ${mnt_dir_path} --ost ${OSTS}| xargs -P ${nproc} -n2 lfs migrate -E 100M -c 1 -E 10G -c 8 -E 100G -c 16 -E -1 -c 32
     ```

**Notes** (メモ)
+ ファイルシステムの読み取りパフォーマンスに影響が出ることに気付いた場合は、`ctrl-c` または k`ill -9` を使用していつでも移行を中止できます。スレッドの数を (`nproc` 値) を小さい数 (8 など) まで減らしたら、ファイルの移行を再開します。
+ `lfs migrate` コマンドを実行すると、クライアントワークロードによっても開かれているファイルで失敗します。エラーをスローして次のファイルに移動します。したがって、アクセスされているファイルがたくさんある場合、スクリプトはファイルを移行させることができず、移行の進行が非常に遅くなるという形でそれが反映される可能性があります。
+ OST の使用状況は、次のいずれかの方法でモニタリングできます。
  + クライアントマウントで、次のコマンドを実行して OST の使用状況をモニタリングし、使用率が 85% を超える OST を検索します。

    ```
    lfs df -h |egrep '( 8[5-9]| 9[1-9]|100)%'
    ```
  + Amazon CloudWatch メトリクス、`OST FreeDataStorageCapacity` をチェックし、`Minimum` をチェックします。スクリプトが 85% を超える OST を検出すると、メトリクスが 15% に近づいたとき、`ctrl-c` または `kill -9` を使用して移行を停止します。
+ また、新しいファイルが複数のストレージターゲットにストライプされるように、ファイルシステムまたはディレクトリのストライプ設定を変更することを検討することもできます。詳細については、「[ファイルシステム内のデータのストライピング](performance.md#striping-data)」を参照してください。