

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 對儲存體問題進行故障診斷
儲存體問題

在某些情況下，您可能會遇到檔案系統的儲存問題。您可以使用 `lfs`命令來疑難排解這些問題，例如 `lfs migrate`命令。

## 由於儲存目標上沒有空間而導致寫入錯誤


您可以使用 `lfs df -h`命令來檢查檔案系統的儲存用量，如中所述[檔案系統儲存配置](performance.md#storage-layout)。`filesystem_summary` 欄位會報告檔案系統儲存總用量。

如果檔案系統磁碟用量為 100%，請考慮增加檔案系統的儲存容量。如需詳細資訊，請參閱[管理儲存容量](managing-storage-capacity.md)。

如果檔案系統儲存用量不是 100%，而且您仍然收到寫入錯誤，則您寫入的檔案可能會在已滿的 OST 上分割。

**採取動作**
+ 如果您的許多 OSTs 已滿，請增加檔案系統的儲存容量。遵循 [OSTs 上的不平衡儲存](#lfs-migrate-unbalanced-storage)一節的動作，檢查 OSTs 上是否有不平衡的儲存體。
+ 如果您的 OSTs不完整，請將下列調校套用至所有用戶端執行個體，以調整用戶端的頁面緩衝區大小：

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

## OSTs 上的不平衡儲存


Amazon FSx for Lustre 會將新的檔案條紋平均分佈到 OSTs。不過，由於 I/O 模式或檔案儲存配置，您的檔案系統仍可能變得不平衡。因此，某些儲存目標可能會變滿，而其他儲存目標則會保持相對空白。

您可以使用 `lfs migrate`命令，將檔案或目錄從更多完整移至較少完整 OSTs。您可以在區塊或非區塊模式中使用 `lfs migrate`命令。
+ **封鎖模式**是 `lfs migrate`命令的預設模式。在區塊模式下執行時， `lfs migrate` 會在資料遷移之前先取得檔案和目錄的群組鎖定，以防止對檔案進行修改，然後在遷移完成時釋放鎖定。透過防止其他程序修改檔案，區塊模式可防止這些程序中斷遷移。缺點是，防止應用程式修改檔案可能會導致應用程式的延遲或錯誤。
+ 使用 `-n`選項為 `lfs migrate`命令啟用**非封鎖模式**。在`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`為 OSTs 的值。
     + 提供整數值給 `nproc`，以設定要平行執行的最大程序數目。例如，Amazon EC2 `c5n.4xlarge`執行個體類型有 16 vCPUs，因此您可以針對 使用 `16`（或值 < 16)`nproc`。
     + 在 中提供掛載目錄路徑`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
     ```

**備註**
+ 如果您注意到檔案系統讀取的效能受到影響，您可以隨時使用 `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% 的 OSTs，則當指標接近 15% 時，請使用 `ctrl-c`或 `kill -9` 停止遷移。
+ 您也可以考慮變更檔案系統或目錄的條紋組態，以便將新檔案分割到多個儲存目標。如需詳細資訊，請參閱 中的 [分割檔案系統中的資料](performance.md#striping-data)。