排查存储问题
在某些情况下,您可能会遇到文件系统存储问题。您可以使用 lfs
命令(例如 lfs migrate
命令)来解决这些问题。
由于存储目标上没有空间而导致写入错误
您可以使用 lfs df -h
命令检查文件系统的存储使用情况,如 文件系统存储布局 中所述。filesystem_summary
字段报告文件系统的总存储使用情况。
如果文件系统磁盘使用率为 100%,请考虑增加文件系统的存储容量。有关更多信息,请参阅 管理存储容量。
如果文件系统存储使用率非 100%,但仍然出现写入错误,则您正在写入的文件可能会在已满的 OST 上被条带化。
要采取的操作
如果多个 OST 均已满,请增加文件系统的存储容量。按照 OST 上的存储空间不平衡 部分的操作检查 OST 上的存储空间是否不平衡。
如果 OST 未满,请对所有客户端实例应用以下调整,从而调整客户端脏页缓冲区的大小:
sudo lctl set_param osc.*.max_dirty_mb=64
OST 上的存储空间不平衡
Amazon FSx for Lustre 在 OST 上均匀分配新的文件条带。但是,由于 I/O 模式或文件存储布局,您的文件系统仍可能变得不平衡。因此,有些存储目标可能已满,而另一些则相对较空。
您可以使用 lfs migrate
命令将文件或目录从较满的 OST 移动到不太满的 OST。您可以在屏蔽模式或非屏蔽模式下使用 lfs migrate
命令。
屏蔽模式是
lfs migrate
命令的默认模式。在屏蔽模式下运行时,lfs migrate
会先在数据迁移之前获取文件和目录的组锁以防止对文件进行修改,迁移完成后再释放锁。屏蔽模式可以通过阻止其他进程修改文件,防止这些进程中断迁移。缺点是,阻止应用程序修改文件可能会导致应用程序延迟或错误。带
-n
选项的lfs migrate
命令启用非屏蔽模式。在非屏蔽模式下运行lfs migrate
时,其他进程仍然可以修改正在迁移的文件。如果某个进程在lfs migrate
完成文件迁移之前对其进行了修改,则lfs migrate
将无法迁移该文件,从而使该文件保持其原始条带布局。
我们建议您使用非屏蔽模式,因为它不太可能干扰您的应用程序。
要采取的操作
-
启动一个相对较大的客户端实例(例如 Amazon EC2
c5n.4xlarge
实例类型)以挂载到文件系统。 在运行非屏蔽模式或屏蔽模式脚本之前,请先在每个客户端实例上运行以下命令以加快该进程:
sudo lctl set_param 'mdc.*.max_rpcs_in_flight=60' sudo lctl set_param 'mdc.*.max_mod_rpcs_in_flight=59'
启动屏幕会话并运行非屏蔽模式或屏蔽模式脚本。请务必在脚本中更改相应变量:
非屏蔽模式脚本:
#!/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
提供一个整数值,以设置要并行运行的最大处理进程数。例如,Amazon EC2c5n.4xlarge
实例类型有 16 个 vCPU,因此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
备注
如果您发现文件系统的读取性能受到影响,则可以随时使用
ctrl-c
或 kill -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
停止迁移。
您也可以考虑更改文件系统或目录的条带配置,以便在多个存储目标之间对新文件进行条带化处理。有关更多信息,请参阅 对文件系统中的数据进行条带化。