SunFire X4500
Note
La première version date de 2012, donc, les informations présentées ici sont outdated.
Précédent : ZFS on Linux - 1 | Suivant : ZFS on Linux - 3
2.1 - Description du matériel : SunFire X4500
- 2x "Dual Core AMD Opteron 285" @ 2,6 Ghz (4 processeurs)
- 16 Go RAM
- 48x 500 Go SATA (répartis sur 6 controleurs Marvell MV88SX6081 8 ports)
- 4x Intel Corporation 82546EB Gigabit Ethernet Controller
Mise en service 2006 et 2007. Debian 7 Squeeze jusqu'à Debian 10 Buster
2.2 - Configuration des disques
Sur une machine avec autant de disques (2 pour le système, 46 pour jouer^W les pools), il est fortement conseillé d'utiliser un fichier zdev.conf (qui deviendra vdev_id.conf dans les versions suivantes).
Comme il y a 6 contrôleurs SATA, on listera les disques by-path, afin de pouvoir panacher plus facilement ensuite. Les ¿$%§!£#!! de Virtual USB Devices n'étant pas désactivables (même en intervenant dans le BIOS), il faut nettoyer la liste des disques :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | ls -l /dev/disk/by-path | awk '{print $9 $10 $11}' | grep -v -e "-usb-" pci-0000:01:01.0-scsi-0:0:0:0->../../sda pci-0000:01:01.0-scsi-1:0:0:0->../../sdb pci-0000:01:01.0-scsi-2:0:0:0->../../sdc pci-0000:01:01.0-scsi-3:0:0:0->../../sdd pci-0000:01:01.0-scsi-4:0:0:0->../../sde pci-0000:01:01.0-scsi-5:0:0:0->../../sdf pci-0000:01:01.0-scsi-6:0:0:0->../../sdg pci-0000:01:01.0-scsi-7:0:0:0->../../sdh pci-0000:02:01.0-scsi-0:0:0:0->../../sdi pci-0000:02:01.0-scsi-1:0:0:0->../../sdk pci-0000:02:01.0-scsi-2:0:0:0->../../sdl pci-0000:02:01.0-scsi-3:0:0:0->../../sdm pci-0000:02:01.0-scsi-4:0:0:0->../../sdn pci-0000:02:01.0-scsi-5:0:0:0->../../sdo pci-0000:02:01.0-scsi-6:0:0:0->../../sdp pci-0000:02:01.0-scsi-7:0:0:0->../../sdq pci-0000:05:01.0-scsi-0:0:0:0->../../sdr pci-0000:05:01.0-scsi-1:0:0:0->../../sds pci-0000:05:01.0-scsi-2:0:0:0->../../sdt pci-0000:05:01.0-scsi-3:0:0:0->../../sdu pci-0000:05:01.0-scsi-4:0:0:0->../../sdv pci-0000:05:01.0-scsi-5:0:0:0->../../sdw pci-0000:05:01.0-scsi-6:0:0:0->../../sdx pci-0000:05:01.0-scsi-7:0:0:0->../../sdy pci-0000:06:01.0-scsi-0:0:0:0->../../sdz pci-0000:06:01.0-scsi-0:0:0:0-part1->../../sdz1 pci-0000:06:01.0-scsi-0:0:0:0-part2->../../sdz2 pci-0000:06:01.0-scsi-1:0:0:0->../../sdaa pci-0000:06:01.0-scsi-2:0:0:0->../../sdab pci-0000:06:01.0-scsi-3:0:0:0->../../sdac pci-0000:06:01.0-scsi-4:0:0:0->../../sdad pci-0000:06:01.0-scsi-4:0:0:0-part1->../../sdad1 pci-0000:06:01.0-scsi-4:0:0:0-part2->../../sdad2 pci-0000:06:01.0-scsi-5:0:0:0->../../sdae pci-0000:06:01.0-scsi-6:0:0:0->../../sdaf pci-0000:06:01.0-scsi-7:0:0:0->../../sdag pci-0000:0a:01.0-scsi-0:0:0:0->../../sdah pci-0000:0a:01.0-scsi-1:0:0:0->../../sdai pci-0000:0a:01.0-scsi-2:0:0:0->../../sdaj pci-0000:0a:01.0-scsi-3:0:0:0->../../sdak pci-0000:0a:01.0-scsi-4:0:0:0->../../sdal pci-0000:0a:01.0-scsi-5:0:0:0->../../sdam pci-0000:0a:01.0-scsi-6:0:0:0->../../sdan pci-0000:0a:01.0-scsi-7:0:0:0->../../sdao pci-0000:0b:01.0-scsi-0:0:0:0->../../sdap pci-0000:0b:01.0-scsi-1:0:0:0->../../sdaq pci-0000:0b:01.0-scsi-2:0:0:0->../../sdar pci-0000:0b:01.0-scsi-3:0:0:0->../../sdas pci-0000:0b:01.0-scsi-4:0:0:0->../../sdat pci-0000:0b:01.0-scsi-5:0:0:0->../../sdau pci-0000:0b:01.0-scsi-6:0:0:0->../../sdav pci-0000:0b:01.0-scsi-7:0:0:0->../../sdaw |
Il faut retirer les disques bootable d'id 0 (pci-0000:06:01.0-scsi-0:0:0:0) et 1 (pci-0000:06:01.0-scsi-4:0:0:0) de cette liste.
En essayant de panacher les disques et les contrôleurs, afin de répartir au moins pire les I/O, voici un fichier zdev.conf résultant (il est possible de faire mieux) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | # X4500 - zdev.conf, raidz1 panachés sur les controleurs sata # pci-0000:03:04.0-usb-0:1:1.0-scsi-0:0:0:0 -> sr0 # pci-0000:03:04.1-usb-0:1:1.0-scsi-0:0:0:0 -> sdj # pci-0000:06:01.0-scsi-0:0:0:0 -> sdz (OS 0) # pci-0000:06:01.0-scsi-4:0:0:0 -> sdad (OS 1) # bloc A A1 pci-0000:01:01.0-scsi-0:0:0:0 # sda A2 pci-0000:01:01.0-scsi-3:0:0:0 # sdd A3 pci-0000:01:01.0-scsi-7:0:0:0 # sdh A4 pci-0000:02:01.0-scsi-2:0:0:0 # sdl A5 pci-0000:02:01.0-scsi-6:0:0:0 # sdp A6 pci-0000:05:01.0-scsi-2:0:0:0 # sdt # bloc B B1 pci-0000:05:01.0-scsi-6:0:0:0 # sdx B2 pci-0000:01:01.0-scsi-1:0:0:0 # sdb B3 pci-0000:01:01.0-scsi-4:0:0:0 # sde B4 pci-0000:01:01.0-scsi-5:0:0:0 # sdf B5 pci-0000:02:01.0-scsi-3:0:0:0 # sdm B6 pci-0000:02:01.0-scsi-7:0:0:0 # sdq # bloc C C1 pci-0000:05:01.0-scsi-3:0:0:0 # sdu C2 pci-0000:01:01.0-scsi-2:0:0:0 # sdc C3 pci-0000:02:01.0-scsi-0:0:0:0 # sdi C4 pci-0000:02:01.0-scsi-4:0:0:0 # sdn C5 pci-0000:05:01.0-scsi-0:0:0:0 # sdr C6 pci-0000:05:01.0-scsi-4:0:0:0 # sdv # bloc D D1 pci-0000:06:01.0-scsi-3:0:0:0 # sdac D2 pci-0000:01:01.0-scsi-6:0:0:0 # sdg D3 pci-0000:02:01.0-scsi-1:0:0:0 # sdk D4 pci-0000:02:01.0-scsi-5:0:0:0 # sdo D5 pci-0000:05:01.0-scsi-1:0:0:0 # sds D6 pci-0000:05:01.0-scsi-5:0:0:0 # sdw # bloc E E1 pci-0000:06:01.0-scsi-2:0:0:0 # sdab E2 pci-0000:06:01.0-scsi-6:0:0:0 # sdaf E3 pci-0000:0a:01.0-scsi-2:0:0:0 # sdaj E4 pci-0000:0a:01.0-scsi-6:0:0:0 # sdan E5 pci-0000:0b:01.0-scsi-2:0:0:0 # sdar E6 pci-0000:0b:01.0-scsi-6:0:0:0 # sdav # bloc F F1 pci-0000:06:01.0-scsi-7:0:0:0 # sdag F2 pci-0000:0a:01.0-scsi-3:0:0:0 # sdak F3 pci-0000:0a:01.0-scsi-7:0:0:0 # sdao F4 pci-0000:0b:01.0-scsi-3:0:0:0 # sdas F5 pci-0000:05:01.0-scsi-7:0:0:0 # sdy F6 pci-0000:0b:01.0-scsi-5:0:0:0 # sdau # bloc G G1 pci-0000:0a:01.0-scsi-0:0:0:0 # sdah G2 pci-0000:0a:01.0-scsi-4:0:0:0 # sdal G3 pci-0000:0b:01.0-scsi-0:0:0:0 # sdap G4 pci-0000:0b:01.0-scsi-4:0:0:0 # sdat G5 pci-0000:06:01.0-scsi-1:0:0:0 # sdaa G6 pci-0000:06:01.0-scsi-5:0:0:0 # sdae # spares SP1 pci-0000:0a:01.0-scsi-1:0:0:0 # sdai SP2 pci-0000:0a:01.0-scsi-5:0:0:0 # sdam SP3 pci-0000:0b:01.0-scsi-1:0:0:0 # sdaq SP4 pci-0000:0b:01.0-scsi-7:0:0:0 # sdaw |
Pour que le fichier /etc/zfs/zdev.conf soit pris en compte, il faut utiliser la commande suivante :
1 | udevadm trigger /etc/zfs/zdev.conf |
Un ls -l dans /dev/disk/zpool/ (ou /dev/disk/by-vdev/) confirmera la bonne prise en compte de cette configuration.
On peut, bien évidemment, panacher autrement. 8 disques par contrôleurs et 6 contrôleurs : Plein de possibilités !
On restera contraint avec les disques bootables (id 0 et id 1) qui sont sur le contrôleur 6.
2.3 - Création d'un pool manuel
2.3.1 pool unique
Un pool unique de 46 disques n'est pas recommandé. Mais ça fonctionne :
1 2 3 4 5 6 | zpool create -f data raidz2 /dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf \ /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk /dev/sdl /dev/sdm /dev/sdn /dev/sdo \ /dev/sdq /dev/sdr /dev/sds /dev/sdt /dev/sdu /dev/sdv /dev/sdw /dev/sdx /dev/sdaa \ /dev/sdab /dev/sdac /dev/sdae /dev/sdaf /dev/sdag /dev/sdah /dev/sdai /dev/sdaj \ /dev/sdak /dev/sdal /dev/sdam /dev/sdan /dev/sdao /dev/sdap /dev/sdaq /dev/sdar \ /dev/sdas /dev/sdat /dev/sdau /dev/sdav spare /dev/sdaw /dev/sdy |
Cela offre un espace utile d'environ 22 To. Mais, en raidz1, un seul disque qui pète, vous perdez l'ensemble. En raidz2, il faut deux disques en panne pour perdre le pool. Statistiquement, avec 48 disques, c'est vite arrivé...
2.3.2 pool compartimenté
En respectant les bonnes pratiques, on crée ici un assemblage de 7 grappes raidz1 de 6 disques chacun, plus 4 disques "hot-spare" globaux.
1 2 3 4 5 6 7 8 9 | zpool create -f -o autoreplace=on -m /data data \ raidz1 /dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf \ raidz1 /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk /dev/sdl \ raidz1 /dev/sdm /dev/sdn /dev/sdo /dev/sdq /dev/sdr /dev/sds \ raidz1 /dev/sdt /dev/sdu /dev/sdv /dev/sdw /dev/sdx /dev/sdaa \ raidz1 /dev/sdab /dev/sdac /dev/sdae /dev/sdaf /dev/sdag /dev/sdah \ raidz1 /dev/sdai /dev/sdaj /dev/sdak /dev/sdal /dev/sdam /dev/sdan \ raidz1 /dev/sdao /dev/sdap /dev/sdaq /dev/sdar /dev/sdas /dev/sdat \ spare /dev/sdaw /dev/sdy /dev/sdau /dev/sdav |
Vérification (l'assemblage des différentes grappes raidz1 est mis en valeur naturellement) :
1 2 3 4 | zpool list NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT data 19,0T 561G 18,5T 2% 1.00x ONLINE - |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | zpool status pool: data state: ONLINE scan: scrub repaired 0 in 0h14m with 0 errors on Tue Apr 10 09:18:52 2012 config: NAME STATE READ WRITE CKSUM data ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 sda ONLINE 0 0 0 sde ONLINE 0 0 0 sdi ONLINE 0 0 0 sdm ONLINE 0 0 0 sdq ONLINE 0 0 0 sdu ONLINE 0 0 0 raidz1-1 ONLINE 0 0 0 sdy ONLINE 0 0 0 sdb ONLINE 0 0 0 sdf ONLINE 0 0 0 sdj ONLINE 0 0 0 sdn ONLINE 0 0 0 sdr ONLINE 0 0 0 raidz1-2 ONLINE 0 0 0 sdv ONLINE 0 0 0 sdc ONLINE 0 0 0 sdk ONLINE 0 0 0 sdo ONLINE 0 0 0 sds ONLINE 0 0 0 sdw ONLINE 0 0 0 raidz1-3 ONLINE 0 0 0 sdd ONLINE 0 0 0 sdh ONLINE 0 0 0 sdl ONLINE 0 0 0 sdp ONLINE 0 0 0 sdt ONLINE 0 0 0 sdx ONLINE 0 0 0 raidz1-4 ONLINE 0 0 0 sdac ONLINE 0 0 0 sdag ONLINE 0 0 0 sdak ONLINE 0 0 0 sdao ONLINE 0 0 0 sdas ONLINE 0 0 0 sdaw ONLINE 0 0 0 raidz1-5 ONLINE 0 0 0 sdah ONLINE 0 0 0 sdal ONLINE 0 0 0 sdap ONLINE 0 0 0 sdat ONLINE 0 0 0 sdaa ONLINE 0 0 0 sdae ONLINE 0 0 0 raidz1-6 ONLINE 0 0 0 sdai ONLINE 0 0 0 sdam ONLINE 0 0 0 sdaq ONLINE 0 0 0 sdau ONLINE 0 0 0 sdab ONLINE 0 0 0 sdaf ONLINE 0 0 0 spares sdaj AVAIL sdan AVAIL sdar AVAIL sdav AVAIL errors: No known data errors |
Cette configuration offre un bon rapport espace/panne : 19 To pour 7 + 4 disques qui peuvent tomber en panne, avant de perdre le pool. On peut aussi faire la même configuration en raidz2, pour encore plus de résilience à la panne disque.
2.4 - Création d'un pool avec zdev.conf
Toujours en respectant les bonnes pratiques, mais en utilisant cette fois-ci les alias du fichier /etc/zfs/zdev.conf, on peut largement simplifier la commande du § précédent :
1 2 3 4 5 6 7 8 9 | zpool create -f -o autoreplace=on -m /data data \ raidz1 A1 A2 A3 A4 A5 A6 \ raidz1 B1 B2 B3 B4 B5 B6 \ raidz1 C1 C2 C3 C4 C5 C6 \ raidz1 D1 D2 D3 D4 D5 D6 \ raidz1 E1 E2 E3 E4 E5 E6 \ raidz1 F1 F2 F3 F4 F5 F6 \ raidz1 G1 G2 G3 G4 G5 G6 \ spare SP1 SP2 SP3 SP4 |
Vérification (7 grappes raidz1 de 6 disques chacune, et 4 disques hot-spare globaux) :
1 2 3 4 | zpool list NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT data 19,0T 561G 18,5T 2% 1.00x ONLINE - |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | zpool status pool: data state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM data ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 A1 ONLINE 0 0 0 A2 ONLINE 0 0 0 A3 ONLINE 0 0 0 [OK, vous avez compris...] G4 ONLINE 0 0 0 G5 ONLINE 0 0 0 G6 ONLINE 0 0 0 spares SP1 AVAIL SP2 AVAIL SP3 AVAIL SP4 AVAIL errors: No known data errors |
2.5 - Tuning spécifique
La SunFire X4500 est un veau : Pas assez de processeurs, pas assez de mémoire. Cependant, il est possible d'améliorer un peu son comportement avec quelques réglages.
2.5.1 Forcer l'affinité des interruptions par CPU
Dans /etc/rc.local, on force l'association entre processeur et contrôleur SATA :
1 2 3 4 5 6 7 8 9 10 11 12 13 | # fixer les irq sata/cpu # cat /proc/interrupts pour trouver les bonnes interruptions # (ici : 24,32,38,46,68 et 76 = 6 controleurs SATA) # pour le processeur 0 : 2^0=1 echo "1" > /proc/irq/24/smp_affinity echo "1" > /proc/irq/32/smp_affinity # pour le processeur 1 : 2^1=2 echo "2" > /proc/irq/38/smp_affinity echo "2" > /proc/irq/46/smp_affinity # pour le processeur 2 : 2^2=4 echo "4" > /proc/irq/68/smp_affinity echo "4" > /proc/irq/76/smp_affinity # le dernier processeur (3) est laissé tranquille |
Note
Edit 2019 : Sur une machine, ou une distribution, plus récente, il faut utiliser irqbalance plutôt que s'embêter avec smp_affinity.
2.5.2 Ordonnanceur
Pour changer l'ordonnanceur (ou scheduler), on peut simplement le fixer au démarrage de la machine (dans default/grub). Mais c'est brutal (ce qui va bien pour ZFS n'est pas forcément pertinent pour le réseau ou les I/O RAM).
Dans /etc/default/grub:
1 | GRUB_CMDLINE_LINUX_DEFAULT="elevator=deadline" |
Sinon, dans /etc/rc.local, disque par disque :
1 2 3 | for device in /dev/sd? /dev/sda? ; do echo deadline > /sys/block/$disk/queue/scheduler # noop, deadline, cfq done |
Note
Edit 2019 : Depuis les versions 3 et 4 des noyaux linux, l'ordonnanceur cfq donne de bien meilleures performances.
2.5.3 Slab limit et ARC min/max
Sous solaris, par défaut, ZFS n'était pas limité dans son usage de la mémoire, mais on pouvait lui fixer quelques limites. Pour retrouver le même comportement sous Linux, il faut passer des paramètres aux modules chargés dans le noyau.
Dans /etc/modprobe.d/zfs.conf :
1 2 3 4 5 6 | options spl spl_kmem_cache_slab_limit=16384 # ARC à 8G => 8589934592 bytes options zfs zfs_vdev_scheduler=deadline zfs_arc_min=8589934592 \ zfs_arc_max=8589934592 zfs_vdev_min_pending=1 zfs_vdev_max_pending=3 \ zfs_prefetch_disable=1 zfs_txg_synctime_ms=2000 zfs_txg_timeout=5 zfs_nocacheflush=0 |
En 2019, on peut presque se limiter à fixer zfs_arc_max (de 1/3 à 1/2 de la RAM) :
1 2 3 4 | options spl spl_kmem_cache_slab_limit=16384 # ARC à 8G => 8589934592 bytes options zfs zfs_vdev_scheduler=cfq zfs_arc_max=8589934592 |
Le CBP maintient encore quelques vaillantes SunFire X4500 en production.
Précédent : ZFS on Linux - 1 | Suivant : ZFS on Linux - 3
ZFS on Linux - Footnotes
date: | 2019-03-25 |
---|---|
category: | HPC |
tags: | ZFS |
(notes de bas de page des articles ZFS on Linux, pasque DRY)
CBP : Centre Blaise Pascal
CDDL : Common Development and Distribution License
CLI : Command Line Interface (interface en ligne de commande)
COW : Copy On Write (copie sur écriture)
CPU : Central Processing Unit (Processeur Central)
DAS : Direct_Attached_Storage
DIY : Do It Yourself : *Fais-le toi-même.*
DRY : Don't Repeat Yourself : *Ne te repête pas.*
GUID : Global Unique Identifier
HBA : Host Bus Adapter
HT : HyperThreading
JBOD : Just a Bunch Of Disks
LLNL : Laurence Livermore National Laboratory
LVM : Logical Volume Manager ou Gestion par Volumes Logiques
NFS : Network File System
OS : Operating System, ou Système d'Exploitation
PSMN : Pôle Scientifique de Modélisation Numérique (là où je passe l'essentiel de mes journées)
RAID : Redundant Array of Inexpensive Disks
RAM : Random Access Memory, ou Mémoire Vive
SAS : Serial Attached SCSI
SATA : Serial Advanced Technology Attachment
SPL : Solaris Porting Layer, see github
SSD : Solid State Drive
ZFS :
SPDX-License-Identifier : CC-BY-4.0