मेरे RAID1 को पढ़ने की पहुँच से धीमा क्यों पढ़ा जाता है?


10

मैंने कुछ सरल प्रदर्शन परीक्षण किए हैं और ऐसा लगता है कि मेरे RAID1 से पढ़ना लिखने की तुलना में धीमा है:

root@dss0:~# for i in 1 2 3; do dd if=/dev/zero of=/dev/sda bs=1048576 count=131072; done
137438953472 bytes (137 GB) copied, 192.349 s, 715 MB/s
137438953472 bytes (137 GB) copied, 192.851 s, 713 MB/s
137438953472 bytes (137 GB) copied, 193.026 s, 712 MB/s
root@dss0:~# for i in 1 2 3; do dd if=/dev/sda of=/dev/null bs=1048576 count=131072; done
137438953472 bytes (137 GB) copied, 257.201 s, 534 MB/s
137438953472 bytes (137 GB) copied, 255.522 s, 538 MB/s
137438953472 bytes (137 GB) copied, 259.945 s, 529 MB/s

मैं समझता हूं कि dd एक प्रदर्शन परीक्षण उपकरण नहीं है, लेकिन यह परिणाम अभी भी एक आश्चर्य है।

सिस्टम विक्रेता द्वारा बनाया गया था और इसमें 16 जीबी रैम के साथ सुपरमाइक्रो मुख्य बोर्ड है। RAID नियंत्रक 1 GByte कैश के साथ एक मेगा 9271-8i है। SAS-933EL1 बैकप्लेन पर 8 2 TByte SAS डिस्क हैं। मैं केबल बिछाने के बारे में अनिश्चित हूं, नियंत्रक का एक कनेक्टर एसएएस बैकप्लेन में जाता है, दूसरा दो एसएटीए डिस्क पर जाता है जो ओएस पकड़ते हैं।

RAID1 को इस कमांड के साथ सेट किया गया था:

root@dss0:~# /opt/MegaRAID/MegaCli/MegaCli64 -CfgLdAdd -r1 [8:0,8:1,8:2,8:3,8:4,8:5,8:6,8:7] WB NORA Direct -a0
Adapter 0: Created VD 0
Adapter 0: Configured the Adapter!!
Exit Code: 0x00

root@dss0:~# /opt/MegaRAID/MegaCli/MegaCli64 -LDInfo -LALL -aALL
Adapter 0 -- Virtual Drive Information:
Virtual Drive: 0 (Target Id: 0)
Name                :
RAID Level          : Primary-1, Secondary-0, RAID Level Qualifier-0
Size                : 7.275 TB
Sector Size         : 512
Is VD emulated      : No
Mirror Data         : 7.275 TB
State               : Optimal
Strip Size          : 256 KB
Number Of Drives    : 8
Span Depth          : 1
Default Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Default Access Policy: Read/Write
Current Access Policy: Read/Write
Disk Cache Policy   : Disk's Default
Encryption Type     : None
PI type: No PI
Is VD Cached: No
Exit Code: 0x00

मैं उम्मीद करूंगा कि रीड एक्सेस कम से कम लिखने की पहुंच जितनी तेज हो, शायद उससे भी तेज हो। 715 MByte / sec लिखने की गति किसी एकल SAS / SATA कनेक्टर की 6 GBit सीमा के पास लगती है। यह शायद एसएएस बैकप्लेन के साथ एक कॉन्फ़िगरेशन या केबलिंग मुद्दा है? क्या SAS बैकप्लेन कॉन्फ़िगरेशन को मेगाएड कमांड के साथ क्वेर किया जा सकता है? कृपया सलाह दें।

अपडेट करें

जैसा कि poige और पीटर द्वारा निष्कासित किया गया था, धीमी-से-अपेक्षित प्रत्याशित प्रदर्शन संभवतः लिनक्स I / O-सब-सिस्टम के कैशिंग के कारण होता है।

जब मुझे dd कमांड में डायरेक्ट फ्लैग का उपयोग करना होता है

root@dss0:~# dd if=/dev/sda of=/dev/null bs=1048576 count=131072 iflag=direct
137438953472 bytes (137 GB) copied, 199.862 s, 688 MB/s

जो बहुत बेहतर है, लेकिन अभी भी 10% धीमा है कि लिखने की गति। Oflag का उपयोग करना = प्रत्यक्ष लेखन की गति को प्रभावित नहीं करता है।


सरल उत्तर: परिणाम के लिए प्रतीक्षा की आवश्यकता होती है, लेखन नहीं करता है।
डेविड शवार्ट्ज

जवाबों:


8

poige राइट कैश के बारे में बिल्कुल सही है, लेकिन यहां अधिक विवरण हैं।

zdos के साथ dd और राइट कैश का उपयोग बेंचमार्क के लिए सही तरीका नहीं है (जब तक आप राइट ऑफ कैश का परीक्षण नहीं करना चाहते हैं, जो कि शायद फ़ाइल सिस्टम के लिए केवल उपयोगी है, यह देखने के लिए कि यह मेटाडेटा को कितना सिंक करता है, नई फाइलें बनाता है, आदि। ) (और dd हमेशा गलत प्रकार का बेंचमार्क होता है, लेकिन यह बहुत ही बुनियादी परीक्षण के लिए काम करता है)

मेरा सुझाव है कि आप कम से कम एक विकल्प के साथ dd का उपयोग करें:

conv=fdatasync -> this will make it flush to disk before finishing and calculating speed
oflag=direct   -> this will make it skip the OS cache but not the disk cache
conv=sync      -> more like skipping the disk cache too, but not really ... just flushing it every block or something like that.

और शून्य का उपयोग न करें। कुछ स्मार्ट हार्डवेयर / सॉफ्टवेयर / फर्मवेयर कुछ शॉर्टकट का उपयोग कर सकते हैं यदि डेटा शून्य के रूप में अनुमानित है। यह विशेष रूप से सच है अगर वहाँ संपीड़न है जो मुझे लगता है कि आप उपयोग नहीं कर रहे हैं। इसके बजाय, स्मृति में एक यादृच्छिक फ़ाइल का उपयोग करें (जैसे / dev / shm)। urandom धीमा है, इसलिए आपको इसे दोबारा पढ़ने के लिए अस्थायी रूप से लिखने की आवश्यकता है। एक 50MB यादृच्छिक फ़ाइल बनाएँ:

dd if=/dev/urandom of=/dev/shm/randfile bs=1M count=50

इसे लिखने के लिए फ़ाइल को कई बार पढ़ें (यहाँ मैं इसे 6 बार पढ़ने के लिए बिल्ली का उपयोग करता हूँ):

dd if=<(cat /dev/shm/randfile{,,,,,}) of= ... conv=fdatasync

rm /dev/shm/randfile

यह भी ध्यान रखें कि समानांतर कार्यों के साथ raid1 रीड सबसे तेज हैं, इसलिए डिस्क का उपयोग स्वतंत्र रूप से किया जा सकता है। यह संभवतया स्मार्ट नहीं है कि विभिन्न डिस्क के साथ एक ही ऑपरेशन के विभिन्न भागों को पढ़ने के लिए डिस्क को समन्वयित किया जाए।


10

आपके प्रश्न के उत्तर की कुंजी आगे पढ़ी जाती है । एक बार, मैं भी उस मुद्दे को हुआ

IOW, इष्टतम अनुक्रमिक पढ़ने के प्रदर्शन के लिए सभी डिस्क को स्थायी रूप से इनपुट में शामिल किया जाना चाहिए।

जब आप ddw / o directio(देखें man dd) का उपयोग करते हैं , तो राइट ऑपरेशन तुरंत नहीं किया जा रहा है, लेकिन OS कैश के माध्यम से जाता है, इसलिए इसमें सभी डिस्क अनुक्रमिक को शामिल करने और अधिकतम संभव प्रदर्शन प्राप्त करने की अधिक संभावना है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.