VHDL'de kendi Serial-ATA Host-Bus-Adapter'ımı (HBA) uyguladım ve bir FPGA üzerinde programladım. FPGA, herhangi bir dijital devre ile programlanabilen çiptir. Ayrıca SATA veya PCIe için yüksek hızlı sinyaller üretmek için seri alıcı-vericilerle donatılmıştır.
Bu SATA denetleyicisi SATA 6 Gb / s hat hızlarını destekler ve aygıta 32 MiB yığınındaki ve cihazdan veri aktarmak için ATA-8 DMA-IN / OUT komutlarını kullanır. Tasarımın maksimum hızda çalıştığı kanıtlanmıştır (örn. Samsung SSD 840 Pro -> 550 MiB / s üzerinde).
Birkaç SSD ve HDD cihazıyla yapılan bazı testlerden sonra yeni bir Seagate 6 TB Arşiv HDD'si ( ST6000AS0002 ) satın aldım . Bu HDD 190 MiB / s okuma performansına, ancak yalnızca 30 ila 40 MiB / s yazma performansına ulaşır !
Bu yüzden daha derin kazdık ve iletilen çerçeveleri ölçtüm (evet bu bir FPGA tasarımı ile mümkün). Anlayabildiğim kadarıyla Seagate HDD, ilk 32 MiB aktarımı tek parça olarak almaya hazır. Bu aktarım maksimum 580 MiB / s hat hızında gerçekleşir. Bundan sonra, HDD kalan baytları 800 ms'den fazla durdurur! Daha sonra HDD sonraki 32 MiB'yi almaya hazırdır ve 800 ms boyunca tekrar durur. Toplamda 1 GiB aktarımının 30 saniyeden fazla olması gerekiyor, bu da yaklaşık 35 MiB / s'ye eşit.
Bu HDD'nin patlama döngüleri arasında boşaltılan 32 MiB yazma önbelleğine sahip olduğunu varsayıyorum. 32 MiB'den daha az veri aktarımı bu davranışı göstermez.
Denetleyicim veri aktarmak için DMA-IN ve DMA-OUT komutunu kullanıyor. NCQ özellikli AHCI denetleyicileri tarafından kullanılan QUEUED-DMA-IN ve QUEUED-DMA-OUT komutunu kullanmıyorum. AHCI ve NCQ'yu bir FPGA platformuna eklemek çok karmaşıktır ve uygulama katmanım tarafından gerekli değildir.
Bu senaryoyu Linux bilgisayarımda yeniden oluşturmak istiyorum, ancak Linux AHCI sürücüsünde varsayılan olarak NCQ etkin. NCQ'yu devre dışı bırakmam gerekiyor, bu yüzden NCQ'nun nasıl devre dışı bırakılacağını açıklayan bu web sitesini buldum , ancak çalışmıyor.
Linux PC hala 190 MiB / s yazma performansına ulaşıyor.
> dd if=/dev/zero of=/dev/sdb bs=32M count=32
1073741824 bytes (1.1 GB) copied, 5.46148 s, 197 MB/s
Yukarıdaki makalede bir hata olduğunu düşünüyorum: NCQ kuyruk derinliğini 1'e düşürmek NCQ devre dışı bırakmaz. Sadece işletim sisteminin sadece bir kuyruk kullanmasına izin verir. Aktarım için hala QUEUED-DMA - ** komutlarını kullanabilir. Sürücünün aygıta DMA-IN / OUT komutlarını vermesi için NCQ'yu gerçekten devre dışı bırakmam gerekiyor.
Sorularım işte burada:
- NCQ'yu nasıl devre dışı bırakabilirim?
- NCQ kuyruk derinliği = 1 ise, Linux'un AHCI sürücüsü QUEUED-DMA - ** veya DMA - ** komutlarını kullanıyor mu?
- Değişiklik
/sys/block/sdX/device/queue_depth
rapor edilmediğinden NCQ'nun devre dışı bırakılıp bırakılmadığını nasıl kontrol edebilirimdmesg
?
> dd if=/dev/zero of=/dev/sdb bs=32M count=32
Bununla ne yapmak istediğinizi bilmiyorum; ancak erase
hem MBR hem de ötesi blok ceylanları olacaktır . Bunu ana sistem üzerinde çalışan bir sürücüde yapmak (ve grub
benim durumumda olduğu gibi MBR üzerine kurulu) oldukça tehlikeli olurdu;) Daha az deneyimli olanların deney yapmasını önlemek için buraya bir yorum olarak yazacağımı düşündüm "serin" hattınız ...;)
libata.force=noncq
?