

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

# 将文件预加载到文件系统
<a name="preload-file-contents-hsm-dra"></a>

您可以选择性地将单个文件或目录的内容预加载到文件系统中。

## 使用 HSM 命令导入文件
<a name="preload-hsm"></a>

首次访问文件时，Amazon 会从您的 Amazon S3 数据存储库中 FSx 复制数据。由于这种方法，文件的初始读取或写入会导致少量延迟。如果您的应用程序对这种延迟很敏感，并且您知道应用程序需要访问哪些文件或目录，您可以选择性预加载单个文件或目录的内容。您可以使用 `hsm_restore` 命令完成此操作，如下所示。

您可以使用 `hsm_action` 命令（随 `lfs` 用户实用程序发出），验证文件内容是否已加载到文件系统。返回值 `NOOP` 表示文件已成功加载。从挂载文件系统的计算实例中运行以下命令。*path/to/file*替换为要预加载到文件系统的文件路径。

```
sudo lfs hsm_restore path/to/file
sudo lfs hsm_action path/to/file
```

您可以使用以下命令预加载整个文件系统或文件系统中的整个目录。（尾部 & 符号使命令作为后台进程运行。） 如果您请求同时预加载多个文件，Amazon 会并行 FSx 加载您的 Amazon S3 数据存储库中的文件。如果文件已经加载到文件系统，则 `hsm_restore` 命令不会重新加载它。

```
nohup find local/directory -type f -print0 | xargs -0 -n 1 -P 8 sudo lfs hsm_restore &
```

**注意**  
如果链接的 S3 桶大于文件系统，您应该能将所有文件元数据导入文件系统。但是，您只能加载文件系统的剩余存储空间所能容纳的实际文件数据。如果在文件系统上没有剩余存储空间的情况下尝试访问文件数据，您会收到错误消息。如果发生这种情况，您可以根据需要增加存储容量。有关更多信息，请参阅 [管理存储容量](managing-storage-capacity.md)。

## 验证步骤
<a name="preload-validation"></a>

您可以运行以下列出的 bash 脚本，以帮助您发现处于已归档（已释放）状态的文件或对象数量。

为提升脚本的性能，尤其是在包含大量文件的文件系统中，CPU 线程会根据 `/proc/cpuproc` 文件自动确定。也就是说，使用 vCPU 数量更高的 Amazon EC2 实例，性能将得到提升。

1. 设置 bash 脚本。

   ```
   #!/bin/bash
   
   # Check if a directory argument is provided
   if [ $# -ne 1 ]; then
       echo "Usage: $0 /path/to/lustre/mount"
       exit 1
   fi
   
   # Set the root directory from the argument
   ROOT_DIR="$1"
   
   # Check if the provided directory exists
   if [ ! -d "$ROOT_DIR" ]; then
       echo "Error: Directory $ROOT_DIR does not exist."
       exit 1
   fi
   
   # Automatically detect number of CPUs and set threads
   if command -v nproc &> /dev/null; then
       THREADS=$(nproc)
   elif [ -f /proc/cpuinfo ]; then
       THREADS=$(grep -c ^processor /proc/cpuinfo)
   else
       echo "Unable to determine number of CPUs. Defaulting to 1 thread."
       THREADS=1
   fi
   
   # Output file
   OUTPUT_FILE="released_objects_$(date +%Y%m%d_%H%M%S).txt"
   
   echo "Searching in $ROOT_DIR for all released objects using $THREADS threads"
   echo "This may take a while depending on the size of the filesystem..."
   
   # Find all released files in the specified lustre directory using parallel
   # If you  get false positives for file names/paths that include the word 'released',
   # you can grep 'released exists archived' instead of just 'released'
   time sudo lfs find "$ROOT_DIR" -type f | \
   parallel --will-cite -j "$THREADS" -n 1000 "sudo lfs hsm_state {} | grep released" > "$OUTPUT_FILE"
   
   echo "Search complete. Released objects are listed in $OUTPUT_FILE"
   echo "Total number of released objects: $(wc -l <"$OUTPUT_FILE")"
   ```

1. 使脚本成为可执行文件：

   ```
   $ chmod +x find_lustre_released_files.sh
   ```

1. 运行脚本，如以下示例所示：

   ```
   $ ./find_lustre_released_files.sh /fsxl/sample
   Searching in /fsxl/sample for all released objects using 16 threads
   This may take a while depending on the size of the filesystem...
   real 0m9.906s
   user 0m1.502s
   sys 0m5.653s
   Search complete. Released objects are listed in released_objects_20241121_184537.txt
   Total number of released objects: 30000
   ```

如果存在已释放的对象，则对所需目录执行批量恢复，以便将文件从 S3 导入 FSx For Lustre，如下例所示：

```
$ DIR=/path/to/lustre/mount
$ nohup find $DIR -type f -print0 | xargs -0 -n 1 -P 8 sudo lfs hsm_restore &
```

请注意，如果存在数百万个文件，则 `hsm_restore` 需要较长时间。