Linux'ta NCQ nasıl (gerçekten) devre dışı bırakılır


13

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:

  1. NCQ'yu nasıl devre dışı bırakabilirim?
  2. NCQ kuyruk derinliği = 1 ise, Linux'un AHCI sürücüsü QUEUED-DMA - ** veya DMA - ** komutlarını kullanıyor mu?
  3. Değişiklik /sys/block/sdX/device/queue_depthrapor edilmediğinden NCQ'nun devre dışı bırakılıp bırakılmadığını nasıl kontrol edebilirim dmesg?

3
çekirdek parametresi libata.force=noncq?
frostschutz

Teşekkürler, bu NCQ tamamen devre dışı bırakmak için çok yardımcı oldu. Yazma performansı sorununu da çözdüm.
Paebbels

1
> dd if=/dev/zero of=/dev/sdb bs=32M count=32Bununla ne yapmak istediğinizi bilmiyorum; ancak erasehem MBR hem de ötesi blok ceylanları olacaktır . Bunu ana sistem üzerinde çalışan bir sürücüde yapmak (ve grubbenim 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 ...;)
sözdizimi

@syntaxerror HDD bir FPGA kartına bağlı. Böyle bir ortamda MBR'leri ve dosya sistemi girişlerini mükemmel şekilde işleyen donanım rutinleri yazmak çok karmaşıktır. HDD'yi her iki tarafta da ham medya olarak kullanıyorum. FPGA görünümünde büyük bir doğrusal bellek. Linux'ta, sürekli verileri okumak ve yazmak için / dev / sdg ve bir C programı kullanıyorum.
Paebbels

@Paebbels Hata! FPGA bitini göz ardı etmemeliydim. Aslında bu, masaüstü bilgisayarların veya dizüstü bilgisayarların anakartlarının otobüslerine bağlı ortak HDD'lerden tamamen farklı bir şey ;-) "Böyle bir ortamda MBR'leri ve dosya sistemi erişimini mükemmel şekilde işleyen donanım rutinlerini yazmak karmaşık olmaktan çok uzak" . Doğru. HDL olmadan yapamazsınız . Ve böyle bir şey programlamanın kalbin
zayıflığı

Yanıtlar:


11

@Frostschutz sayesinde, Linux'ta yazma performansını NCQ özelliği olmadan ölçebildim. Çekirdek önyükleme parametresi libata.force=noncqNCQ'yu tamamen devre dışı bıraktı.

Seagate 6TB yazma performansı sorunumla ilgili olarak, hızda bir değişiklik olmadı. Linux hala 180 MiB / s'ye ulaşıyor.

Ama sonra başka bir fikrim vardı:
Linux sürücüsü 32 MiB parçasının aktarımını kullanmıyor. Çekirdek tamponu, özellikle 32 kuyruklu NCQ etkinse (32 kuyruk * 32 MiB => 1 GiB AHCI tamponu) çok daha küçüktür.

Bu yüzden SATA denetleyicimi 256 KiB aktarım ve voilà ile test ettim, 185 MiB / s'ye ulaşmak mümkündür.

Bu yüzden sanırım Seagate ST6000AS0002 ürün yazılımı büyük ATA veri aktarım işlemlerini gerçekleştiremiyor. ATA standardı, 32 MiB'ye eşit olan 65.536'ya kadar mantıksal bloğa izin verir.

SMR - Karışık Manyetik Kayıt

Kötü yazma performansı için bir başka olasılık , Seagate tarafından bu arşiv cihazlarında kullanılan shingled manyetik kayıt tekniği olabilir . Açıkçası, FPGA uygulamamla nadir bir etkiyi tetikledim.


1
Deneyimlerime göre, NCQ'yu devre dışı bırakmak performansta büyük bir artış sağlar. Bunu masaüstü sistemlerinde, sunucularda denedim, siz söyleyin. Hatta% 100 "sunucu" yüksek performanslı donanım kullanarak bile NCQ fayda olacağını düşünüyorum. Hayır, sadece devre dışı bırakmaktan daha kötü. IMHO NCQ, sabit sürücülerde yaşanabilecek en kötü şeylerden biridir. Bir keresinde, özel RAID kartı veya yerleşik yonga seti olsun, hiçbir koşulda bir fayda sağladığını hiç görmedim.
CR.

Seri çekim işlemleri veya rastgele erişim yaptınız mı? NCQ'nun patlama operasyonları üzerinde hiçbir etkisi yoktur, ancak rasgele erişimi geliştirir.
Paebbels

Üzgünüm, ama soruma cevap vermedin. Başka bir soru, basit bir tüketici anakartı veya bir iş istasyonu / sunucu anakartı veya özel RAID denetleyicisi kullandığınız donanımdır. Birçok uygulama NCQ / AHCI tarafından tasarlanan kadar çok sayıda isteği desteklemez.
Paebbels
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.