Esta pagina se ve mejor con JavaScript habilitado

BTRFS - Introducción al ROW uso básico y rebalanceo

 ·  🎃 kr0m

BTRFS a simple vista parece la panacea en cuanto a sistemas de ficheros se refiere, pero hay que tener varios aspectos en cuenta antes de ponerlo en producción, primero entenderemos la forma en la que se almacena la información en dicho sistema de ficheros, mostraremos como consultar el espacio disponible y como rebalancear los bloques para optimizar el espacio disponible.

Empezaremos explicando en que consiste ROW y sus consecuencias, seguiremos con las diferencias con COW, como consultar el espacio disponible y como rebalancear los datos.

ROW:

  • Cuando se escribe en un fichero, los datos nuevos se escriben en otro lugar, no en el fichero original y se marcan los bloques del fichero original como libres.
  • Si se genera un snapshot o se hace una copia de un fichero con cp --reflink=always los bloques del snapshot son los del fichero original a excepción de los cambios que se hagan que se escriben en un lugar a parte.

Si se da el primer caso con mucha frecuencia el sistema de ficheros acabará con una fragmentación interna muy elevada, dejándonos sin espacio utilizable a pesar de disponer de espacio.

En algunos casos(bases de datos especialmente) es útil deshabilitar el ROW, esto se puede hacer de dos formas distintas, a nivel de partición indicándolo en el fstab o a nivel de directorio mediante chattr:

vi /etc/fstab

nodatacow

Mediante chattr:

chattr +C /dir/file

NOTA: Si se han hecho snapshots, copias mediante --reflink=always o ya existían ficheros deshabilitar ROW con chattr no funcionará, se pueden mover los ficheros antiguos, deshabilitar ROW y volcar los datos de nuevo.

Realmente BTRFS NO es COW, es ROW:

Some people insist that Btrfs does “Redirect-on-write” rather than “Copy-on-write”
https://storageswiss.com/2016/04/01/snapshot-101-copy-on-write-vs-redirect-on-write/

La diferencia entre ROW y COW es como se almacena la versión antigua de un bloque modificado.

  • COW

    • W: El bloque original es copiado a otra ubicación y se actualiza el dato, esto implica una lectura y dos escrituras: 1R/2W.
    • R de un snapshot: Se leen los bloques originales hasta que se encuentra alguno modificado, entonces se busca la copia que se hizo al escribir y se lee.
  • ROW

    • W: Los bloques originales se dejan intactos, cuando se modifica algún bloque este se escribe en una ubicación distinta: generación de puntero.
    • R de un snapshot: Las referencias a los bloques modificados se guardan como punteros, hay que leerlos.

ROW precisa de un 1/3 de las operaciones de I/O que COW al modificar un bloque y 0 sobreacarga computacional al leer snapshots.

Con COW el rendimiento va degradándose conforme se van creando snapshots, COW suele utilizarse para realizar snapshot con un tiempo de vida muy limitado(normalmente para backups), en cambio los snapshots de ROW suelen conservarse durante mucho mas tiempo.

Espacio en disco:

Para mostrar el espacio en disco utilizado no sirve el df básico, hay que utilizar:

btrfs fi usage /mount/point

Los únicos datos útiles son:

    Device size:           1.45TiB
    Used:              38.83GiB
    Free (estimated):           1.41TiB    (min: 1.06TiB)

En free-min es por datos consumidos internamente y por fragmentación interna del FS.
La salida completa del comando es algo así:

btrfs fi usage /
Overall:
    Device size:           1.45TiB
    Device allocated:         768.04GiB
    Device unallocated:         720.84GiB
    Device missing:             0.00B
    Used:              38.83GiB
    Free (estimated):           1.41TiB    (min: 1.06TiB)
    Data ratio:                  1.00
    Metadata ratio:              1.99
    Global reserve:          48.00MiB    (used: 0.00B)

Rebalanceo:
Defragmentar requiere espacio en disco, BTRFS organiza el espacio de disco en bloques, estos bloques son de determinado tamaño, si un fichero ocupa cuatro bloques y medio está ocupando cinco, puede que otro fichero ocupe X y medio también pudiendo agrupar los medios de los dos ficheros en un único bloque, mover o no mover los datos de un bloque a otro se decide en base al espacio ocupado en dicho bloque, por ejemplo en este caso si se utiliza un 5% o menos del bloque se recoloca.

btrfs fi balance start -dusage=5 /mount/point

NOTA: Si el sistema de ficheros se compone de mas de un disco el balance además repartirá los ficheros entre ellos para que el acceso sea mas rápido.

Si te ha gustado el artículo puedes invitarme a un RedBull aquí