ZFS on Linux - 7


Récapitulons [1]

Récapitulatif des choix matériels et des réglages propre à Linux.


Précédent : ZFS on Linux - 6 | Suivant : ZFS on Linux - 8


7.1 - Matériel

Je l'ai déjà dit, et je vais le répéter : Le mono-socket à 2 ou 4 coeurs pas rapide, il faut éviter !

ZFS, c'est fait pour gérer des grosses volumétries, supérieures à la dizaine de téra-octets. Donc, des coeurs, des GHz, de la RAM, du JBOD en HBA. Et des disques, obviously.

Quelques règles de base :

  • Pas de controleur RAID matériel,

Un bug dans un firmware est plus difficile à mettre à jour que votre OS. Encore plus si le bug est hardware, directement dans le silicium (problème déjà rencontré...). Donc pas d'intelligence dans le matériel.

Le RAID matériel est susceptible de corruption silencieuse, et sur de grosses volumétries, c'est... Au mieux, ennuyeux, au pire, catastrophaclismique.

  • Ratio idéal : 1 coeur de 1 GHz, avec 1 Go de RAM, pour 1 To brut de stockage.

C'est un idéal, pour des performances époustouflantes... Disons qu'entre 16 et 32 coeurs logiques, entre 2,2 et 2,6 GHz, accompagné par 96 à 192 Go de RAM, on peut servir de 24 à 600 To bruts vers des interfaces 1 Gb/s sans problème. Pour servir une interface 10 Gb/s, ça fonctionnera aussi. S'il y a plusieurs interfaces 10 Gb/s, ou plus rapide, il faut commencer à réfléchir au cache en écriture.

  • Multiplier les axes

30 disques de 1 To seront plus rapides que 3 disques de 10 To. Ça a l'air tellement évident, dit comme ça.

  • 3615-mavie

Notre plus grosse machine, dans une configuration qui n'a duré que le temps d'une expérience, était une R730xd, accompagnée de 4 baies MD3060e, en double attachement. 252 disques de 4 To. 1 Po brut. Un unique volume de 735 To utile (un petit peu plus, la compression était activé et les données compressibles) servi sur une interface 10 Gb/s. Tout a trés bien fonctionné jusqu'à la fin du traitement des données (soit ~ 18 mois).

7.2 - Réglages des options Linux

Note

Edit 2019 : Je ne vous mets que les versions finales (2019).

7.2.1 - grub default

Pour que les disques SAS12G soient reconnu sans des tétra-chiées d'erreurs, sur des contrôleurs LSI SAS6G, il faut le dire au noyal, en plus de mettre le firmware des-dit contrôleurs à jour.

1
2
3
# /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="mpt2sas.prot_mask=1"
GRUB_CMDLINE_LINUX="mpt2sas.prot_mask=1"

Grosso-modo, pour ceux qu'on la flemme de demander à Gogole, le LSI MPT Fusion SAS 2.0 Device Driver (mpt2sas) ne sait pas gérer les mélanges de SAS6G (SAS 2.0, SATA 3.0, SATA III ou SATA 6Gb/s) et SAS12G (ou SAS 3.0), contrairement à ce que dit la norme. C'est con.

7.2.2 - modprobe.conf

Quelques paramètres à passer aux modules spl/zfs.

1
2
3
4
5
# /etc/modprobe.d/zfs.conf
options spl spl_kmem_cache_slab_limit=16384

## standard 8G (miniserv, else RAM/2, in bytes)
options zfs zfs_vdev_scheduler=cfq zfs_arc_max=8589934592

Avec les années, on en a retiré beaucoup. Comme quoi, y'a des trucs en informatique qui se bonifient avec les années...

7.2.3 - sysctl

Quelques réglages utiles via sysctl (/etc/sysctl.d/psmn.conf)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
## force the Linux VM to keep a minimum number of kilobytes free
vm.min_free_kbytes = 1048576
vm.min_slab_ratio = 5
# https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/
# https://community.hortonworks.com/articles/33522/swappiness-setting-recommendation.html
# vm.swappiness, from 60
vm.swappiness = 20
# https://major.io/2008/08/07/reduce-disk-io-for-small-reads-using-memory/
# vm.dirty_ratio, from 40
vm.dirty_ratio = 70
# vm.dirty_bytes, from 0 ?
#vm.dirty_bytes = 15000000
# vm.dirty_background_ratio, from 10
vm.dirty_background_ratio = 5
# vm.dirty_background_bytes, from 0
vm.dirty_background_bytes = 15000000
# vm.dirty_expire_centisecs, from 3000
vm.dirty_expire_centisecs = 6000
# http://www.backwardcompatible.net/139-Reducing-dentry-slab-usage-on-machines-with-a-lot-of-RAM
# http://serverfault.com/questions/362589/effects-of-configuring-vm-overcommit-memory
# vm.overcommit=2
# vm.overcommit_ratio=80 ?
vm.vfs_cache_pressure = 10

Allez lire les liens. N'appliquez pas bêtement parceque vous êtes tombé sur cette page en suivant une recherche Gogole. Comprenez ce que vous faites.

7.2.4 - rc.local

Quelques réglages utiles dans /etc/rc.local.

On retrouvera toujours les disques dans /dev/ :

  • for device in /dev/sd[^0-9] /dev/sd?[^0-9] ; do

Mais aussi dans /dev/disk/by-id/ :

  • for device in /dev/disk/by-id/scsi-SRV_D* /dev/disk/by-id/scsi-B?D* ; do
  • for device in /dev/disk/by-id/dm-name-SRV_D* /dev/disk/by-id/dm-name-B?D* ; do

Cela va dépendre des alias dans /etc/multipath.conf. Au choix. L'important, c'est qu'ils soient identifiable facilement et rapidement, en mode panique!.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
for device in /dev/disk/by-id/scsi-SRV_D* /dev/disk/by-id/scsi-B?D* ; do
# Désactiver le cache en écriture
#  /usr/bin/sdparm -q --clear=WCE $device
# Activer le cache en écriture
  /usr/bin/sdparm -q --set=WCE $device
# Set read-ahead to 8 MiB (secteurs de 512o)
  blockdev --setra 16384 $device
# https://www.kernel.org/doc/Documentation/block/queue-sysfs.txt
  disk=$(basename $device)
  echo 1 > /sys/block/$disk/queue/rotational
  echo 2 > /sys/block/$disk/queue/rq_affinity        # 1 or 2
  echo cfq > /sys/block/$disk/queue/scheduler        # noop, deadline, cfq
  echo 1024 > /sys/block/$disk/queue/read_ahead_kb   # from 128 to 8192
  echo 256 > /sys/block/$disk/queue/nr_requests      # from 128 to 8192
# Disable NCQ on disks
#  echo 1 > /sys/block/$disk/device/queue_depth
done

Dans certains cas, le cache disque peut s'avérer contre-productif, mais c'est rare. Le read-ahead peut être réparti entre les block devices. De 8 à 64 Mo. À vous de voir. Précisez si les disques sont mécaniques (rotational) ou non.

7.2.5 - Divers

  • outils de diagnostic :

Avec le matériel LSI, on a besoin des outils LSI (sas2ircu, megasasctl) :

1
2
3
4
# HWRAID tools
deb http://hwraid.le-vert.net/debian stretch main
#deb http://hwraid.le-vert.net/ubuntu xenial main
# wget -O - http://hwraid.le-vert.net/debian/hwraid.le-vert.net.gpg.key | apt-key add -

On ajoutera aussi smartmontools et lm-sensors pour surveiller les disques et la machine en général.

  • irqbalance

Cet outil doit être installé et laisser à tourner en tâche de fond. Il sert à répartir la charge des IRQ Requests (nombreuses sur un système qui fait beaucoup d'entrées/sorties) au mieux. Ça remplace les réglages manuels d'IRQ Affinity.

  • updatedb

Modifiez /etc/updatedb.conf : Ajoutez vos chemins dans PRUNEPATHS, et zfs dans PRUNEFS. Ça évitera des I/O inutiles.


Précédent : ZFS on Linux - 6 | Suivant : ZFS on Linux - 8