03 ago

LXC integrado con ZFS

Sin títuloNunca trabajé muy seriamente con lxc hasta ahora, total que estuve mirando para aprender sobre el tema y resulta que sacaron lxc 1.0.3, con un monton de cosas muy molonas, entre ellas la posibilidad de que se integre con sistemas de ficheros, desconozco si las versiones anteriores ya podían hacer, yo parto de la 1.0.3 y todo lo anterior esta obsoleto :).

Total que esta integración la tiene con bastantes sistemas, pero me pareció muy interesante dos de ellos btrfs (que también empece a trabajar con el y me parece muy interesante) y por supuesto zfs. Así que no hay mejor forma de entender que leer y después probar.

 

Este post me centrare en hacer trabajar lxc con zfs de forma celestial .

Pues venga al lío que se nos va el Domingo.

Instalación de LXC y ZFS

Primero de todo instalaremos lxc y zfs, la parte de zfs la podéis encontrar explicada en en Instalar OpenZFS en LINUX

[email protected]:~# apt-get install ubuntu-zfs lxc

En mi caso la máquina tiene un disco principal de 8GB y vamos añadir dos más de 10GB cada uno, para poder hacer raidz-1 con zfs, y allí es donde montaremos nuestros lxc,  lo haremos en dos partes, primero zfs.

Los discos que tenemos son los siguientes.

ZFS

Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sdb doesn't contain a valid partition table

Disk /dev/sdc: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Haremos el pool con los dos de 10GB, sdb y sdc

[email protected]:~# zpool create -f containers raidz /dev/sdb /dev/sdc

[email protected]:~# df -h

containers      9.8G     0  9.8G   0% /containers

Pues ya tenemos el sitio donde meter los containers, ahora a por lxc

LXC

Primero de todo tenemos que decirle a lxc que coloque los containers en el pool de zfs, lo haremos con dos directivas en el fichero

vim /etc/lxc/lxc.conf
lxc.lxcpath = /containers/lxc
lxc.bdev.zfs.root = /containers/lxc

lxc.lxcpath -> Path donde estarán todos los container

lxc.bdev.zfs.root -> Nombre por defecto del zfs root

Deberemos crear el directorio lxc dentro del pool containers,  sino mal asunto.

[email protected]:~# zfs create containers/lxc

[email protected]:~# df -h

containers             9.8G 128K 9.8G  1%     /containers
containers/lxc    9.8G 128K 9.8G  1%    /containers/lxc

Y con esto ya tenemos el entorno montado, ahora es el momento de probar!

LXC más ZFS

Vamos a crear un container de forma normal, pero le daremos la opción -B zfs, es el valor predeterminado del directorio, pero si asignamos zfs o btrfs o lvm, lo que nos debería hacer es que el sistema de ficheros sea zfs y nos generara un nuevo volumen por contenedor y –zfsroot donde le diremos donde esta el container.

[email protected]:~# lxc-create -t ubuntu -n test -B zfs --zfsroot containers/lxc

Como es el primer container, esta descargando la imagen y eso lleva un ratillo… una vez termine nos dice este mensaje que es muy interesante y útil.

##
# The default user is 'ubuntu' with password 'ubuntu'!
# Use the 'sudo' command to run tasks as root in the container.
##

Pues vamos a ver como quedo la situación

[email protected]:~# zfs list
NAME                 USED AVAIL REFER MOUNTPOINT
containers           318M 9.47G 31K /containers
containers/lxc       318M  9.47G 34K /containers/lxc
containers/lxc/test  318M 9.47G 318M /containers/lxc/test/rootfs

Ahí lo tenemos test esta listo para arrancar, no la hagamos esperar mas.

lxc-start --name test

Y ya tenemos el tema andando, ahora por último lo que vamos hacer es sacarle un poco de jugo al zfs, que para eso lo hemos montado, vamos a jugar con la compresión, deduplicacion y snapshots.

Tenemos más detalle de los mismos en post anteriores, así que aquí vamos a ir al lío directamente.

Deduplicacion y compresion

Snapshots

Compresion, deduplicacion y snapshots

zfs set dedup=on containers

zfs set compression=lz4 containers

zpool set listsnapshots=on containers

La compresión en lz4 que es lo que se lleva ahora ;).

Comprobamos que este todo activado.

[email protected]:~# zfs get compression
NAME                PROPERTY    VALUE SOURCE
containers          compression lz4   local
containers/lxc      compression lz4   inherited from containers
containers/lxc/test compression lz4   inherited from containers
[email protected]:~# zfs get dedup
NAME                 PROPERTY VALUE SOURCE
containers           dedup on local
containers/lxc       dedup on inherited from containers
containers/lxc/test  dedup on inherited from containers

Pues venga a jugar!!!

Vamos a crear otro container a ver como se comporta la deduplicacion y la compresion.

lxc-create -t ubuntu -n test2 -B zfs --zfsroot containers/lxc

Una vez creado si comprobamos nos llevaremos una sorpresa

[email protected]:~# zfs get compressratio

containers/lxc/test compressratio 1.00x -
containers/lxc/test2 compressratio 2.10x -

[email protected]:~# zpool list

containers 19.9G 947M 19.0G 4% 1.01x ONLINE -

Uno de los containers esta comprimido pero el otro no, y aún por encima no aplico nada de deduplicacion :(, esto es sencillamente porque hemos aplicado esas características después de crear “test”, así que hay que tenerlo en cuenta.

Vamos hacer un snapshot y crear un nuevo container, ahí si que veremos que la deduplicacion surge efecto.

Creamos el snapshot.

[email protected]:~# zfs snapshot [email protected]
[email protected]:~# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
[email protected] 0 - 31K -

Creamos test3

lxc-create -t ubuntu -n test3 -B zfs --zfsroot containers/lxc

Y comprobamos

[email protected]:~# zpool list
containers 19.9G 962M 18.9G 4% 2.02x ONLINE -

Ahora si, tenemos test2 y test3 ocupando como si solo fuera 1 a más a más como están comprimidos el tamaño es inferior respecto test1

containers/lxc/test  319M  4% /containers/lxc/test/rootfs
containers/lxc/test2 153M  2% /containers/lxc/test2/rootfs

Por ultimo los snapshots, como habeis visto hemos realizado un snapshot con zfs, pues otra de las cosas molonas que trae esta version de lxc es que puede controlar los snapshots de zfs, btrfs, lo podemos comprobar haciendo.

[email protected]:~# lxc-snapshot -n test3 -L
snap0 (/containers/lxcsnaps/test3) 2014:08:02 04:53:18
snap1 (/containers/lxcsnaps/test3) 2014:08:02 04:53:33

Ahí los tenemos :)

Podemos crear snapshot de zfs directamente de lxc en un container especifico.

[email protected]:~# lxc-snapshot -n test2
could not find any snapshots to destroy; check snapshot names.

[email protected]:~# zfs list -t snapshot -o name,creation
NAME CREATION
containers/lxc/[email protected] Sat Aug 2 4:58 2014

Lo lanzamos con lxc y lo comprobamos con zfs, al revés que en el caso anterior, parece que si que se entienden(que era el objetivo del post :) )

Pues ya tenemos el sistema montado…

Ale a desfrutarlo!

09 dic

Instalar OpenZFS en LINUX

20131209-084324.jpgParece ser que tenemos una versión estable de openZFS, así que como es un tema que me gusta bastante, pues os voy a explicar como instalarlo en Linux y comprobar su funcionamiento, si queréis saber cosas mas a fondo de ZFS, pues pasaros por los artículos anteriores:

  1. Tipos de caches en ZFS
  2. Comandos zpool
  3. Optimización de ZFS

Situación

  1. Esta disponible para los kernels Linux 2.6.26 – 3.11.
  2. No se recomienda instalarlo en sistemas de 32bits
  3. Mínimo 2GB de RAM, si queréis utilizar deduplicacion o compresión, bueno entonces pensar en poner una cuanta más.. os podéis hacer a la idea en los post que comento mas arriba.

Por qué sale OpenZFS?

  1. Oracle registró el nombre ZFS como marca comercial complicando su uso (MAL)
  2. Sale OpenZFS como proyecto “protesta” open source del proyecto ZFS de SUN, por los problemas con Oracle. (BIEN)
  3. Uno de los lideres es Matt Ahrens, co-fundador del proyecto ZFS (BIEN)
  4. La idea es unificar el desarrollo en FreeBSD, Linux, Mac OS X, and illumos (BIEN)
  5. 3 BIEN – 1 MAL así que vamos a explicarlo.

Nosotros lo vamos a montar en un Ubuntu server 13.10.

Creación

Primero de todo añadiremos los el ppa para bajarnos los paquetes:

sudo add-apt-repository ppa:zfs-native/stable

Deberemos instalar lo siguiente

apt-get install zfs-dkms parted mountall spl-dkms spl ubuntu-zfs zfsutils

Una vez finalice hacemos un reboot y listos ya tenemos zfs en linux (sin fuse)

Ahora que lo tenemos vamos a probar algunas de las cosas que dicen que hace…. :)

Creación de RAID Z

Añadir un par de discos y montamos, por ejemplo un Raid Z mirror

Disco /dev/sdb: 8589 MB, 8589934592 bytes
Disco /dev/sdc: 8589 MB, 8589934592 bytes

 

[email protected]:~# zpool create -f storage raidz /dev/sdb /dev/sdc
[email protected]:~# df -h

S.ficheros Tamaño Usados Disp Uso% Montado en
storage 7,9G 0 7,9G 0% /storage

Como bien sabemos así  de sencillo se crea un RAID, si queréis algo mas complejo, pues lo dicho a los post anteriores.

Forzar un error de disco

Ahora lo que vamos a probar es quitar un disco mientras escribimos en el otro…  hice un gif para que se vea que no se pierde escritura.
En el gif podéis ver 4 pantallas que os explico en la siguiente imagen.

teste mirror 1
Y en el gif, el casque

mirror1_fail

En el recuadro de abajo a la izquierda vemos como se esta lanzando un dd, vemos la tasa de escritura en el de la derecha, y arriba como quitamos el disco del pool lo añadimos y empezamos a ver como se resincroniza, para cubrirnos un poco ante un fallo de disco, podemos añadir otro en spare

Añadir disco en SPARE

zpool add -f storage spare /dev/sdd

diskspare

Fallo de disco, con un disco spare

Por defecto, el spare entra en funcionamiento automáticamente en el caso que tener un fallo de uno de los dos del mirror, pero como no puedo quitar el disco a lo burro, pues vamos hacer la emulación, a más que así también aprendemos como se hace manualmente, que ha veces lo automático deja de ser lo.

  • Ponemos uno de los discos del mirror en offline.
zpool offline storage sdc

fail online disk

Ahora de forma manual le vamos a decir que remplace el disco “roto” por el spare.

  • Remplazo del disco por el spare.
 zpool replace storage sdc sd

Y veremos
remplazo

Si nos fijamos en el disco sdd a pasado a estar dentro del pool y estado ONLINE, esto que quiere decir, pues que aun que tengamos el sdc OFFLINE, el sdd ya esta recibiendo peticiones y forma parte del RAID

Aquí se ve claramente

spareonlineEn este punto tenemos dos caminos o volvemos a poner el disco sdc ONLINE o lo eliminamos, de tal manera que el sdd pasara a formar parte de el pool en la misma situación que el sdc cuando funcionaba, pues probamos los dos casos!

  • Ponemos el sdc en ONLINE
zpool online storage sdc

Ahora lo que pasará es que tendremos el sdc y el sdd como discos spare asociados a ese pool, pero estando los 3 activos, si nos fijamos hemos pasado de tener un disco spare disponible a activo, cuando este esta activo queda asociado al pool en el cual empezó a trabajar, cuando nosotros hicimos el replace lo asociamos al pool de storage, entonces cuando ponemos el sdc ONLINE, lo que tendremos es lo siguiente.

todoonlineFijaros como el sdc paso a estar en uso, en la imagen anterior cuando lo añadimos estaba en disponible.

todoonline

Ahora hacemos escrituras veremos como los 3 están escribiendo.

todosescribiendoPERO! Cuantos utilizaremos si leemos?

Pues dos, los dos que están activos realmente, para atender a todas las peticiones.
lectura

  • Dejar todo como estaba

Vale, bueno ahora lo que nos interesa es volver a dejar un disco en spare, disponible para todos los pools que tengamos, el sdd como nuevo disco dentro del raidz, o sea todo tal y como estaba, la verdad es que no se si es la mejor forma, pero no encontré otra mejor… tendremos que  ponerlo offline y hacer el detach

zpool offline storage sdc
zpool detach storage sdc

Y todo volverá a la normalidad, pero teniendo el RAID montado con el sdb y el sdd en vez de con el sdb y el sdc, que este ahora será spare disponible para todos los pools

normalidad

Si llegados a este punto estamos convencidos de que vamos a utilziar zfs, pues lo que nos gustará hacer es que cuando arranque nos monte el pool. para eso deberemos hacer dos cosas:

Editar

vim /etc/default/zfs

ZFS_MOUNT='yes'

ZFS_UNMOUNT='yes'

Y os preguntareis que linea hay que meter en el fstab?, pues ninguna ya que el demonio zfs se encarga de montar el pool que tenemos configurado al arrancar, esto lo hace partiendo de la información del fichero zpool.cache (fichero importante) y se crea cuando creamos el pool o podemos recrearlo con el siguiente comando.

zpool set cachefile=/etc/zfs/zpool cache pool

Si en algún momento queremos montar o desmontar el pool nosotros mismos, es tan sencillo como hacer

zfs mount pool
zfs umont pool
22 may

Tipos de caches ZFS

Vamos a explicar que tipos de cache tenemos disponible en ZFS y como trabaja cada una de ellas, este post es  un añadido al mejora del rendimiento ZFS,  hechas las presentaciones vamos al lio.

Como sabemos ZFS nos permite hacer miles de cosas que difícilmente las podemos encontrar en los sistemas tradicionales de almacenamiento, e incluso algunas de ellas no están presente entre los grandes como EMC o Hitachi, pero bien estamos viendo que con el paso del tiempo hemos conseguido aumentar el numero de cpu’s, los GB de RAM e incluso los miles de TB de nuestros discos duros, pero aún así seguimos pecando de la velocidad de los discos, así que dada esta situación solo nos queda meter caches intermedias para conseguir darle un poco de brío al tema, en esta situación tenemos lo que popularmente se esta conociendo como Hybrid Storage, que no es más que la unificación de un disco duro + un disco SSD + RAM, la cantidad de cada una de las partes en nuestro sistema dependerá una vez mas de los leuros que tengamos encima de la mesa.

En los tiempos que corren, lo mas normal es que tengamos muchos discos rotativos, poca ram y algún SSD, así que vamos a centrarnos en esta situación para explicar como funcionan y como debemos organizar las caches del sistema ZFS. Dónde tenemos el problema?, pues en el acceso aleatorio a los datos, la búsqueda del sector, más el movimiento de la aguja que nos lleva a tener una latencia importante.

Vamos a ver el esquema de sistemas de cache que tiene ZFS y explicar cada una de ellas.

arcCache ARC -> Muy por encima, ubicado en RAM, es la cache de primer nivel de ZFS, si no le decimos nada ZFS intentara ubicar en ella lo máximo posible, ya que al estar en RAM es la más rápida.(uberblock y punteros  a los arboles de datos, para acceder de la forma mas rápida posible a los mismos).

L2ARC: Cache de segundo nivel de lectura, esto son los discos SSD, zfs ubicará  todos los datos que no pudo ubicar en ARC (debemos recordar que zfs hace un uso intensivo del sistema de prefetch inteligente), esto se puede modificar y decidir que parte queremos enviar al ARC y que parte quedarnos en el L2ARC, esta explicado entre otras variables en el post “Mejorar rendimiento de ZFS“.

ZIL: Más disco SSD, cache de segundo nivel de escritura, ahí meteremos el log, el  zfs intent log que acelerará las escrituras de tipo sincrono.

Disk storage pool: Pues los discos, cuando llegamos aquí ya tenemos que tenerlo todo montadito, que sino empieza a ir todo lento lento….

Entonces como nos quedaría?, pues algo tal que así.

Diagrama1

Cosas a tener en cuenta para entender mejor la arquitectura:

  1. El incremento del rendimiento se notara tras varias horas de funcionamiento con la estructura montada, ya que el sistema L2ARC/ZiL, ira almacenando en cache, los datos que mayor acceso tengan.
  2. El L2ARC, esta pensado para sistemas de write one, read many, o sea mucha lectura poca escritura, y lectura de datos de tipo aleatorio, la lectura de datos secuenciales zfs no hará uso de L2ARC (de cualquier modo el sistema de prefetcht integrado en zfs ya esta suficientemente optimizado para el envío de datos).
  3. ZIL, esto nos ayudara a compensar las escrituras a disco, la verdad es que yo recomiendo activar ambos, ya que obtendremos el mejor rendimiento posible.

Por último, recordad que una vez montado la arquitectura deberías revisar los parámetros, pasaros por el post Mejorar rendimiento de ZFS

Como montar esto?

Fácil

zpool add <pool> cache <disco>

 

zpool add <pool> log <disco>

El primer comando activaremos la cache de L2ARC y con la opción log del segundo comando activaremos la cache ZiL
Ale a disfrutarlo!

18 abr

Mejorar el rendimiento de ZFS

El un post anterior explicamos como montar un zpool, con raidz con deduplicacion  más compresión, suele pasar que, por norma general instalamos el tinglado de ZFS por defecto, y normalmente al inicio funciona perfectamente y muy muy rápido, pero de repente un día nos damos cuanta que el rendimiento bajo sustancialmente. Entonces se nos empieza a caer el mito, el cielo se pone negro y todo se vuelve borroso.

Bueno, pues lo que voy a intentar es dar un poco de luz a ese panorama, explicando ciertos valores que son recomendables tocar en nuestro FreeBSD, para que gestione mejor todo el tinglado.

Vamos al lio.

Primero de todo, nos vamos a centrar en valores del sistema (Boot Loader Parameters), y van configurados en (/boot/loader.conf), nos debemos fijar como tenemos el sistema ahora, por si acaso debemos volver atrás, para eso utilizaremos.

sysctl -a

O podemos ver el valor establecido de aquella variable que queremos cambiar con

sysctl vfs.zfs.arc_meta_used

Primero de todo lo que vamos hacer es un comprobación muy sencilla, vamos a mirar como esta utilizando nuestro sistema la tabla ARC (La tabla ARC es el lugar en memoria, donde el sistema guarda los metadata y la cache de datos).

Debemos tener en cuenta que la memoria mínima que le asignemos al ARC será la que mantenga, todo lo demás desde mínimo al máximo, puede ser solicitado por cualquier otro proceso del sistema, la memoria de ARC no dispone de una prioridad alta, así que si algun proceso solicita memoria es más que probable que ARC ceda la que tiene utilizándose.

Esto nos sirve en el caso que dispongamos de otra aplicación que utilice un tamaño de memoria RAM mínimo para arrancar, podemos asegurarnos que el tamaño mínimo asignado a ARC dejara memoria suficiente para el resto de servicios

Memoria utilizada

sysctl vfs.zfs.arc_meta_used
vfs.zfs.arc_meta_used: 3839717456

Limite de la memoria permitida

sysctl vfs.zfs.arc_meta_limit
vfs.zfs.arc_meta_limit: 3887218688

Como podemos ver estamos al limite…, cosa que debemos cambiar.

Podemos hacer 2 cosas, o modificar el tamaño que utilizara la parte metadata de ARC añadiendo la variables vfs.zfs.arc_meta_limit o hacerlo de forma general, ya que en la tabla de ARC, guardaremos tanto los metadata como la cache de datos y que freebsd se lo gestione como buenamente quiera, pensemos que si modificamos por ejemplo el ARC_max a 4Gb y el arc_meta_limit a > 4GB,  es más que seguro que estemos forzando a que el sistema pase la cache de datos a disco, se puede aumentar el arc_meta, si tenemos activada la cache secundaria en disco SSD, que lo explicare como hacerlo en otro momento.

Bueno pues vamos a reservar un mínimo para todo el tinglado que expliqué del ARC.

Recomiendan utilizar esta regla para asignar un tamaño mínimo al ARC
4GB -> 512MB
8GB -> 1GB
etc

vfs.zfs.arc_min="8096M"

Contando que la máquina solo se dedique almacenar datos podemos aplicar las siguiente “reglas”, que por supuesto no son 100% fiables, debemos aplicar y ver como se comporta el sistema.

Ram x 0.5 – 512 MB

vfs.zfs.arc_max="3584M"

Ram x 2

vm.kmem_size_max="16G"

Ram x 1.5

vm.kmem_size="12G"

Una vez realizado esto debemos asegurarnos que los cambios que hemos hecho se comportan correctamente con el espacio libre del kernel, lo podemos hacer con el siguiente script.

#!/bin/sh

TEXT=`kldstat | awk 'BEGIN {print "16i 0";} NR>1 {print toupper($4) "+"} END {print "p"}' | dc`
DATA=`vmstat -m | sed -Ee '1s/.*/0/;s/.* ([0-9]+)K.*/1+/;$s/$/1024*p/' | dc`
TOTAL=$((DATA + TEXT))

echo TEXT=$TEXT, `echo $TEXT | awk '{print $1/1048576 " MB"}'`
echo DATA=$DATA, `echo $DATA | awk '{print $1/1048576 " MB"}'`
echo TOTAL=$TOTAL, `echo $TOTAL | awk '{print $1/1048576 " MB"}'`

Sumamos el espacio de utilización del kernel, más el utilizado por VDEV cache size, debemos controlar sobretodo vm.kmem_size ya que si nos pasamos con el valor, podemos tener un kernel panic al inicio del sistema, también debemos tener en consideración que vfs.zfs.arc_max, debe ser inferior a vm.kmem_size (ya que no solo ZFS utiliza la memoria), también debemos tener en cuenta, que si ponemos un valor muy alto en vm.kmem_size independientemente de vfs.zfs.arc_max, puede ser que el sistema no nos arranque, no hay problema, podemos cambiar en el gestor de arranque del sistema y asignar con (set vm.kmem_size = “512M”).

Si hemos cambiado los valores vfs.zfs.arc_max y vm.kmem_size el valor de kmem_size_max no se toma en consideración, pero se requiere ponerlo.

Seguimos con más opciones.

vfs.zfs.prefetch_disable="1"

Activar o desactivar esta opción, nos permite hacer que el sistema sea menos restrictivo a la hora de realizar las lecturas, de tal manera que la velocidad de lectura tiende a subir activandolo, este valor hace la función de precargar el siguiente bloque que el sistema predice que pueda ser leído, por supuesto en RAM , desactivarlo solo es recomendable para sistemas que tengan poca RAM.

Venga a por otro más

vfs.zfs.txg.timeout="5"

Este valor es el que controla el ZFS txg timeout, por defecto es 30 segundos, debemos cambiarlo si nos encontramos con cortes en la transferencia, ya que puede ser debido a esto,  normalmente el comportamiento por ejemplo en una linea de 1GB puede ser que  la tasa de trasferencia es oscilante,  o sea que por ejemplo se envían 100MB se para y de golpe envía 200MB etc etc, pensemos también que en el caso que tengamos activado la compresión, puede ser normal que baje la tasa de transferencia a disco mientras el sistema esta comprimiendo los datos, en ese caso lo que aumentara es la CPU

Ahora vamos a subir el numero de vnodes.

Los vnodes es un objeto dentro de la memoria del kernel que habla con la interfaz del sistema de ficheros( abre, lee, escribe, cierra,etc..), los vnodes pueden representar ficheros, directorios, colas….

De tal manera que en el caso que lleguemos al tope de vnodes que el sistema puede gestionar, pues nos encontraremos con la bajada de rendimiento del mismo. Con esto comprobamos su valor

sysctl vfs.numvnodes

Si nos quedamos sin “espacios” en la tabla nos saldrá en el messange.

La norma de freebsd es que 1 gb por cada 4Gb de RAM

vfs.zfs.write_limit_override=1073741824

Parámetros del sistema de ficheros

Ahora vamos a dejar el sistema base a un lado y nos centramos en opciones de ZFS.

Venga al lio!

Si los datos que tenemos en el raidz, no tiene una criticidad alta, podemos plantearnos quitar la opción de checksum, ya que la paridad del RaidZ yo nos proporciona una protección básica, de esta manera libramos carga del sistema de ficheros, pero como digo siempre y cuando los datos que tengamos no son críticos, sino en ningún caso debemos desactivar esta opción

Este cambio se realiza a nivel de pool de zfs, y debemos activarlo y desactivarlo en aquellos que nos interesen, de la siguiente manera.

sudo zfs set checksum=off myzpool

Podemos también desactivar a nivel de pool la opción atime, con esto evitamos que el kernel tenga que realizar updates de tiempo por cada acceso de lectura fichero, esto es necesario si o si, en el caso que los datos que tenemos en el zpool seas accesibles por diferentes servicios a la vez, como contra partida los snapshot ocuparan más.

Haremos

sudo zfs set atime=off myzpool

Ahora vamos a tocar lo que guardara ZFS en la cache, normalmente tendremos 1 cache, que es donde guardara por un lado los metadata de la tabla ARC y por otro cache de datos, si lo que queremos es ahorrar RAM, lo que podemos hacer es decirle a ZFS que solo guarde metadata en la cache. La buena practica seria activar 2 cache, en la primera cache, que va a RAM, le diremos que solo guarde la información metadata, y en la segunda cache que seria un disco rápido (SSD por ejemplo),  le diremos que guarde cache de datos.

Tenemos 3 opciones para “jugar” con la cache, all, metadata o none.

Mas adelante explicare como añadir un disco SSD, para utilizarlo de cache. Con el panorama actual lo dejaremos en all, pero para cambiarla seria.

zfs set primarycache=metadata myzpool

Como comento lo recomendable seria utilizar dos tiempos de cache, en el caso que dispongamos de un disco SSD para la segunda cache lo que haremos es decirle que la segunda cache que va a nuestro disco SSD. Tal que así

zfs set secondarycache=all myzpool

De esta manera lo que conseguimos es que se guarde en memoria la base de datos de metadata, y en el disco SSD se guarde la cache de datos más la metadata, la metadata solo se escribira en el caso que la cache de primer nivel se agote, cosa que no nos interesa, debemos evitar que llegue al disco, ya que en eso momento hemos muerto…. Game Over y a otra cosa mariposa.

Ahora toca la variable recordsize, el cambiar el valor de esta variable, se aplicara desde ese momento para los datos nuevos que añadamos.

Con esta variable le diremos la asignación de tamaño de bloque del pool, debemos tener cuidado con esto ya que la asignación de un tamaño grande, no es contraproducente a nivel de escritura, ya que si tenemos por ejemplo 128 k de bloque y escribimos bloques de 64k, realmente en el rendimiento no tendremos aumento de latencia, el problema nos lo podemos encontrar si la media de bloques escritos en nuestro sistemas es por ejemplo de 64k y tenemos el bloque de 128, por cada envía que hagamos enviaremos 128k, de los cuales 64k son datos vacíos que tiene que gestionar el sistema, a parte si  disponemos por ejemplo de una red de 100MB/s, si tenemos un tamaño de bloque ocupado de 128k, podremos enviar 700 veces por segundo.

Bueno aqui cada cual, yo personalmente lo tengo en 64k, el comando para modificarlo es

sudo zfs set recordsize=16k myzpool

Por ultimo podemos probar si existe alguna actualizacion de ZFS

sudo zfs upgrade my_poolsudo
sudo zpool upgrade my_pool

Con esto reiniciamos y comprobamos el rendimiento, podemos utilizar estos 3 sistemas para comprobar el rendimiento.

zfs-mon

atop -l  2

zpool iostat -v 2

Ale a disfrutarlo!!

07 mar

Comandos útiles para zpool

Vamos a poner una lista de comandos útiles para “gestionar” nuestro zpool montado en freebsd, aquí podemos ver como montarlo.

Control de zpool

Eliminar un pool y liberar los discos.

zpool destroy pool

Añadir un disco al pool o añador un disco en spare a un pool existente

zpool add pool disco
zpool add pool spare disco

Comporbar el checksumde todo el pool en busca de errores

zpool scrub pool

Parar un disco y ponerlo otra vez en marcha

zpool offline pool disco
zpool online pool disco

Cambiar un disco por otro

zpool remplace pool discoviejo disconuevo

Información sobre zpool

zpool list
zpool status

Comprobar los accesos

zpool iostat -v 2

Comprobar si un volumen tiene compresión y el ratio

zfs get compression pool
backups  compression  gzip-9    local
zfs get compressratio pool
backups  compressratio  3.89x  -

Comprobar la deduplicacion y el ratio

zfs list pool
NAME      SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
backups  2.33T   123G  2.21T     5%  1.45x  ONLINE

Podemos hace una simulación de lo que podíamos ganar en el caso de activar la deduplicacion en un pool, con el comando

zdb -S pool

Podemos ir comprobando lo que hemos ganado con la deduplicacion y compresion con el comando siguiente.

zdb -D pool
zdb -DD pool

Que nos devolverá información básica o detallada del pool.

Ejemplo basico

DDT-sha256-zap-duplicate: 2682724 entries, size 356 on disk, 166 in core
DDT-sha256-zap-unique: 14651367 entries, size 335 on disk, 150 in core
dedup = 2.42, compress = 3.52, copies = 1.00, dedup * compress / copies = 8.48

Managemen zpool

Establecer una cuota a un pool

zfs set quota=tamaño pool

Almacenar varias copias de cada archivo. Esto establece un nivel de redundancia a mayores sobre lo que ya ofrece el ZPoll. El espacio que ocupa el archivo se multiplica

zfs set copies=3 pool

Crear un snapshot

zfs snapshot [email protected]
zfs list -t snapshot
 zfs list -t snapshot -o name,creation

Volver a un snapshot y eliminarlo

zfs rollback /@
zfs destroy /@

Con esto podemos ir tanteando el mundo de zfs… para más información http://www.freebsd.org/doc/en/books/handbook/index.html

07 mar

Crear Raid-Z más zfs con deduplicación y compresión

Vamos a dar los pasos para crear en FreeBSD dos raidz, crearemos también dos zpools y en uno de ellos vamos a montar la compresión y la deduplicacion que nos ofrece ZFS, a más voy a poner unos comandos que suelen ser útiles para controlar el tema.

El escenario es el siguiente, tenemos 8 discos duros, 4 de 2 TB y 4 de 600GB, la idea es crear dos raidz.

Primero de todo, lo que vamos a mirar es la lista de discos duros que tenemos en nuestro FreeBSD, lo haremos con el comando

egrep '^ad[0-9]|^da[0-9]' /var/run/dmesg.boot

Como os fijareis, estoy en una plataforma virtual, como consejo es diré que tengáis en cuenta los canales del conector de SCSI en VMware, yo soy partidario de separa los discos del sistema en el canal 0 y los de backup (en este caso) en el canal 1, esto también nos da la facilidad que en el caso que sean discos de backup, podamos decidir que esos discos no se realicen snapshot, o por ejemplo si tenemos que hace backup de esa máquina virtual, en mi caso con veeam backup, podremos decirle que no haga backup de los discos que estén conectados en el canal 1.

Un trozo de mi lista es:

da7: Command Queueing enabled
da7: 614400MB (1258291200 512 byte sectors: 255H 63S/T 78325C)
da8 at mpt1 bus 0 scbus3 target 6 lun 0
da8: <VMware Virtual disk 1.0> Fixed Direct Access SCSI-2 device
da8: 320.000MB/s transfers (160.000MHz, offset 127, 16bit)
da8: Command Queueing enabled
da8: 2097151MB (4294967294 512 byte sectors: 255H 63S/T 267349C)
da9 at mpt1 bus 0 scbus3 target 8 lun 0
da9: <VMware Virtual disk 1.0> Fixed Direct Access SCSI-2 device
da9: 320.000MB/s transfers (160.000MHz, offset 127, 16bit)
da9: Command Queueing enabled
da9: 614400MB (1258291200 512 byte sectors: 255H 63S/T 78325C)

Bien, pues vamos a crear primero los dos RAIDZ.

zpool create storage raidz da2 da3 da6 da8

Donde storage es el nombre del “pool” y da2..da8, los discos que queremos añadir a ese Raid.

Por defecto al colocar raidz nos generara algo parecido al RAID5 tradicional, pero disponemos de otro tipos de RAID, dentro del RAIDZ.

Tipos de RAID-Z

Raid 0

zpool create nombredelpoll discos

Raidz-2

Creación de un zpool raidz-2 con 4 discos, doble paridad y un disco de spare,

&lt;pre&gt;zpool create nombre del pool  raidz2 discos spare disco_en_spare

Ahora vamos crear el segundo raidz

zpool create backups raidz da4 da5 da7 da9

Podemos ver que el Raid se creo correctamente con

zpool list
backups  2.33T   104G  2.23T     4%  1.43x  ONLINE  -
storage  7.94T  1.58T  6.36T    19%  1.00x  ONLINE  -

Para ver el punto de montaje, lo podemos hacer con un df -h

Como vamos a colocar copias de seguridad en este pool backups activaremos la compresión y la deduplicacion

Podemos hace una simulación de lo que podíamos ganar en el caso de activar la deduplicacion en un pool, con el comando

zdb -S pool

&lt;pre&gt;
zfs set dedup=on backups/
zfs set compression=gzip-9 backups/

Podemos elegir el nivel de compresión.

Cuando empecemos a trabajar con el, podemos ir comprobando lo que hemos ganado con la deduplicacion y compresion con el comando siguiente.

zdb -D pool

zdb -DD pool

Que nos devolverá información básica o detallada del pool.

Ejemplo basico

DDT-sha256-zap-duplicate: 2682724 entries, size 356 on disk, 166 in core
DDT-sha256-zap-unique: 14651367 entries, size 335 on disk, 150 in core

dedup = 2.42, compress = 3.52, copies = 1.00, dedup * compress / copies = 8.48

Ejemplo detallado

DDT-sha256-zap-duplicate: 2682724 entries, size 356 on disk, 166 in core
DDT-sha256-zap-unique: 14651367 entries, size 335 on disk, 150 in core

DDT histogram (aggregated over all DDTs):

bucket              allocated                       referenced
______   ______________________________   ______________________________
refcnt   blocks   LSIZE   PSIZE   DSIZE   blocks   LSIZE   PSIZE   DSIZE
------   ------   -----   -----   -----   ------   -----   -----   -----
1    14.0M   1.73T    471G    473G    14.0M   1.73T    471G    473G
2    1.23M    135G   42.6G   42.8G    3.08M    345G    106G    106G
4     513K   47.3G   18.8G   18.9G    2.43M    234G   91.8G   92.2G
8     311K   33.5G   10.4G   10.5G    3.25M    362G    110G    111G
16     118K   11.1G   4.30G   4.31G    2.61M    252G   95.7G   96.1G
32     396K   47.5G   11.1G   11.1G    14.1M   1.67T    405G    407G
64    11.9K    389M    373M    375M    1014K   32.9G   31.4G   31.5G
128    3.56K    142M    131M    132M     607K   23.5G   21.9G   21.9G
256    4.24K   75.7M   44.6M   45.8M    1.30M   23.7G   14.0G   14.3G
512      106   3.40M   3.34M   3.36M    67.6K   2.16G   2.12G   2.13G
1K       16    366K    350K    353K    21.9K    440M    418M    422M
2K       16   88.5K   67.5K   71.1K    42.5K    237M    178M    188M
4K        8   77.5K   39.5K   41.1K    43.2K    423M    218M    227M
8K        2     48K     48K   48.6K    23.5K    565M    565M    573M
16K        3   77.5K   77.5K   78.5K    53.8K   1.36G   1.36G   1.38G
32K        1   71.5K   71.5K   71.8K    36.9K   2.58G   2.58G   2.59G
Total    16.5M   2.00T    559G    561G    42.6M   4.65T   1.32T   1.33T

dedup = 2.42, compress = 3.52, copies = 1.00, dedup * compress / copies = 8.48

En este caso no vamos a separa la cache de cada pool y los logs, pero es posible tener una cache por cada grupo discos, una cache que es interesante que este en unos discos más rápidos, si vemos que nos hace falta podemos mirar el rendimiento de nuestro sistema de RAID con la aplicación que queramos, sabiendo que contra más compresión pues mas recursos.
Una herramienta que esta bastante bien es Bonnie++

Con esto ya tendremos montado nuestro sistema Raid-Z y algunas características de zfs