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:
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.
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.
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.
La excepción es la función "nocow".
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.
Usar nocow significa que btrfs no mantiene sumas de comprobación para el contenido del archivo.
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.