Comment (vraiment) désactiver NCQ sous Linux


13

J'ai implémenté mon propre adaptateur de bus hôte Serial-ATA (HBA) en VHDL et l'ai programmé sur un FPGA. Un FPGA est une puce qui peut être programmée avec n'importe quel circuit numérique. Il est également équipé d'émetteurs-récepteurs série pour générer des signaux à haute vitesse pour SATA ou PCIe.

Ce contrôleur SATA prend en charge les débits de ligne SATA 6 Gb / s et utilise les commandes ATA-8 DMA-IN / OUT pour transférer des données jusqu'à 32 Mo de blocs vers et depuis l'appareil. Il a été prouvé que la conception fonctionne à vitesse maximale (par exemple, Samsung SSD 840 Pro -> plus de 550 Mio / s).

Après quelques tests avec plusieurs périphériques SSD et HDD, j'ai acheté un nouveau disque dur Seagate 6 TB Archive ( ST6000AS0002 ). Ce disque dur atteint des performances de lecture allant jusqu'à 190 Mio / s, mais seulement des performances d'écriture de 30 à 40 Mio / s!

J'ai donc creusé plus profondément et mesuré les trames transmises (oui c'est possible avec une conception FPGA). Pour autant que je sache, le Seagate HDD est prêt à recevoir les 32 premiers Mo d'un transfert en une seule pièce. Ce transfert se produit à une vitesse de ligne maximale de 580 MiB / s. Après cela, le disque dur bloque les octets restants pendant plus de 800 ms! Ensuite, le disque dur est prêt à recevoir les 32 Mio suivants et se bloque à nouveau pendant 800 ms. Dans l'ensemble, un transfert de 1 Gio nécessite plus de 30 secondes, ce qui équivaut à environ 35 Mio / s.

Je suppose que ce disque dur a un cache d'écriture de 32 Mio, qui est vidé entre les cycles de rafale. Les transferts de données avec moins de 32 Mio ne montrent pas ce comportement.

Mon contrôleur utilise la commande DMA-IN et DMA-OUT pour transférer des données. Je n'utilise pas les commandes QUEUED-DMA-IN et QUEUED-DMA-OUT, qui sont utilisées par les contrôleurs AHCI compatibles NCQ. L'intégration d'AHCI et de NCQ sur une plate-forme FPGA est très complexe et n'est pas nécessaire à ma couche application.

Je voudrais reproduire ce scénario sur mon PC Linux, mais le pilote Linux AHCI a NCQ activé par défaut. Je dois désactiver NCQ, j'ai donc trouvé ce site Web décrivant comment désactiver NCQ , mais cela ne fonctionne pas.

Le PC Linux atteint toujours des performances d'écriture de 190 MiB / s.

> dd if=/dev/zero of=/dev/sdb bs=32M count=32
1073741824 bytes (1.1 GB) copied, 5.46148 s, 197 MB/s

Je pense qu'il y a un défaut dans l'article ci-dessus: Réduire la profondeur de la file d'attente NCQ à 1 ne désactive pas NCQ. Il permet simplement au système d'exploitation d'utiliser une seule file d'attente. Il peut toujours utiliser les commandes QUEUED-DMA - ** pour le transfert. Je dois vraiment désactiver NCQ pour que le pilote émette des commandes DMA-IN / OUT vers l'appareil.

Donc, voici mes questions:

  1. Comment puis-je désactiver NCQ?
  2. Si la profondeur de file d'attente NCQ = 1, le pilote AHCI de Linux utilise-t-il les commandes QUEUED-DMA - ** ou DMA - **?
  3. Comment puis-je vérifier si NCQ est désactivé, car la modification /sys/block/sdX/device/queue_depthn'est pas signalée dans dmesg?

3
paramètre du noyau libata.force=noncq?
frostschutz

Merci, cela a beaucoup aidé à désactiver complètement NCQ. J'ai également résolu le problème de performances d'écriture.
Paebbels

1
> dd if=/dev/zero of=/dev/sdb bs=32M count=32Je ne sais pas ce que vous aviez l'intention de faire avec ça; mais ce sera eraseà la fois le MBR et les gazillions de blocs au-delà. Faire cela sur un lecteur avec le système principal en cours d'exécution (et grubinstallé sur MBR, comme dans mon cas) serait assez dangereux;) J'ai pensé écrire ceci ici en tant que commentaire, pour empêcher certaines personnes moins expérimentées d'expérimenter avec votre ligne "cool" ...;)
erreur de syntaxe

@syntaxerror Le disque dur est connecté à une carte FPGA. Dans un tel environnement, il est loin d'être complexe d'écrire des routines matérielles qui gèrent parfaitement les MBR et les accès au système de fichiers. J'utilise donc le disque dur comme support brut des deux côtés. Dans la vue FPGA, c'est une grande mémoire linéaire. Sous Linux, j'utilise / dev / sdg et un programme C pour lire et écrire les données continues.
Paebbels

@Paebbels Oups, je n'aurais pas dû ignorer le bit FPGA. Eh bien, c'est en effet quelque chose de complètement différent de nos disques durs communs connectés aux bus de cartes mères de PC de bureau ou d'ordinateurs portables ;-) "Dans un tel environnement, il est loin d'être complexe d'écrire des routines matérielles qui gèrent parfaitement les MBR et les accès au système de fichiers" . Vrai. Vous ne pourrez plus vous passer d'un HDL . Et je peux imaginer que programmer une telle chose n'est pas pour les
âmes sensibles

Réponses:


11

Grâce à @frostschutz, j'ai pu mesurer les performances d'écriture sous Linux sans fonctionnalité NCQ. Le paramètre de démarrage du noyau a libata.force=noncqcomplètement désactivé NCQ.

En ce qui concerne mon problème de performances d'écriture Seagate 6 To, il n'y a pas eu de changement de vitesse. Linux atteint toujours 180 Mio / s.

Mais alors j'ai eu une autre idée:
le pilote Linux n'utilise pas les transferts de 32 morceaux MiB. Le tampon du noyau est beaucoup plus petit, surtout si NCQ avec 32 files d'attente est activé (32 files d'attente * 32 Mio => 1 Gio de tampon AHCI).

J'ai donc testé mon contrôleur SATA avec 256 transferts Kio et voilà, il est possible d'atteindre 185 Mio / s.

Je suppose donc que le micrologiciel Seagate ST6000AS0002 n'est pas capable de gérer les gros transferts en rafale ATA. La norme ATA autorise jusqu'à 65 536 blocs logiques, ce qui équivaut à 32 Mio.

SMR - Enregistrement magnétique bardé

Une autre possibilité pour les mauvaises performances d'écriture pourrait être la technique d'enregistrement magnétique en bardeaux , qui est utilisée par Seagate dans ces dispositifs d'archivage. Évidemment, j'ai déclenché un effet rare avec mon implémentation FPGA.


1
D'après mon expérience, la désactivation de NCQ augmente considérablement les performances. J'ai essayé cela sur des systèmes de bureau, des serveurs, vous l'appelez. Même en utilisant du matériel haute performance 100% «serveur» qui, selon vous, bénéficierait de NCQ. Non, c'est pire que de le désactiver. IMHO NCQ est l'une des pires choses qui arrivent aux disques durs. Je ne l'ai jamais vu offrir un avantage en aucune circonstance, que ce soit une carte RAID dédiée ou un chipset intégré.
CR.

Avez-vous effectué des opérations en rafale ou un accès aléatoire? NCQ n'a aucun impact sur les opérations de rafale mais améliore l'accès aléatoire.
Paebbels

Désolé, mais vous n'avez pas répondu à ma question. Une autre question est de savoir quel matériel avez-vous utilisé une simple carte mère grand public ou une carte mère station de travail / serveur ou un contrôleur RAID dédié. De nombreuses implémentations ne prennent pas en charge autant de demandes en attente que celles conçues par NCQ / AHCI.
Paebbels
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.