Проверить степень фрагментации:
xfs_db -r -c frag /dev/mapper/root-data
Запустить фрагментацию с наименьшим приоритетом:
ionice -c2 -n7 nice -n19 xfs_fsr -v -t /mnt/data
xfs_fsr -v → включён подробный вывод, чтобы видеть прогресс.
-t → «throttle», даёт паузы между операциями, чтобы другие IO могли проходить.
Скрипт анализа количества AG
#!/usr/bin/env bash set -euo pipefail MNT="${1:-}" if [ -z "$MNT" ]; then echo "Использование: $0" exit 1 fi INFO=$(xfs_info "$MNT" 2>/dev/null) || { echo "Ошибка: не удалось выполнить xfs_info на $MNT" exit 2 } # Получаем строку data (откуда берём bsize и blocks). fallback — первая строка с 'data' DATA_LINE=$(printf "%s\n" "$INFO" | awk '/^[[:space:]]*data[[:space:]]*=/ {print; exit}') if [ -z "$DATA_LINE" ]; then DATA_LINE=$(printf "%s\n" "$INFO" | grep -m1 'data' || true) fi # Парсим значения (сначала из DATA_LINE, иначе из всего INFO) BSIZE=$(printf "%s\n" "$DATA_LINE" | sed -n 's/.*bsize=\([0-9]*\).*/\1/p') TOTAL_BLOCKS=$(printf "%s\n" "$DATA_LINE" | sed -n 's/.*blocks=\([0-9]*\).*/\1/p') [ -z "$BSIZE" ] && BSIZE=$(printf "%s\n" "$INFO" | sed -n 's/.*bsize=\([0-9]*\).*/\1/p' | head -n1 || true) [ -z "$TOTAL_BLOCKS" ] && TOTAL_BLOCKS=$(printf "%s\n" "$INFO" | sed -n 's/.*blocks=\([0-9]*\).*/\1/p' | head -n1 || true) AGCOUNT=$(printf "%s\n" "$INFO" | sed -n 's/.*agcount=\([0-9]*\).*/\1/p' | head -n1 || true) AGSIZE=$(printf "%s\n" "$INFO" | sed -n 's/.*agsize=\([0-9]*\).*/\1/p' | head -n1 || true) # Проверки if [ -z "$BSIZE" ] || [ -z "$TOTAL_BLOCKS" ] || [ -z "$AGCOUNT" ] || [ -z "$AGSIZE" ]; then echo "Не удалось получить все необходимые параметры из xfs_info. Вывод xfs_info:" echo "------------" echo "$INFO" echo "------------" exit 3 fi # Арифметика (байты) AG_BYTES=$((AGSIZE * BSIZE)) TOTAL_BYTES=$((TOTAL_BLOCKS * BSIZE)) LAST_AG_BLOCKS=$((TOTAL_BLOCKS - AGSIZE * (AGCOUNT - 1))) if [ "$LAST_AG_BLOCKS" -le 0 ]; then echo "Внимание: рассчитано LAST_AG_BLOCKS=$LAST_AG_BLOCKS (<=0). Проверьте вывод xfs_info." exit 4 fi LAST_AG_BYTES=$((LAST_AG_BLOCKS * BSIZE)) # Конвертация в мегабайты с двумя знаками to_mb() { awk -v b="$1" 'BEGIN{printf("%.2f", b/1024/1024)}' } AG_MB=$(to_mb "$AG_BYTES") LAST_AG_MB=$(to_mb "$LAST_AG_BYTES") TOTAL_MB=$(to_mb "$TOTAL_BYTES") PERCENT=$(awk -v a="$LAST_AG_BYTES" -v b="$AG_BYTES" 'BEGIN{if (b==0) print "0.0"; else printf("%.1f", a/b*100)}') echo "Mountpoint: $MNT" echo "Block size: $BSIZE" echo "AG count: $AGCOUNT" printf "Normal AG: %s MB\n" "$AG_MB" printf "Last AG: %s MB (%.1f%% of normal)\n" "$LAST_AG_MB" "$PERCENT" printf "Total FS: %s MB\n" "$TOTAL_MB" if awk "BEGIN{exit !($PERCENT < 50)}"; then echo "⚠️ Warning: последний AG меньше 50% от обычного — есть риск ENOSPC при reflink/CoW." fi
admin 25 сентября, 2025
Метки: xfs