

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 排查存储问题
<a name="lfs-migrate-ts"></a>

在某些情况下，您可能会遇到文件系统存储问题。您可以使用 `lfs` 命令（例如 `lfs migrate` 命令）来解决这些问题。

## 由于存储目标上没有空间而导致写入错误
<a name="lfs-migrate-no-storage"></a>

您可以使用 `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
<a name="lfs-migrate-unbalanced-storage"></a>

Amazon f FSx or 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`。如果您的脚本 OSTs 发现已满85％以上，则当指标接近15％时，请使用`ctrl-c`或`kill -9`停止迁移。
+ 您也可以考虑更改文件系统或目录的条带配置，以便在多个存储目标之间对新文件进行条带化处理。有关更多信息，请参阅 [对文件系统中的数据进行条带化](performance.md#striping-data)。