¿Btrfs balance también desfragmenta archivos?

9

Cuando ejecuto btrfs filesystem balance, ¿esto desfragmenta implícitamente los archivos? Me imagino que el equilibrio simplemente reasigna cada extensión de archivo por separado, preservando la fragmentación existente.

Hay una entrada de preguntas frecuentes, "¿Qué hace el" equilibrio "? , que no está claro en este punto:

El equilibrio del sistema de archivos btrfs es una operación que simplemente toma todos los datos y metadatos en el sistema de archivos, y los reescribe en un lugar diferente en los discos, pasándolos por el algoritmo de asignación en el camino. Originalmente fue diseñado para sistemas de archivos de múltiples dispositivos, para difundir los datos de manera más uniforme entre los dispositivos (es decir, para "equilibrar" su uso). Esto es particularmente útil cuando se agregan nuevos dispositivos a un sistema de archivos casi lleno.

Debido a la forma en que funciona el equilibrio, también tiene algunos efectos secundarios útiles:

  • Si hay muchos fragmentos de datos o metadatos asignados pero no utilizados, un saldo puede reclamar parte de ese espacio asignado. Esta es la razón principal para ejecutar un equilibrio en un sistema de archivos de un solo dispositivo.
  • En un sistema de archivos con replicación dañada (por ejemplo, un RAID-1 FS con un disco muerto y eliminado), forzará al FS a reconstruir la copia faltante de los datos en uno de los dispositivos actualmente activos, restaurando la capacidad RAID-1 del sistema de archivos
pauldoo
fuente

Respuestas:

9

TL; DR

La función de desfragmentación de Btrfs es específica para corregir la fragmentación en los metadatos de la carpeta y el contenido del archivo, mientras que la función de equilibrio se creó para " equilibrar " (de ahí el nombre) la cantidad de datos compartidos entre unidades cada vez que se agrega o elimina una unidad. Si bien tienen cierta superposición teórica en lo que hacen, no están directamente relacionados, por lo tanto, la documentación no vincula las dos características.

Respuesta detallada a continuación. Tenga en cuenta, por supuesto, que mi respuesta larga es con la esperanza de que ayude a otros que no tienen el contexto completo de los problemas enfrentados.


Asignación de trozos

Un concepto importante con btrfs es la asignación de fragmentos. Cuando escribe datos en btrfs, escribe esos datos en un fragmento "actual", generalmente de 1 GB de tamaño 1 . Si el fragmento "actual" se llena, asigna un fragmento nuevo. Si se vacía un fragmento existente, su espacio de almacenamiento está disponible para reasignación cuando se necesita un nuevo fragmento.

Si el sistema de archivos está utilizando más de una unidad con los perfiles de almacenamiento "dup", "single" o "raid1" , el asignador de fragmentos siempre prefiere colocar el siguiente fragmento nuevo en las unidades con la mayor cantidad de espacio libre disponible. Esto asegura, en general, que las unidades se utilizan por igual.


Cómo el equilibrio hace lo suyo

La función de equilibrio funciona tomando fragmentos de datos existentes y reescribiéndolos en el fragmento "actual". Cuando un fragmento existente se vacía de esta manera, se pone automáticamente a disposición del asignador. Si el fragmento existente que se estaba vaciando no estaba lleno para empezar (tal vez se eliminaron los datos antiguos en el fragmento), el resultado neto es la liberación del espacio en disco ya que el fragmento más nuevo está "más apretado" con datos relevantes.

Esta es la parte que, en teoría, podría usarse como parte de una estrategia de des-fragmentación , que creo es la razón por la que muchas personas suponen que ya lo hace. Sin embargo, por supuesto, la función de equilibrio se creó con un propósito específico en mente, por lo que no analiza el contenido del archivo. Que sólo se comprueba si los datos o no se está llevando a cabo de los trozos existentes es relevante 2 antes de copiar los datos al nuevo trozo.

¿Dónde entra la parte Balance ?

Cuando agrega una nueva unidad al sistema de archivos, el asignador al principio tenderá a escribir todos los datos nuevos en la nueva unidad, principalmente porque tiene más espacio libre disponible que las unidades existentes. Al volver a escribir todos los fragmentos, todos los fragmentos inicialmente equilibrados se escriben solo en la nueva unidad. Una vez que se haya ecualizado (se haya equilibrado), el resto de los datos se reasignarán por igual entre las unidades.

Escenario de equilibrio típico:

Tengo 2 unidades de 500 GB con 240 GB en cada una; Agrego otra unidad de 500GB. Normalmente tendría:

  • conducir a: 240 GB utilizados
  • unidad b: 240 GB utilizados
  • unidad c: 0 GB utilizados

Comienzo un balance de todos los datos. Aproximadamente una cuarta parte del balance, es probable que vea una situación similar a la siguiente:

  • conducir a: 180GB usado
  • unidad b: 180 GB utilizados
  • unidad c: 120 GB utilizados

Aproximadamente la marca de un tercio, parece estar equilibrada:

  • conducir un: 160GB usado
  • unidad b: 160 GB utilizados
  • unidad c: 160 GB utilizados

Por supuesto, puede detener la operación de equilibrio en este punto, aunque hay razones (buenas y malas) por las que es posible que desee dejar que termine 3 .


Cómo ocurre la fragmentación en btrfs

Btrfs es una vaca ( Copia de escritura ) del sistema de archivos, lo que significa que los datos es no sobre-escrito 4 . Si tiene un archivo existente de 100 MB y sobrescribe una porción de 1 MB del archivo, esa porción de 1 MB no se escribe sobre los datos existentes en la unidad. En cambio, está escrito en otra parte del fragmento "actual". Btrfs realiza un seguimiento de dónde se almacenan estos "fragmentos" de datos nuevos. Esto es muy útil para mantener instantáneas de los datos, ya que significa que los datos antiguos se conservan de forma predeterminada. Debido a que los SSD, de una manera muy similar, tampoco sobrescriben los datos, este mecanismo CoW se presta bien para permitir que los SSD mantengan su vida útil y rendimiento.

Donde entra la desfragmentación

Independientemente de las ventajas, algunos archivos se sobrescriben con mucha frecuencia (generalmente archivos de base de datos), por lo que terminan teniendo cientos de estos fragmentos. Con los SSD, hay poca penalización de rendimiento a corto plazo. Pero con las unidades de husillo, la penalización de rendimiento es severa.

Una solución, por supuesto, es utilizar la función de desfragmentación de btrfs. La operación de desfragmentación reescribe el contenido del archivo en el fragmento actual en el orden lógico de su estado actual, reduciendo así los fragmentos en un gran conjunto de datos de 100 MB en lugar de numerosas piezas separadas.

Una solución alternativa sería utilizar la función "nocow" específicamente para archivos como este. La función nocow hace que el archivo se sobrescriba en su lugar. Tenga en cuenta que hay advertencias a nocow 5 6 .


Resumen de nuevo

  • La balanza analiza fragmentos y franjas, y en realidad no conoce el contenido del archivo, excepto si los datos en esos fragmentos siguen siendo relevantes o no.

  • La operación de desfragmentación analiza los datos de la carpeta y el contenido del archivo individual y reescribe los datos de la manera más contigua posible. El inconveniente es con las instantáneas donde la desfragmentación causa duplicación y uso adicional de la unidad.


Notas:

  1. Aunque los trozos suelen tener un tamaño de 1 GB, pueden ser más grandes o más pequeños. Cuando se usan tipos de incursión, los fragmentos generalmente se dividen en varias unidades en múltiplos de 1 GB. Por ejemplo, 5 unidades con raid0 generalmente dan como resultado una franja de 5 GB que consta de fragmentos de 1 GB que se escriben en cada unidad.

  2. Btrfs usa "referencias" al contenido del archivo. Cuando se sobrescribe parte de un archivo, el sistema de archivos en vivo "hace referencia" a la ubicación donde se escribieron esos datos. Sin embargo, una instantánea aún podría "hacer referencia" a la ubicación anterior. Si no hay una instantánea, o si se elimina la instantánea anterior, esto no genera referencias "de referencia" que se refieran al contenido sobrescrito original. Este contenido se considera irrelevante y no se copiará con los otros datos relevantes en la operación de la balanza.

  3. En este punto, en el supuesto de almacenamiento está utilizando el sencillo perfil "single" 7 , la primera de 160 GB equilibrado que todo ser movido a la nueva unidad - pero también en este punto, todavía tiene cerca de 320 GB balance izquierda. El resto se equilibraría por igual en todos los discos. Con los husillos, lo ideal sería equilibrar solo 160 fragmentos antes de que btrfs reequilibre las 3 unidades para una mejor "difusión" de los datos. Con los SSD, intentar mantener una "difusión" uniforme de datos se vuelve muy complicado, probablemente inútil y mucho más probable que sea muy malo para la vida útil del SSD.

  4. La excepción es la función "nocow".

  5. Si hay instantáneas, la desfragmentación del archivo "en vivo" hace que las instantáneas y el archivo "en vivo" hagan referencia a ubicaciones de datos divergentes en el disco, haciendo que los datos se dupliquen y, por lo tanto, ocupen espacio en disco adicional. Cuando una función de desduplicación de uso general esté disponible, esto no será un gran problema.

  6. Usar nocow significa que btrfs no mantiene sumas de comprobación para el contenido del archivo.

  7. Con la mayoría de los tipos de incursiones (la incursión1 es la excepción), "propagarse" a través de las unidades es discutible ya que las franjas generalmente se escriben en todas las unidades de todos modos.

zaTricky
fuente
Wow, gran respuesta. Veo que hay una grave escasez de información relevante para el usuario de BTRFS, en libros o similares (a diferencia de ZFS) que parece contribuir a su mala reputación. ¿Tienes un blog o más cosas buenas como esta?
Andrew Keech
1
¡Gracias! Realmente debería traer más contenido actualizado allí. : - | Falta mucho tiempo: dogma.swiftspirit.co.za
zaTricky
6

Tal vez mirar el código fuente del comando podría ayudar

Preferir btrfs balance start

El comando 'btrfs filesystem balance' está en desuso, utilice el comando 'btrfs balance start' en su lugar.

Y luego en la cadena de comando

"btrfs [filesystem] balance start [options] <path>",
"Balance chunks across the devices",
"Balance and/or convert (change allocation profile of) chunks that",
"passed all filters in a comma-separated list of filters for a",
"particular chunk type.  If filter list is not given balance all",
"chunks of that type.  In case none of the -d, -m or -s options is",
"given balance all chunks in a filesystem."

Podría darle un segundo vistazo, pero no puedo ver ninguna referencia para desfragmentar en las estructuras ni las llamadas ioctl (). Entonces no hay desfragmentación explícita.

Todo lo que hace es copiar de un lugar a otro y usar el asignador predeterminado en el proceso. Tomado de aquí

Dependiendo de la asignación de propósito y del modo de asignación, el algoritmo busca directamente una extensión continua de espacio libre en cada grupo de asignación adecuado (un grupo en btrfs corresponde a un fragmento descrito anteriormente

Por lo tanto, según el modo de asignación, el espacio libre en el dispositivo, etc., puede decir que btrfs se asignará de tal manera que no sea necesaria la desfragmentación. Que podría considerar una forma de desfragmentación implícita.

HTH

usuario
fuente
3

El equilibrio funciona a nivel de trozos; los fragmentos son cómo Btrfs implementa la redundancia de incursiones. No hace nada en el nivel Btree y no desfragmenta.

Gabriel
fuente
0

En caso de que use medios con alta latencia de acceso, la fragmentación siempre cuenta, independientemente del sistema de archivos utilizado. Una búsqueda sigue siendo una búsqueda, pediod.

usuario203842
fuente
3
A menos que esté accediendo a los datos desde la unidad SSD, no significa nada en absoluto.
Matt
1
Eso no responde la pregunta.
Karl Richter
-2

La desfragmentación está sobrevalorada. Claro, en un FAT16, hace una diferencia real, pero no en nada moderno, en la mayoría de los casos. Efectivamente, el reequilibrio mejorará la organización de su sistema de archivos y los archivos estarán menos fragmentados.

Ronald Pottol
fuente
66
La fragmentación no es realmente un problema para ext2 / 3/4, xfs, jfs, etc., pero puede ser un problema importante para btrfs. Consulte btrfs.wiki.kernel.org/index.php/Gotchas, que dice "Los archivos con muchas escrituras aleatorias pueden fragmentarse mucho (más de 10000 extensiones) causando la destrucción de discos duros y picos excesivos de varios segundos de carga de CPU en sistemas con un SSD o gran cantidad de RAM ". Eso no es una exageración, incluso para casos de uso común (archivos descargados con bittorrent, bases de datos sqlite, etc.).
nemequ
2
La desfragmentación puede hacer una gran diferencia incluso con sistemas de archivos más modernos, especialmente una vez que la unidad comienza a llenarse en un HDD convencional. Algunos sistemas de archivos lo manejan mejor que otros y algunos tipos de archivos son mucho peores que otros. El espacio flojo, los escenarios imposibles de optimizar, los cachés de lectura / escritura, la lectura anticipada, la optimización de aplicaciones, etc., tienden a ocultar mucho de esto. En su mayor parte, las personas no tienen que preocuparse por eso y solo deberían preocuparse si realmente tienen un problema grave que podría ser causado por la fragmentación.
jgmjgm