ฉันติดตั้ง Serial-ATA Host-Bus-Adapter (HBA) ของตัวเองใน VHDL และตั้งโปรแกรมไว้บน FPGA FPGA เป็นชิปที่สามารถตั้งโปรแกรมกับวงจรดิจิตอลใด ๆ มันยังมีตัวรับส่งสัญญาณแบบอนุกรมเพื่อสร้างสัญญาณความเร็วสูงสำหรับ SATA หรือ PCIe
คอนโทรลเลอร์ SATA นี้รองรับอัตราสาย SATA 6 Gb / s และใช้คำสั่ง ATA-8 DMA-IN / OUT เพื่อถ่ายโอนข้อมูลในกลุ่มก้อนสูงสุด 32 MiB ไปและกลับจากอุปกรณ์ การออกแบบได้รับการพิสูจน์แล้วว่าทำงานด้วยความเร็วสูงสุด (เช่น Samsung SSD 840 Pro -> มากกว่า 550 MiB / s)
หลังจากการทดสอบกับอุปกรณ์ SSD และ HDD หลายตัวฉันซื้อ Seagate HDD 6 TB Archive ( ST6000AS0002 ) ใหม่ HDD นี้มีประสิทธิภาพการอ่านสูงสุด 190 MiB / s แต่มีประสิทธิภาพการเขียนเพียง 30 ถึง 40 MiB / s!
ดังนั้นฉันจึงขุดและวัดเฟรมที่ส่งได้ (ใช่ที่เป็นไปได้ด้วยการออกแบบ FPGA) เท่าที่ฉันสามารถบอกได้ Seagate HDD พร้อมที่จะรับการถ่ายโอน 32 MiB แรกในหนึ่งชิ้น การถ่ายโอนนี้เกิดขึ้นที่ความเร็วของสายสูงสุดที่ 580 MiB / s หลังจากนั้น HDD จะหยุดไบต์ที่เหลือนานกว่า800 ms! จากนั้น HDD พร้อมที่จะรับ 32 MiB ถัดไปและแผงลอยอีกครั้งเป็นเวลา 800 มิลลิวินาที ทั้งหมดในการถ่ายโอน 1 GiB นั้นต้องการมากกว่า 30 วินาทีซึ่งเท่ากับประมาณ 35 MiB / s
ฉันคิดว่า HDD นี้มีแคชการเขียน 32 MiB ซึ่งถูกล้างออกระหว่างรอบการถ่ายภาพต่อเนื่อง การถ่ายโอนข้อมูลที่น้อยกว่า 32 MiB จะไม่แสดงพฤติกรรมนี้
คอนโทรลเลอร์ของฉันใช้คำสั่ง DMA-IN และ DMA-OUT เพื่อถ่ายโอนข้อมูล ฉันไม่ได้ใช้คำสั่ง QUEUED-DMA-IN และ QUEUED-DMA-OUT ซึ่งใช้งานโดยคอนโทรลเลอร์ AHCI ที่สามารถใช้งาน NCQ ได้ การใช้ AHCI และ NCQ บนแพลตฟอร์ม FPGA นั้นซับซ้อนมากและไม่ต้องการโดยชั้นแอปพลิเคชันของฉัน
ฉันต้องการจำลองสถานการณ์นี้บนพีซี Linux ของฉัน แต่ไดรเวอร์ Linux AHCI เปิดใช้งาน NCQ ตามค่าเริ่มต้น ฉันต้องปิดการใช้งาน NCQ ดังนั้นฉันจึงพบเว็บไซต์นี้ที่อธิบายวิธีปิดใช้งาน NCQแต่มันไม่ทำงาน
พีซี Linux ยังมีประสิทธิภาพการเขียนที่ 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
ฉันคิดว่ามีความผิดในบทความจากด้านบน: การลดความลึกคิว NCQ เป็น 1 ไม่ได้ปิดใช้งาน NCQ มันอนุญาตให้ระบบปฏิบัติการใช้เพียงหนึ่งคิวเท่านั้น มันยังสามารถใช้คำสั่ง QUEUED-DMA - ** สำหรับการถ่ายโอน ฉันต้องปิดการใช้งาน NCQ จริงๆเพื่อให้ไดรเวอร์ออกคำสั่ง DMA-IN / OUT ไปยังอุปกรณ์
ดังนั้นนี่คือคำถามของฉัน:
- ฉันจะปิดการใช้งาน NCQ ได้อย่างไร
- หากความลึกของคิว NCQ = 1 ไดรเวอร์ AHCI ของ Linux ใช้คำสั่ง QUEUED-DMA - ** หรือ DMA - ** หรือไม่
- ฉันจะตรวจสอบได้อย่างไรว่า NCQ ปิดใช้งาน
/sys/block/sdX/device/queue_depth
อยู่dmesg
หรือไม่เนื่องจากการเปลี่ยนแปลงไม่มีการรายงาน
> dd if=/dev/zero of=/dev/sdb bs=32M count=32
Dunno คุณตั้งใจจะทำอะไรกับสิ่งนั้น แต่มันจะerase
ทั้งMBRและ gazillions ของบล็อกที่อยู่นอกเหนือ การทำเช่นนี้ในไดรฟ์ที่มีระบบหลักทำงานอยู่ (และgrub
ติดตั้งบน MBR เช่นเดียวกับในกรณีของฉัน) จะค่อนข้างอันตราย;) คิดว่าฉันจะเขียนความคิดเห็นนี้ที่นี่เพื่อป้องกันไม่ให้คนที่มีประสบการณ์น้อยลงทดลอง บรรทัด "เจ๋ง" ของคุณ ... ;)
libata.force=noncq
?