วิธีการ (จริงๆ) ปิดการใช้งาน NCQ ใน Linux


13

ฉันติดตั้ง 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 ไปยังอุปกรณ์

ดังนั้นนี่คือคำถามของฉัน:

  1. ฉันจะปิดการใช้งาน NCQ ได้อย่างไร
  2. หากความลึกของคิว NCQ = 1 ไดรเวอร์ AHCI ของ Linux ใช้คำสั่ง QUEUED-DMA - ** หรือ DMA - ** หรือไม่
  3. ฉันจะตรวจสอบได้อย่างไรว่า NCQ ปิดใช้งาน/sys/block/sdX/device/queue_depthอยู่dmesgหรือไม่เนื่องจากการเปลี่ยนแปลงไม่มีการรายงาน

3
พารามิเตอร์เคอร์เนลlibata.force=noncq?
frostschutz

ขอบคุณสิ่งนี้ช่วยได้มากในการปิดใช้งาน NCQ อย่างสมบูรณ์ ฉันยังแก้ไขปัญหาประสิทธิภาพการเขียน
Paebbels

1
> dd if=/dev/zero of=/dev/sdb bs=32M count=32Dunno คุณตั้งใจจะทำอะไรกับสิ่งนั้น แต่มันจะeraseทั้งMBRและ gazillions ของบล็อกที่อยู่นอกเหนือ การทำเช่นนี้ในไดรฟ์ที่มีระบบหลักทำงานอยู่ (และgrubติดตั้งบน MBR เช่นเดียวกับในกรณีของฉัน) จะค่อนข้างอันตราย;) คิดว่าฉันจะเขียนความคิดเห็นนี้ที่นี่เพื่อป้องกันไม่ให้คนที่มีประสบการณ์น้อยลงทดลอง บรรทัด "เจ๋ง" ของคุณ ... ;)
ซินแท็กซ์เดอร์

@syntaxerror HDD เชื่อมต่อกับบอร์ด FPGA ในสภาพแวดล้อมดังกล่าวมีความซับซ้อนในการเขียนรูทีนฮาร์ดแวร์ที่จัดการ MBR และระบบไฟล์ได้อย่างสมบูรณ์แบบ ดังนั้นฉันจึงใช้ HDD เป็นสื่อกลางทั้งสองด้าน ในมุมมอง FPGA มันเป็นหน่วยความจำเชิงเส้นขนาดใหญ่ ใน Linux ฉันใช้ / dev / sdg และ C programm เพื่ออ่านและเขียนข้อมูลต่อไป
Paebbels

@ Paebbels โอ๊ะฉันไม่ควรมองข้าม FPGA bit อย่างนี้ย่อมเป็นสิ่งที่สมบูรณ์แตกต่างกันเพื่อ HDDs ร่วมกันของเราเชื่อมต่อกับรถโดยสารของเมนบอร์ดของเครื่องคอมพิวเตอร์เดสก์ทอปหรือโน้ตบุ๊ค ;-) "ในสภาพแวดล้อมเช่นมันไกลออกไปที่ซับซ้อนในการขั้นตอนการเขียนฮาร์ดแวร์ที่ดีที่สุดที่จัดการ MBRs และ acesses ระบบแฟ้ม" จริง คุณจะไม่สามารถที่จะทำโดยไม่ต้องHDL และฉันสามารถจินตนาการได้ว่าการเขียนโปรแกรมสิ่งนี้ไม่เหมาะกับคนใจ ... แม้ว่าตัวอย่างรหัส Wikipedia แสดงให้เห็นว่ามันเป็นการเดินเล่นในสวนสาธารณะ ;-)
syntaxerror

คำตอบ:


11

ขอบคุณ @frostschutz ฉันสามารถวัดประสิทธิภาพการเขียนใน Linux โดยไม่ต้องใช้คุณสมบัติ NCQ พารามิเตอร์การบูตเคอร์เนลlibata.force=noncqปิดการใช้งาน NCQ อย่างสมบูรณ์

เกี่ยวกับปัญหาประสิทธิภาพการเขียน Seagate 6TB ของฉันไม่มีการเปลี่ยนแปลงความเร็ว ลินุกซ์ยังคงถึง 180 MiB / s

แต่ฉันมีความคิดอื่น:
ไดรเวอร์ Linux ไม่ได้ใช้การถ่ายโอนชิ้นส่วน 32 MiB เคอร์เนลบัฟเฟอร์มีขนาดเล็กลงมากโดยเฉพาะถ้าเปิดใช้งาน NCQ ที่มี 32 คิว (32 คิว * 32 MiB => 1 GiB AHCI buffer)

ดังนั้นฉันจึงทดสอบตัวควบคุม SATA ของฉันด้วยการถ่ายโอน 256 vi และvoilàเป็นไปได้ที่จะไปถึง 185 MiB / s

ดังนั้นฉันเดาว่าเฟิร์มแวร์ Seagate ST6000AS0002 นั้นไม่สามารถจัดการการถ่ายโอน ATA ขนาดใหญ่ได้ มาตรฐาน ATA อนุญาตบล็อกโลจิคัลได้สูงสุด 65.536 ซึ่งเท่ากับ 32 MiB

SMR - บันทึกแม่เหล็ก Shingled

ความเป็นไปได้อีกประการสำหรับประสิทธิภาพการเขียนที่ไม่ดีอาจเป็นเทคนิคการบันทึกแม่เหล็กแบบ shingledซึ่ง Seagate ใช้ในอุปกรณ์จัดเก็บข้อมูลเหล่านี้ เห็นได้ชัดว่าฉันเรียกใช้เอฟเฟกต์ FPGA ที่หายาก


1
จากประสบการณ์ของฉันการปิดใช้งาน NCQ ให้ประสิทธิภาพที่เพิ่มขึ้นอย่างมาก ฉันได้ลองสิ่งนี้ในระบบเดสก์ท็อปเซิร์ฟเวอร์คุณตั้งชื่อมัน แม้แต่การใช้ฮาร์ดแวร์ประสิทธิภาพสูง 100% "เซิร์ฟเวอร์" ที่คุณคิดว่าจะได้รับประโยชน์จาก NCQ ไม่มันทั้งหมดแย่ที่สุดกว่าแค่ปิดใช้งาน IMHO NCQ เป็นหนึ่งในสิ่งที่เลวร้ายที่สุดที่เกิดขึ้นกับฮาร์ดไดรฟ์ ฉันไม่เคยเห็นมันมาก่อนให้ผลประโยชน์ไม่ว่าในกรณีใดไม่ว่าจะเป็นการ์ด RAID หรือชิปเซ็ตในตัว
ซีอาร์

คุณได้ใช้ระเบิดหรือการเข้าถึงแบบสุ่มหรือไม่? NCQ ไม่มีผลกระทบต่อการดำเนินการต่อเนื่อง แต่ปรับปรุงการเข้าถึงแบบสุ่ม
Paebbels

ขออภัยคุณยังไม่ได้ตอบคำถามของฉัน คำถามอื่นคือคุณใช้ฮาร์ดแวร์ใดที่ใช้เมนบอร์ดผู้บริโภคทั่วไปหรือเมนบอร์ดเวิร์กสเตชัน / เซิร์ฟเวอร์หรือตัวควบคุม RAID เฉพาะ การใช้งานจำนวนมากไม่รองรับการร้องขอที่โดดเด่นจำนวนมากตามที่ออกแบบโดย NCQ / AHCI
Paebbels
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.