J'utilise une configuration à 22 disques, dont 19 dans une baie ZFS et 15 sur des multiplicateurs de ports associés à des contrôleurs SATA pilotés par le module sata_sil24
. Lorsque vous utilisez la vitesse maximale (SATA2, 3 Gbps), l'opération est assez bizarre. De simples erreurs de lecture jetteront un sperme complet sur un multiplicateur de ports pendant longtemps, avec parfois des résultats assez terribles. Le démarrage avec le paramètre de noyau libata.force=1.5G
pour forcer les contrôleurs SATA à des vitesses "traditionnelles" résout complètement tous les problèmes liés aux multiplicateurs de port. Le problème est que mon pool ZFS est soutenu par un SSD à cache rapide sur mon contrôleur ICH10R. Un autre disque SSD sur ce même contrôleur détient le système.
Faire libata.force=1.5G
coupe immédiatement environ 100 Mo/s du débit de transfert de mes disques SSD. Pour le lecteur racine, ce n'est pas si grave, mais pour le cache SSD ZFS, ça l'est. Cela rend effectivement le zpool entier plus lent pour les transferts soutenus qu'il ne l'aurait été sans le lecteur de cache. L’accès aléatoire et les recherches dans l’arbre fs en bénéficient bien entendu. En énumérant les options de module pour sata_sil24
, aucune option de ce type n'existe.
Comment passer le paramètre libata.force=1.5G
uniquement aux trois contrôleurs SATA sauvegardés par le module sata_sil24
?
Ah! J'ai découvert!
À http://www.kernel.org/doc/Documentation/kernel-parameters.txt , il est indiqué,
libata.force= [LIBATA] Force configurations. The format is comma
separated list of "[ID:]VAL" where ID is
PORT[.DEVICE]. PORT and DEVICE are decimal numbers
matching port, link or device. Basically, it matches
the ATA ID string printed on console by libata. If
the whole ID part is omitted, the last PORT and DEVICE
values are used. If ID hasn't been specified yet, the
configuration applies to all ports, links and devices.
If only DEVICE is omitted, the parameter applies to
the port and all links and devices behind it. DEVICE
number of 0 either selects the first device or the
first fan-out link behind PMP device. It does not
select the Host link. DEVICE number of 15 selects the
Host link and device attached to it.
The VAL specifies the configuration to force. As long
as there's no ambiguity shortcut notation is allowed.
For example, both 1.5 and 1.5G would work for 1.5Gbps.
The following configurations can be forced.
* Cable type: 40c, 80c, short40c, unk, ign or sata.
Any ID with matching PORT is used.
* SATA link speed limit: 1.5Gbps or 3.0Gbps.
* Transfer mode: pio[0-7], mwdma[0-4] and udma[0-7].
udma[/][16,25,33,44,66,100,133] notation is also
allowed.
* [no]ncq: Turn on or off NCQ.
* nohrst, nosrst, norst: suppress hard, soft
and both resets.
* dump_id: dump IDENTIFY data.
If there are multiple matching configurations changing
the same attribute, the last one is used.
La partie délicate consiste donc à déterminer quel port X et quel périphérique Y (dmesg ataX.YY) correspond au contrôleur et au lecteur. Je pense que cette notation correspond à PORT [.DEVICE], mais il y a aussi la notation W: X: Y: Z. Je devine ataX.YY :)
Heureusement, la semaine dernière, j’ai fait ce mappage manuellement (en essayant d’identifier un lecteur qui jetait des spasmes et en réinitialisant un contrôleur d’hôte), donc j’ai déjà une liste exhaustive :) Je n’ai trouvé nulle part que les mappages de sdX à ataX. Y ou W: X: Y: Z étaient listés, alors je me suis contenté d'extraire des câbles SATA et de regarder quels messages ataX.YY apparaissaient dans/var/log/messages;)
Donc, dans ma configuration, il me semble que je dois faire
libata.force=1:1.5G,2:1.5G,3:1.5G
Je vais devoir essayer ça dès la fin de mon nettoyage ZFS et faire un compte rendu :) Super! J'espère que ceci aide quelqu'un d'autre :)