Díky @frostschutz jsem mohl měřit výkon zápisu v Linuxu bez funkce NCQ. Zaváděcí parametr jádra libata.force=noncq
úplně deaktivoval NCQ.
Pokud jde o můj problém s výkonem zápisu Seagate 6TB, rychlost se nezměnila. Linux stále dosahuje 180 MiB/s.
Ale pak mě napadl jiný nápad:
Linuxový ovladač nepoužívá přenosy 32 MiB bloků. Vyrovnávací paměť jádra je mnohem menší, zvláště pokud je povoleno NCQ s 32 frontami (32 front * 32 MiB => 1 GiB vyrovnávací paměť AHCI).
Takže jsem testoval svůj SATA řadič s přenosy 256 kB a voilà, je možné dosáhnout 185 MiB/s.
Takže si myslím, že firmware Seagate ST6000AS0002 není schopen zpracovat velké ATA burst přenosy. Standard ATA umožňuje až 65 536 logických bloků, což se rovná 32 MiB.
SMR – Shingled Magnetic Recording
Další možností špatného zápisu by mohla být technika šindľového magnetického záznamu, kterou v těchto archivačních zařízeních používá Seagate. Je zřejmé, že jsem svou implementací FPGA spustil vzácný efekt.
Nastavení hloubky fronty na 1 (/sys/block/sd*/device/queue_depth
) zakáže NCQ, není nutné používat parametr jádra libata.force=noncq
(které lze nastavit pouze při bootování).
commit 360f654e7cda850034f3f6252a7a7cff3fa77356
Date: Sat Sep 30 19:45:00 2006 +0900
[PATCH] libata: turn off NCQ if queue depth is adjusted to 1
Turn off NCQ if queue depth is adjusted to 1.