Sommaire
Hello les moules,
Sur un serveur de récupération que j'utilise depuis quelques mois en homeserver/NAS avec grande satisfaction (HP Microserver N40L équipé d'un CPU AMD Turion et 4 Go de RAM), j'ai ajouté il y a quelques jours le "dernier" disque de la grappe que je souhaitais mettre en place : 4x 4 To en soft-RAID5 afin d'avoir 12 To à peu près sûrs afin d'y stocker des backups, principalement.
La machine tournait avec 3x 4 To en soft-RAID5 depuis plusieurs mois et je n'avais aucun problème de perfs à signaler, bien que je ne lui en demandais pas trop. Je ne sais par contre pas exactement quelles étaient ces perfs précisément en terme de débit sur le périphérique /dev/md0
.
Une fois le disque ajouté, j'ai lancé la procédure pour intégrer ce disque à la grappe, et qui s'appelle apparemment le reshape. Aucun problème à signaler, le processus s'est bien lancé.
Mais j'ai été ébaubi par l'estimation du temps restant, directement lié au débit observé : environ 30 jours, pour un débit de 1 Mo/s au mieux.
Voici l'état actuel à ce jour, sachant que j'ai lancé le process dimanche dernier, il y a 3 jours :
Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10]
md0 : active raid5 sdd[4] sda[0] sdc[3] sdb[1]
7813775152 blocks super 1.2 level 5, 8k chunk, algorithm 2 [4/4] [UUUU]
[=>...................] reshape = 6.8% (267783332/3906887576) finish=55060.9min speed=1101K/sec
bitmap: 2/30 pages [8KB], 65536KB chunk
unused devices: <none>
Et encore là c'est revenu à un débit "presque acceptable" en étant au dessus du Mo/s, car il a passé la journée du lundi à 650 ko/s de moyenne.
J'ai suivi les conseils mentionnés sur cette page, notamment
/sys/block/*/device/queue_depth
/sys/block/md0/md/sync_max
blockdev --setra /dev/md0 65536
mais sans résultat probant.
J'ai testé la vitesse de lecture avec hdparm -Tt
et j'obtiens bien des débits bruts en cache de ~1000 Mo/s et ~100 Mo/s hors-cache.
J'en arrive à la conclusion que le problème vient certainement de la taille des chunks qui est de 8 ko ce qui est très petit, et augmente logiquement fortement les I/O.
Cette taille n'était pas un choix éclairé de ma part car je passe (passais) pour la gestion "NAS" du serveur par OpenMediaVault, et j'avais à l'origine créé un RAID1 avec 1 disque (temporaire) qui a ensuite été progressivement évolué vers un RAID1 avec 2 disques, puis un RAID5 avec 3 disques, et enfin aujourd'hui sa configuration finale en RAID5 à 4 disques. Je suppose qu'il aurait été pertinent de modifier la taille des chunks dès le passage au RAID5, et mettre une valeur plus commune comme 128 ou 512 ko.
Qu'en pensez-vous ? Une dernière piste à explorer avant de patienter encore 4 semaines pour retrouver ma grappe finalisée ? :)
Quelques informations complémentaires ci-dessous.
# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Thu Oct 11 18:42:58 2018
Raid Level : raid5
Array Size : 7813775152 (7451.80 GiB 8001.31 GB)
Used Dev Size : 3906887576 (3725.90 GiB 4000.65 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Thu Sep 10 13:30:07 2020
State : active, reshaping
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 8K
Consistency Policy : bitmap
Reshape Status : 9% complete
Delta Devices : 1, (3->4)
Name : sihaya:volume1
UUID : 9e9abda8:006e7462:bd4bde5d:b6401408
Events : 120780
Number Major Minor RaidDevice State
0 8 0 0 active sync /dev/sda
1 8 16 1 active sync /dev/sdb
3 8 32 2 active sync /dev/sdc
4 8 48 3 active sync /dev/sdd
# fdisk -l
Disque /dev/sda : 3,7 TiB, 4000787030016 octets, 7814037168 secteurs
Modèle de disque : WDC WD40EZRZ-00G
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 4096 octets
taille d'E/S (minimale / optimale) : 4096 octets / 4096 octets
Disque /dev/sdb : 3,7 TiB, 4000787030016 octets, 7814037168 secteurs
Modèle de disque : ST4000DM004-2CV1
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 4096 octets
taille d'E/S (minimale / optimale) : 4096 octets / 4096 octets
Disque /dev/sdc : 3,7 TiB, 4000787030016 octets, 7814037168 secteurs
Modèle de disque : WDC WD40EZRZ-00G
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 4096 octets
taille d'E/S (minimale / optimale) : 4096 octets / 4096 octets
Disque /dev/sdd : 3,7 TiB, 4000787030016 octets, 7814037168 secteurs
Modèle de disque : ST4000VX007-2DT1
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 4096 octets
taille d'E/S (minimale / optimale) : 4096 octets / 4096 octets
# iostat -k 1 2
Linux 4.19.0-10-amd64 (sihaya) 09/09/2020 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
3,39 1,24 3,66 69,29 0,00 22,42
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 72,17 1488,08 1016,40 414346320 283009386
sdc 92,64 1488,01 1016,33 414326433 282990430
sdb 71,79 1487,77 1016,31 414259612 282983970
sdd 84,82 2,53 987,87 703817 275066004
sde 7,82 12,08 79,95 3363708 22260254
md0 3,26 48,09 57,54 13389093 16020672
avg-cpu: %user %nice %system %iowait %steal %idle
0,51 0,00 7,14 92,35 0,00 0,00
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 65,00 4696,00 1600,00 4696 1600
sdc 78,00 4696,00 1608,00 4696 1608
sdb 61,00 4712,00 1564,00 4712 1564
sdd 73,00 0,00 784,00 0 784
sde 0,00 0,00 0,00 0 0
md0 2,00 8,00 0,00 8 0
# dstat -af
--total-cpu-usage-- --dsk/sda-----dsk/sdb-----dsk/sdc-----dsk/sdd-----dsk/sde-- net/br-866f-net/docker0--net/enp2s0---net/tun0- ---paging-- ---system--
usr sys idl wai stl| read writ: read writ: read writ: read writ: read writ| recv send: recv send: recv send: recv send| in out | int csw
4 8 0 89 0| 0 1712k:4096B 1692k: 0 1708k: 0 1712k: 0 0 | 0 0 : 0 0 : 0 0 : 0 0 | 0 0 |1203 1339
3 4 0 94 0| 0 2052k: 0 2016k: 0 2056k: 0 2052k: 0 36k| 0 0 : 0 0 : 282k 37k: 0 0 | 0 0 |1408 1484
0 2 0 98 0| 0 2336k: 0 2272k: 0 2208k: 0 2336k: 0 0 | 0 0 : 0 0 : 142k 35k: 0 0 | 0 0 | 873 764
2 3 0 95 0| 0 1624k: 0 1688k: 0 1688k: 0 1560k: 0 0 | 0 0 : 0 0 : 133k 14k: 0 0 | 0 0 |1073 1304
3 4 0 94 0| 0 1740k: 0 1744k: 0 1804k: 0 1804k: 0 0 | 0 0 : 0 0 : 129k 24k: 0 0 | 0 0 |1032 997
1 2 0 97 0| 0 1488k: 0 1544k: 0 1484k: 0 1484k: 0 0 | 0 0 : 0 0 : 155k 23k: 0 0 | 0 0 |1056 1132
2 3 0 95 0|4096B 1392k: 0 1332k: 0 1332k: 0 1396k: 0 40k| 0 0 : 0 0 : 137k 15k: 0 0 | 0 0 | 896 833
2 3 0 95 0| 0 1712k: 0 1712k: 0 1708k: 0 1700k: 0 0 | 0 0 : 0 0 : 122k 21k: 0 0 | 0 0 |1373 1375
15 19 0 66 0| 36M 1045k: 36M 1041k: 36M 1029k:8192B 933k: 0 0 | 0 0 : 0 0 : 140k 20k: 0 0 | 0 0 |1911 4876
35 12 0 53 0| 833k 896k: 828k 896k: 828k 896k: 0 952k: 0 56k| 0 0 : 0 0 : 76k 36k: 0 0 | 0 0 |1769 2032
7 10 0 83 0| 772k 856k: 768k 912k: 768k 920k: 0 860k: 0 0 | 0 0 : 0 0 : 247k 31k: 0 0 | 0 0 |1668 2468
4 12 0 84 0| 128k 1744k: 128k 1744k: 128k 1620k: 0 1736k: 0 12k| 0 0 : 0 0 : 121k 29k: 0 0 | 0 0 |
Mise à jour 12/09/2020
Après activation du cache writeback sur les disques et un retour à une valeur de NCQ de 32, le débit s'est stabilisé à ~26 Mo/s ce qui a permis de terminer l'opération de reshape en 2 jours seulement. La possibilité de modifier la taille des chunks et la passer à 64 voire 128 ko est encore en étude.
# Accès aléatoire
Posté par paulez (site web personnel) . Évalué à 4.
Tu satures tes disques en IOPS (environ 75 i/o par seconde en moyenne pour des disques magnétiques 7200 tours/minute) car tu fais des accès aléatoires (non séquentiels). Les accès aléatoires sont vraiment l'énorme différence de perf entre les SSD et les disques magnétiques.
hdparm -tT c'est un test en accès séquentiel donc pas représentatif si tu fais de l'aléatoire.
En effet si tu peux augmenter la taille des blocs de données accédés à chaque i/o, tu devrais pouvoir augmenter ton débit.
[^] # Re: Accès aléatoire
Posté par Nanawel (site web personnel, Mastodon) . Évalué à 1.
En effet ça semble logique. Mais où vois-tu cette valeur de ~75 IOPS dans les sorties des commandes ? Je suis curieux je n'y vois que des valeurs en ko/s.
Je ne sais pas comment faire pour augmenter la quantité de données lues à chaque "tour", je pensais que la commande
blockdev --setra
servait à ça, mais apparemmentmdadm
ne semble pas trop y voir de différence.Si j'avais une solution qui impliquait d'augmenter sensiblement la RAM occupée pour ce travail (en travaillant sur de plus gros lots de données) ça ne me dérangerait pas, j'ai encore presque 3 Go libres, mais je ne trouve rien qui permette ça.
[^] # Re: Accès aléatoire
Posté par WhiteCat . Évalué à 5.
C'est la colonne "tps" (transfer per second) de la commande iostat.
https://en.wikipedia.org/wiki/IOPS
https://coderwall.com/p/utc42q/understanding-iostat
[^] # Re: Accès aléatoire
Posté par Nanawel (site web personnel, Mastodon) . Évalué à 1.
Oh OK merci :)
# CPU ?
Posté par AncalagonTotof . Évalué à 3.
Intuitivement, je mettrais ça sur le dos du Turion et ses perfs en calcul de checksum. Il me semble que c'est plutôt du bas de gamme mais je peux me tromper.
Ici, le bench que fait mon kernel à chaque démarrage donne ça :
raid6: sse2x1 gen() 6491 MB/s
raid6: sse2x1 xor() 5016 MB/s
raid6: sse2x2 gen() 7808 MB/s
raid6: sse2x2 xor() 5965 MB/s
raid6: sse2x4 gen() 8893 MB/s
raid6: sse2x4 xor() 6532 MB/s
raid6: using algorithm sse2x4 gen() 8893 MB/s
raid6: .... xor() 6532 MB/s, rmw enabled
raid6: using ssse3x2 recovery algorithm
xor: measuring software checksum speed
prefetch64-sse: 11104.000 MB/sec
generic_sse: 9623.000 MB/sec
xor: using function: prefetch64-sse (11104.000 MB/sec)
Et ton Turion ?
[^] # Re: CPU ?
Posté par Nanawel (site web personnel, Mastodon) . Évalué à 3.
J'y ai pensé aussi, mais quand je regarde le load je vois surtout beaucoup d'iowait et pas beaucoup de temps kernel ou user (80% d'iowait contre 10% max de kernel+user). À mon sens ça devrait pourtant se traduire par une occupation forte de ces états.
La sortie de mon
dmesg
:Pas top certes, mais pas trop dégueu non plus je pense, non ?
[^] # Re: CPU ?
Posté par AncalagonTotof . Évalué à 3.
Yep, ça n'est "que" deux fois plus lent qu'ici.
Le check d'un RAID 5 sur 3 x 10 To prend environ 16 heures chez moi.
Peut-être un peu plus à la construction initiale, mais je ne me rappelle plus. Pas beaucoup plus, ça c'est certain.
Ça n'explique pas le délai annoncé chez, et de très loin.
Est-ce que le mode de fonctionnement des disques est bon ? Je parle du SATA 6 Gbps, 3 Gbps ou moins. Mais aussi les modes les plus vieux comme UDMA.
J'ai déjà eu des pépins de disques correctement reconnus au boot. Et puis quelques heures/jours/mois plus tard, il se passe un truc que je n'ai jamais compris, et paf, message dans les logs et très souvent, grosse perte de performance. Quelque chose comme ça.
Jamais compris. Seagate est une partie de l'explication. Mais Western Digital n'a pas tout réglé.
[^] # Re: CPU ?
Posté par Nanawel (site web personnel, Mastodon) . Évalué à 1.
Quand j'ai vu ces perfs j'ai cherché une explication dans les logs, et notamment des erreurs SATA (par expérience…). Mais là rien du tout, les logs systèmes sont cleans, rien à redire.
Si le problème était lié au débit es interfaces, je pense que les tests
hdparm
l'auraient révélé.Quelle est la taille des chunks sur ta grappe ?
[^] # Re: CPU ?
Posté par AncalagonTotof . Évalué à 1.
512k :
[^] # Re: CPU ?
Posté par Nanawel (site web personnel, Mastodon) . Évalué à 2.
Ouais je crois que c'est ce qui fait toute la différence ici. Il faudrait (aurait fallu) que j'augmente la taille des chunks en passant du RAID1 à RAID5.
A priori c'est possible de le faire a posteriori, mais encore faut-il que le reshape se termine d'abord…
(et j'imagine que cette action va aussi prendre des plombes pour les mêmes raisons)
# Quelques réglages que j'utilise
Posté par Loïs Taulelle ࿋ (site web personnel) . Évalué à 3. Dernière modification le 10 septembre 2020 à 12:00.
mdadm -G /dev/md0 -binternal
je ne sais plus pourquoi, mais c'est plus rapide sur un md-raid5.
sdparm -s WCE=1 /dev/sd[a-d]
echo "500000" > /proc/sys/dev/raid/speed_limit_max # déjà fait ?
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
blockdev --setra 16384 /dev/$disk # déjà fait ?
blockdev --setra 65536 /dev/$mdisk # déjà fait.
echo 16384 > /sys/block/$mdisk/md/stripe_cache_size
echo 8192 > /sys/block/$mdisk/md/stripe_cache_active
avec $disk = sda, sdb… et $mdisk = md0. Si le /sys/block/$disk/queue/scheduler existe, le passer en cfq.
Proverbe Alien : Sauvez la terre ? Mangez des humains !
[^] # Re: Quelques réglages que j'utilise
Posté par Nanawel (site web personnel, Mastodon) . Évalué à 2.
Très juste, j'avais oublié de mettre la sortie de
mdadm --detail /dev/md0
, j'ai corrigé ça.Normalement ça permet de dire que j'utilise déjà un internal bitmap. C'est bien le but de ta première commande ?
Pour les commandes suivantes voici l'état actuel :
Bon clairement y'a des choses à ajuster. Je m'en vais tenter ça de suite. Merci !
Autres sources trouvées à ce sujet en passant, avec des valeurs égales ou similaires :
- https://wtf.roflcopter.fr/links/pogo/?nICtQw
- http://wiki.alessandro.delgallo.net/wiki/index.php/RAID
[^] # Re: Quelques réglages que j'utilise
Posté par Nanawel (site web personnel, Mastodon) . Évalué à 2. Dernière modification le 10 septembre 2020 à 14:04.
Bon, après 5mn pas de changement notable malgré les "optimisations" apportées :(
Je déconseille par contre fortement dans une situation similaire de suivre les conseils indiquant qu'il faut désactiver le NCQ sur les disques : en faisant ça le débit a chuté chez moi en 1mn à ~500 ko/s ! (j'avais déjà testé ça en début de semaine avec le même résultat)
[^] # Re: Quelques réglages que j'utilise
Posté par Loïs Taulelle ࿋ (site web personnel) . Évalué à 3.
Oui. Mais je n'arrive pas à remettre la main sur la ref disant qu'une "internal bitmap" c'est plus rapide qu'une "external bitmap".
Le 'raid/speed_limit_max', entre 200k et 500k, ça change pas grand chose… de toute façon, on touche aux limites du bus sata.
Pour 'read_ahead_kb', 'nr_requests' et 'blockdev --setra', je gagne a les augmenter, par device, même sur du sata.
Et le truc qui sauve vraiment, c'est le write cache des disques. C'est souvent désactivé par défaut parce qu'en cas de coupure brusque, ça fait de gros dégats dans le FS. Mais ça accélère vraiment sur des I/O un peu intenses.
Proverbe Alien : Sauvez la terre ? Mangez des humains !
[^] # Re: Quelques réglages que j'utilise
Posté par Nanawel (site web personnel, Mastodon) . Évalué à 2.
Ah oué c'est radical oO
Je passe instantanément (ok non en quelques minutes) à 18 Mo/s.
Le serveur étant sur un onduleur avec 30mn d'autonomie et une extinction automatique propre on va dire que c'est plutôt safe. Dans tous les cas, c'est principalement des backups donc pas de question de vie ou de mort en cas de perte des données.
Merci !
[^] # Re: Quelques réglages que j'utilise
Posté par Nanawel (site web personnel, Mastodon) . Évalué à 2.
Ah, et passer
/sys/block/$dev/device/queue_depth
de8
à16
permet de gagner encore 5 Mo/s (soit environ 23 Mo/s).Je l'avais abaissé à
8
en supposant qu'il s'agissait d'un bon compromis entre1
(les conseils lus à droite et à gauche) et32
, la valeur par défaut.Le repasser à
32
m'a encore permis de remonter à 27 Mo/s. Je comprends vraiment pas ces conseils.[^] # Re: Quelques réglages que j'utilise
Posté par paulez (site web personnel) . Évalué à 2.
C'est lié aux accès aléatoires et au NCQ.
Dans le pire des cas chaque accès prend un maximum de temps à cause de sa position sur le disque (par exemple si tu lis un bloc juste avant).
Le principe du NCQ est de ré-ordonnancer les accès dans la file d'attente, pour minimiser le parcours du disque à effectuer.
Donc par exemple si tu demandes à lire quelque chose comme ça et que les blocs sont stockés dans l'ordre sur le disque (je mets les numéros de blocs):
5 - 4 - 3 - 2
À chaque fois tu dois attendre un tour complet du disque vu que le bloc à lire suivant est situé avant celui qui vient d'être lu.
Avec NCQ, le contrôleur du disque va réordonnancer la liste des requêtes à effectuer afin de minimiser la distance à parcourir sur le disque:
2 - 3 - 4 - 5
Au final le temps de réponse pour la première requête est plus important, mais le débit global est augmenté.
NCQ ne peut agir que sur les requêtes envoyées au disque (donc fonction de la taille de la file d'attente).
Donc plus tu augmentes la taille de la file de requête plus potentiellement NCQ peut augmenter le débit en réordonnançant des requêtes, au détriment de la latence des requêtes situées au début de la file.
[^] # Re: Quelques réglages que j'utilise
Posté par Nanawel (site web personnel, Mastodon) . Évalué à 2.
Oui pardon, j'avais bien compris le principe du NCQ pour les disques et de sa pertinence pour améliorer les perfs, mais presque tous les articles que j'ai vus qui parlaient de solutions concernant la lenteur d'un reshape de RAID5 disaient de le désactiver (càd de passer à
1
).Or chez moi ça a exactement l'effet inverse et baisse considérablement les débits. Alors que le laisser à
32
permet de revenir à des performances acceptables.[^] # Re: Quelques réglages que j'utilise
Posté par wismerhill . Évalué à 7.
Ça peut être un conseil pertinent si le RAID ne fait que son reshape, parce qu'il va le faire séquentiellement.
Mais si le périphérique est en cours d'utilisation (les FS sont montés et utilisés par des programmes), alors tu va avoir des accès aléatoire qui vont venir s'ajouter à ce beau processus séquentiel, ce qui va te massacrer les performances.
# CMR/SMR
Posté par cfx . Évalué à 6.
Hum, d'après ce que je vois, tu as deux disque Western Digital et un Seagate SkyHawk qui utilisent la technologie CMR, et un Seagate Barracuda qui utilise technologie SMR.
Plusieurs constructeurs se sont fait récemment choppé à vendre des disque SMR sans que ce soit vraiment annoncé.
Je ne maitrise pas vraiment le sujet, mais pour résumer cette vidéo, le problème est que SMR "superpose" des données, permettant une plus grande densité, mais requiert de réécrire toutes les données superposées à chaque écriture.
Normalement, du cache est là pour que ces écritures se fassent lorsque le disque est idle, mais lors d'un rebuild, ou tu vas écrire en permanence, il ce peut que le disque ne s'en sorte pas bien (cf Synology).
La vidéo fait notamment mention d'un problème avec le RaidZ de FreeNas, ou un rebuild de disque CMR prend 16h tandis qu'avec un disque SMR, cela prend 9+ jours.
Toujours chez Synology :
[^] # Re: CMR/SMR
Posté par Nanawel (site web personnel, Mastodon) . Évalué à 2.
C'est effectivement une très bonne remarque. Cette idée m'avait traversé l'esprit mais j'ai pensé que c'était plutôt réservé à des HDD de plus grosses capacités, en oubliant que justement les constructeurs s'étaient fait pincer récemment à omettre ces informations sciemment sur certains modèles…
Merci pour les docs, effectivement c'est une erreur de ma part en choisissant les disques. J'ai un peu trop joué sur le côté Inexpensive du RAID en prenant des disques d'entrée de gamme. Je note de remplacer le Barracuda qui n'est pas adapté à l'usage.
[^] # Re: CMR/SMR
Posté par BAud (site web personnel) . Évalué à 5.
et pour approfondir, PMR / CMR / SMR :
https://en.wikipedia.org/wiki/Perpendicular_recording PMR / CMR
https://en.wikipedia.org/wiki/Shingled_magnetic_recording SMR
(sur wikipedia anglais c'est un peu plus complet que sur la page en français, qui est plutôt une synthèse)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.