Comment (vraiment) désactiver NCQ sous Linux

J'ai implémenté ma propre carte bus hôte (HBA) Serial-ATA 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 controller SATA prend en charge les débits de ligne SATA 6 Gb / s et utilise les commands ATA-8 DMA-IN / OUT pour transférer des données dans un maximum de 32 blocs MiB vers et depuis l'appareil. La design est éprouvée pour fonctionner à la vitesse maximale (par exemple Samsung SSD 840 Pro -> plus de 550 MiB / 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 de 190 Mbit / s, mais seulement 30 à 40 Mbit / s en écriture!

J'ai donc creusé plus profondément et mesuré les images transmises (oui c'est possible avec un design FPGA). Pour autant que je sache, le disque dur Seagate est prêt à recevoir les 32 premiers MiB d'un transfert en une seule pièce. Ce transfert a lieu à une vitesse maximale de 580 Mbit / 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 prochains MiB et décroche à nouveau pendant 800 ms. Dans l'set, un transfert de 1 GiB 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 MiB, qui est balayé entre les cycles d'éclatement. Les transferts de données avec less de 32 MiB n'indiquent pas ce comportement.

Mon controller utilise la command DMA-IN et DMA-OUT pour transférer des données. Je n'utilise pas la command QUEUED-DMA-IN et QUEUED-DMA-OUT, qui sont utilisées par les controllers AHCI compatibles NCQ. Inplémenter AHCI et NCQ sur une plate-forme FPGA est très complexe et n'est pas nécessaire pour ma couche applicative.

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

Le PC Linux atteint encore 190 Mbit / s en écriture.

> dd if=/dev/zero of=/dev/sdb bs=32M count=32 1073741824 bytes (1.1 GB) copyd, 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 queue NCQ à 1 ne désactive pas NCQ. Cela permet simplement au operating system d'utiliser une seule queue. Il peut toujours utiliser les commands QUEUED-DMA – ** pour le transfert. J'ai besoin de vraiment désactiver NCQ afin que le pilote émet des commands DMA-IN / OUT à l'appareil.

Donc, voici mes questions:

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

Merci à @frostschutz, je pourrais mesurer la performance d'écriture sous Linux sans fonctionnalité NCQ. Le paramètre de démarrage du kernel libata.force=noncq désactivé NCQ complètement.

En ce qui concerne mon Seagate 6TB problème de performance d'écriture, il n'y avait pas de changement de vitesse. Linux atteint encore 180 Mio / s.

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

J'ai donc testé mon controller SATA avec 256 transferts KiB et voilà, il est possible d'atteindre 185 Mbit / s.

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

SMR – Enregistrement magnétique avec bardeaux

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