मैंने VHDL में अपना खुद का सीरियल-एटीए होस्ट-बस-एडॉप्टर (HBA) लागू किया और इसे FPGA पर प्रोग्राम किया। एक FPGA चिप है जिसे किसी भी डिजिटल सर्किट के साथ प्रोग्राम किया जा सकता है। यह SATA या PCIe के लिए हाई स्पीड सिग्नल जेनरेट करने के लिए सीरियल ट्रांससीवर्स से भी लैस है।
यह SATA कंट्रोलर SATA 6 Gb / s लाइन दरों का समर्थन करता है और डिवाइस से 32 MiB चंक्स तक के डेटा को स्थानांतरित करने के लिए ATA-8 DMA-IN / OUT कमांड का उपयोग करता है। डिजाइन अधिकतम गति (जैसे कि सैमसंग एसएसडी 840 प्रो -> 550 से अधिक MiB / s) पर काम करने के लिए सिद्ध है।
कई SSD और HDD उपकरणों के साथ कुछ परीक्षणों के बाद, मैंने एक नया सीगेट 6 टीबी आर्काइव एचडीडी ( ST6000AS0002 ) खरीदा । यह HDD 190 MiB / s तक पठन प्रदर्शन तक पहुँचता है, लेकिन केवल 30 से 40 MiB / s लेखन प्रदर्शन!
इसलिए मैंने गहराई से खोदा और प्रेषित फ़्रेमों को मापा (हाँ जो कि एक FPGA डिजाइन के साथ संभव है)। जहाँ तक मैं बता सकता हूँ, सीगेट एचडीडी एक टुकड़े में स्थानांतरण के पहले 32 MiB प्राप्त करने के लिए तैयार है। यह स्थानांतरण 580 MiB / s की अधिकतम लाइन गति पर होता है। उसके बाद, एचडीडी शेष बाइट्स को 800 से अधिक एमएस के लिए स्टाल करता है ! फिर एचडीडी अगले 32 मिब प्राप्त करने के लिए तैयार है और 800 एमएस के लिए फिर से स्टाल है। सभी एक 1 GiB हस्तांतरण में 30 सेकंड की आवश्यकता होती है, जो लगभग 35 MiB / s के बराबर होती है।
मुझे लगता है कि इस HDD में 32 MiB राइट कैश है, जो फट साइकिल के बीच में फ्लश होता है। 32 से कम MiB के साथ डेटा ट्रांसफर यह व्यवहार नहीं दिखाता है।
मेरा नियंत्रक डेटा ट्रांसफर करने के लिए DMA-IN और DMA-OUT कमांड का उपयोग करता है। मैं QUEUED-DMA-IN और QUEUED-DMA-OUT कमांड का उपयोग नहीं कर रहा हूं, जिनका उपयोग NCQ सक्षम AHCI नियंत्रकों द्वारा किया जाता है। FPGA प्लेटफॉर्म पर AHCI और NCQ को लागू करना बहुत ही जटिल है और इसे मेरी एप्लिकेशन परत की आवश्यकता नहीं है।
मैं अपने लिनक्स पीसी पर इस परिदृश्य को पुन: पेश करना चाहूंगा, लेकिन लिनक्स एएचसीआई चालक में एनसीक्यू डिफ़ॉल्ट रूप से सक्षम है। मुझे NCQ को अक्षम करने की आवश्यकता है, इसलिए मैंने NCQ को अक्षम करने का वर्णन करने वाली इस वेबसाइट को पाया , लेकिन यह काम नहीं करता है।
लिनक्स पीसी अभी भी 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 ड्राइवर है जो QUEUED-DMA - ** या DMA - ** कमांड का उपयोग करता है?
- मैं कैसे जांच कर सकते हैं NCQ, अक्षम है, क्योंकि बदलते
/sys/block/sdX/device/queue_depth
में रिपोर्ट नहीं किया जाताdmesg
?
> dd if=/dev/zero of=/dev/sdb bs=32M count=32
डनो तुम उस के साथ क्या करना चाहते थे; लेकिन यह erase
दोनों एमबीआर और ब्लॉक से परे के gazillions होगा । इस पर चलने वाली मुख्य प्रणाली के साथ एक ड्राइव पर ऐसा करना (और grub
एमबीआर पर स्थापित है, जैसा कि मेरे मामले में) काफी खतरनाक होगा;) सोचा था कि मैं इसे एक टिप्पणी के रूप में लिखूंगा, कुछ कम अनुभवी लोगों को प्रयोग करने से रोकने के लिए आपकी "शांत" रेखा ...;)
libata.force=noncq
?