Esta web utiliza cookies, puedes ver nuestra política de cookies, aquí Si continuas navegando estás aceptándola

ARC, L2ARC y ZIL en ZFS


La mayoría de SOs actuales no vuelcan los datos al disco duro de forma inmediata, si no que los acumulan un cierto tiempo en RAM para servolcados a disco, este proceso es llevado a cabo de forma transparente para las aplicaciones, esto conlleva un riesgo ya que la RAM es volátil, si el equipo es apagado de forma abrupta estos datos se perderán.

Hay varias razones que justifican dicho comportamiento:

  • Evitamos el acceso a disco para ficheros temporales: ficheros creados, modificados, leídos y borrados de forma muy rápida(ficheros de intercambio entre programas).
  • Colapsar muchas escrituras cortas en una larga y eficiente, en discos duros tradicionales(no SSD) aumenta significativamente el rendimiento.
  • Planificar con detalle la asignación de posiciones de los datos en el disco duro(menos fragmentación externa).

ZFS utiliza dos niveles de caché para lecturas:

  • ARC: Cacheo realizado en RAM

  • L2ARC: Cacheo realizado en un segundo disco mas rápido, SSD, ... se trata de una cache mas lenta que la primaria(ARC), los datos en sí se almacenan en el SSD pero en RAM tendremos una referencia al dato, por lo tanto seguiremos consumiendo algo de RAM, una mínima parte pero algo.

Algunas consideraciones a tener en cuenta:

  • Tras un reinicio los datos siguen en el disco pero las referencias en RAM se habrán perdido por lo tanto estos datos nos son inútiles.
  • El proceso encargado de almacenar los datos en L2ARC lo que hace es mirar la parte mas baja de los objetos almacenados en ARC(los que serán eliminados de RAM en breve) y los copia a L2ARC.
  • La regla habitual es que 100GB de L2ARC ocupan 1-2GB de RAM real(por el tema de las referencias).
  • La información cifrada NUNCA pasa por un L2ARC ya que se considera RAM y los datos en RAM no se cifran, pero además se guardarían los datos descifrados en un soporte no volátil por lo que supondría una brecha de seguridad.

Podemos consultar las estadísticas de ARC y L2ARC con:

cat /proc/spl/kstat/zfs/arcstats

En un sistema sin L2ARC podemos ver que no tiene hits:

        l2_hits                         0
        l2_misses                       5398

Configuramos un RAID1 por ejemplo con un L2ARC:

zpool create tank mirror vdd vde cache vdf
zpool status
    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        vdd1    ONLINE       0     0     0
        vde1    ONLINE       0     0     0
    cache
      vdf1      ONLINE       0     0     0

Si queremos añadir L2ARC a un pool existente:

zpool create tank mirror vdd vde
zpool status
    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        vdd1    ONLINE       0     0     0
        vde1    ONLINE       0     0     0

zpool add tank cache vdf
zpool status

    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        vdd1    ONLINE       0     0     0
        vde1    ONLINE       0     0     0
    cache
      vdf1      ONLINE       0     0     0
cat /proc/spl/kstat/zfs/arcstats
        l2_hits                         39
        l2_misses                       13451

Las escrituras en ZFS tienen un solo sistema de cacheo:

ZIL (ZFS Intention Log): Hay ocasiones en las que no nos podemos permitir tener datos críticos en RAM hasta que sean volcados al disco, aquí es donde entra en juego un dispositivo ZIL, este deberá ser mas rápido que el disco principal y se utilizará para las escrituras de datos críticos, estas se realizarán(simultáneamente) de forma síncrona en el ZIL y de forma asíncrona al disco pasando primero por RAM. Si se apagase el equipo de forma abrupta se comprueba que los datos del ZIL estén volcados al disco en caso de no ser así se vuelcan del ZIL al disco y no se pierde ningún dato crítico.

  • En caso de no configurar un ZIL se estará utilizando una parte del zpool como ZIL
  • Si tenemos un ZIL defectuoso y no lo sabemos cuando reiniciemos correremos el riesgo de perder datos críticos, para evitar esto podemos montar un RAID1 de los ZILs además de tener duplicada la información nos proporcionará autocorreción en el disco dañado, las escrituras serán un poco mas lentas ya que se debe escribir en ambos discos pero ganaremos en tranquilidad.
  • Si tenemos un zpool con un ZIL defectuoso no podremos importarlo, pero podemos descartar la info del ZIL y forzar mediante la opción -f
  • Si el ZIL falla ZFS lo detectará y pasará a utilizar el ZIL del zpool de forma automática.
  • En este caso SI que se puede utilizar ZIL para almacenar datos cifrados ya que antes de volcarlos al ZIL se cifran.
  • Si el tamaño de una escritura síncrona es mayor que el tamaño del ZIL se pasará a utilizar el ZIL del zpool solo para esa escritura en concreto.

Voy a crear un pool con cache y ZIL espejado:

zpool create tank vdd cache vde log mirror vdf vdg
zpool status
        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          vdd1      ONLINE       0     0     0
        logs
          mirror-1  ONLINE       0     0     0
            vdf1    ONLINE       0     0     0
            vdg1    ONLINE       0     0     0
        cache
          vde1      ONLINE       0     0     0

Para hacer las pruebas voy a utilizar un script que saca las transacciones por segundo:

cd /tank
wget www.alfaexploit.com/uploads/files/tps.py
python tps.py

Si lo preferimos podemos crear el pool sin ZIL, hacer las pruebas y luego añadir el ZIL:

zpool create tank vdd cache vde
cd /tank
wget www.alfaexploit.com/uploads/files/tps.py
python tps.py
zpool add tank log mirror vdf vdg
python tps.py

Bueno espero que haya quedado claro el funcionamiento de ARC, L2ARC y ZIL


Autor: Kr0m -- 12/03/2015 21:03:32