Как дефрагментировать файловую систему XFS, если xfs_fsr завершает работу с сообщением «улучшения не будет»?

Quería cargar una VM desde una memoria USB/msata sdd porque pensé que esto podría mejorar el rendimiento del NAS ya que los discos duros no están ocupados. En pocas palabras, el rendimiento con mi unidad USB 3 MSATA es rápido y lo suficientemente bueno para una navegación web ligera.

Estos son mis hallazgos sobre cómo hacer este (arranque de VM desde una unidad USB )en mi DS218+ y también algunas ideas adicionales sobre el rendimiento de la VM.

En primer lugar, creé una VM con Windows 7 con una interfaz de red virtio (. Puede seleccionarla en el administrador de máquinas virtuales de VM ). Windows 7 se mencionó en el foro de Synology para funcionar mejor que Win 10, así que probé con esta versión.

En la configuración de red de VM, debe hacer clic en el engranaje y seleccionar el adaptador de red virtio. Esto es importante ya que no tendrá una conexión de red más adelante. Una vez que se haya instalado la máquina, debe descargar los controladores virtio desde aquí controlador de red virtio y montar la imagen. También debe abrir el administrador de dispositivos en su invitado y actualizar el controlador de ethernet (, el controlador se encuentra en la carpeta NetKVM ).

La máquina se puede apagar cuando haya realizado los pasos anteriores y esté seguro de que utiliza la interfaz de red Redhat virtio y tiene acceso a Internet con ella.

Ahora debe iniciar una sesión SSH y hacerse root consudo -i

Como cd raíz en

cd /volume1/\@iSCSI/LUN/VDISK_BLUN/.

Aquí puede consultar los subdirectorios con

ls -allhd  */*

para todas sus máquinas virtuales y la imagen que le gustaría copiar a la memoria USB. Copie la imagen del subdirectorio con cpa la unidad raíz de su memoria USB /volumeUSB1/usbshare/.Si su unidad USB no se detecta en el NAS, puede ir al Panel de control -> Dispositivos externos para formatear la unidad como EXT4. Debe mantener una copia de seguridad de sus datos antes de formatear el dispositivo.

Después de que se haya copiado la imagen del disco virtual, debe configurar su red para enrutar el tráfico IP para la VM con:

ip tuntap add name tap0 mode tap;ifconfig tap0 up;ovs-vsctl add-port ovs_eth0 tap0

Ahora inicia qemu con:

/usr/local/bin/qemu-system-x86_64 -drive \
format=raw,file=/volumeUSB1/usbshare/vdisk.f6584cf5-6567-49c7-af33-d7f055c62bb4.a5bf8508-d623-4620-ad79-6c83cf143204.2.0_00000 \
-m 3000 -vnc :0 -mem-prealloc -mem-path /dev/virtualization/win7 -machine pc-i440fx-2.2,accel=kvm,usb=off  \
-netdev tap,ifname=tap0,script=no,id=hostnet0 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=02:11:32:25:64:a7,bus=pci.0,addr=0x3 \
-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x4 -cpu host -smp 10

En el código anterior, debe cambiar el nombre de archivo del disco virtual a su imagen. La ruta mem -también se puede actualizar a /tmp/W7 si lo desea. Ajuste el argumento -m a su memoria (Configuré 3000mb ). Cuando qemu se está ejecutando, puede ingresar con una segunda conexión y verificar con top si qemu se está ejecutando y, de ser así, cuánta memoria y CPU usa.

Finalmente, use un visor VNC para conectarse a la IP de la estación de disco en el puerto 5900 para obtener el entorno de escritorio de Windows. También recomendaría configurar un escritorio remoto en lugar de usar un cliente VNC.

Si desea volver a utilizar VMM, puede eliminar el dispositivo tap0 del puente con:

ovs-vsctl del-port ovs_eth0 tap0

En general, estoy satisfecho con el rendimiento de una memoria USB. La versión de memoria USB definitivamente es lo suficientemente buena para navegar ocasionalmente. Además, probé con mi unidad evo msata en un gabinete USB 3. Tuve la impresión de que el disco EVO funcionó un poco mejor.

1
24.02.2015, 20:38
1 ответ

Обновление

После проверки xfs _исходного кода fsr я нашел этот раздел:

/* Check if the temporary file has fewer extents */
new_nextents = getnextents(tfd);
if (dflag)
    fsrprintf(_("Temporary file has %d extents (%d in original)\n"), new_nextents, cur_nextents);
if (cur_nextents <= new_nextents) {
    if (vflag)
        fsrprintf(_("No improvement will be made (skipping): %s\n"), fname);
    free(fbuf);
    close(tfd);
    return 1; /* no change/no error */
}

Я повторно -запустил команду с флагом отладки-d(), и она вернула следующее:

xfs_fsr /dev/md1 -v -d
/mnt/disk1 start inode=0
ino=133
ino=133 extents=4 can_save=3 tmp=/mnt/disk1/.fsr/ag0/tmp23917
DEBUG: fsize=30364684107 blsz_dio=16773120 d_min=512 d_max=2147483136 pgsz=4096
Temporary file has 4 extents (4 in original)
No improvement will be made (skipping): ino=133

Это означает, что исходный файл состоит из 4 частей файла на пластинах жесткого диска, и создание нового дефрагментированного файла по-прежнему будет состоять из 4 частей файла, поэтому этот файл был пропущен. Но почему он не может их объединить? Я не знаю, поэтому спросил на kernel.org bugzilla .

Обновление 2

Я получил ответ. Поскольку моя файловая система XFS (и, вероятно, ваша )имеют размер блока 4 КБ, максимальный размер части файла не может превышать 8 ГБ , как указано в документации XFS :

.

If a file is zero bytes long, it will have no extents, di_nblocks and di_nexents will be zero. Any file with data will have at least one extent, and each extent can use from 1 to over 2 million blocks (221) on the filesystem. For a default 4KB block size filesystem, a single extent can be up to 8GB in length.

Таким образом, «улучшение не будет» означает «улучшение невозможно»;)

Оригинальный ответ

У меня та же проблема, и я обнаружил, что во многих случаях xfs _fsr пропускает дефрагментацию:

 * mandatory locks are present
 * file is marked immutable, append-only, or nodefrag
 * filesystem is shut down
 * change/modify times have been altered since defrag started
 * original file is mmapped

Если вы используете -v, xfs_fsrвозвращает номера инодов файлов, которые были пропущены:

xfs_fsr /dev/md1 -v
/mnt/disk1 start inode=0
ino=133
No improvement will be made (skipping): ino=133
ino=135
No improvement will be made (skipping): ino=135
....

С этим номером инода вы можете проверить атрибуты файла с помощью команды bmap -aизxfs_db:

xfs_db -r /dev/md3
xfs_db> inode 133
xfs_db> bmap -a
xfs_db> bmap -d
data offset 0 startblock 1314074773 (4/240332949) count 2097151 flag 0
data offset 2097151 startblock 1316171924 (4/242430100) count 2097151 flag 0
data offset 4194302 startblock 1318269075 (4/244527251) count 2097151 flag 0
data offset 6291453 startblock 1320366226 (4/246624402) count 1121800 flag 0
xfs_db> quit

Как видите, в моем случае он возвращает пустое значение, так как отсутствуют флаги атрибутов.

Затем я попытался проверить статус блокировки. Сначала мы получаем имя файла инода следующим образом:

find /mnt/disk1 -xdev -inum 133
/mnt/disk1/foo/bar.dat

А затем пытаемся получить статус блокировки:

lsof /mnt/disk1/foo/bar.dat

Поскольку результат пуст, кажется, что ничто не блокирует этот файл.

Теперь давайте проверим, был ли файл изменен с момента последней попытки дефрагментации:

ls -l /mnt/disk1/foo/bar.dat
-rw-rw-rw- 1 nobody users 30364684107 Nov 18  2019 /mnt/disk1/foo/bar.dat

Нет, выглядит все еще "старым".

3
16.08.2020, 21:55

Теги

Похожие вопросы