क्या ds के लिए bs पैरामीटर के लिए इष्टतम मान निर्धारित करने का कोई तरीका है?


70

इस अवसर पर मैंने ऑनलाइन टिप्पणियां देखीं, "सुनिश्चित करें कि आपने 'bs =' सेट किया है क्योंकि डिफ़ॉल्ट मान में बहुत लंबा समय लगेगा," और मेरे स्वयं के बेहद अवैज्ञानिक अनुभव, "अच्छी तरह से उस समय से अधिक लग रहे थे पिछले सप्ताह का समय ”ऐसा लगता है। इसलिए जब भी मैं 'dd' (आमतौर पर 1-2GB रेंज में) का उपयोग करता हूं, तो मैं बाइट्स पैरामीटर निर्दिष्ट करना सुनिश्चित करता हूं। मैं जिस भी ऑनलाइन गाइड से कॉपी कर रहा हूं उसमें निर्दिष्ट मूल्य का उपयोग करने के बारे में आधा समय; बाकी समय मैं कुछ संख्या निकालूंगा जो 'fdisk -l' सूची से समझ में आता है कि मैं क्या मान रहा हूं कि यह धीमा मीडिया है (उदाहरण के लिए एसडी कार्ड जो मैं लिख रहा हूं)।

किसी दिए गए स्थिति (मीडिया प्रकार, बस आकार, या जो कुछ भी मायने रखता है) के लिए, क्या "सर्वोत्तम" मूल्य निर्धारित करने का एक तरीका है? क्या यह निर्धारित करना आसान है? यदि नहीं, तो क्या वहाँ 90-95% पाने का एक आसान तरीका है? या "सिर्फ 512 से कुछ बड़ा उठाओ" भी सही उत्तर?

मैंने स्वयं प्रयोग करने की कोशिश करने के बारे में सोचा है, लेकिन (बहुत काम होने के अलावा) मुझे यकीन नहीं है कि कारक उत्तर पर क्या प्रभाव डालते हैं, इसलिए मुझे नहीं पता कि एक अच्छा प्रयोग कैसे किया जाए।


एक ही स्टोरेज मीडियम में लिखना एक अलग स्टोरेज मीडियम में लिखने से अलग है और इसके लिए अलग-अलग इष्टतम सेटिंग्स की आवश्यकता होगी, ऐसे कई वेरिएबल्स हैं, जो डिवाइस के प्रकार, स्पीड, कैशे और इसी तरह सभी के लिए अलग-अलग होंगे। मेरी मशीन पर bs = 256M इष्टतम है।

जवाबों:


27

ddपुराने आईबीएम मेनफ्रेम टेपों का अनुवाद करने की आवश्यकता होने पर वापस से तारीखें, और ब्लॉक आकार को टेप लिखने के लिए उपयोग किए जाने वाले से मेल खाना पड़ता था या डेटा ब्लॉक को छोड़ दिया जाता था या काट दिया जाता था। (9-ट्रैक टेप बारीक थे। खुशी है कि वे लंबे समय से मृत हैं।) इन दिनों, ब्लॉक का आकार डिवाइस क्षेत्र के आकार का एक बहु होना चाहिए (आमतौर पर 4KB, लेकिन हाल के डिस्क पर बहुत बड़ा हो सकता है और बहुत छोटे अंगूठे पर हो सकता है ड्राइव छोटी हो सकती है, लेकिन 4KB एक उचित मध्य मैदान है) और प्रदर्शन के लिए बेहतर है। मैं अक्सर हार्ड ड्राइव के साथ 1 एमबी ब्लॉक आकार का उपयोग करता हूं। (हमारे पास इन दिनों भी फेंकने के लिए बहुत अधिक मेमोरी है।)


हार्ड ड्राइव या USB मास स्टोरेज डिवाइस 512 या 4096 (नए) बाइट्स हैं। ऑप्टिकल और डायरेक्ट एक्सेस फ्लैश मीडिया 2048 बाइट्स है। 4096 बाइट्स के साथ गलत नहीं हो सकता।
LawrenceC

3
कॉपी करने वाले प्रोग्राम के ब्लॉक का आकार अंतर्निहित डिवाइस की विशेषताओं (टेप को छोड़कर) के साथ कुछ भी क्यों नहीं होना चाहिए? कर्नेल अपनी बफरिंग (और कभी-कभी प्रीफ़ेटिंग) भी करता है।
गाइल्स

1
भिन्नात्मक बफ़र्स को कम करने के लिए; संरेखित बफ़र्स का उपयोग करते समय सामान्य रूप से चीज़ें तेज़ हो जाती हैं क्योंकि कर्नेल बफर पढ़ना शुरू कर सकता है / सेक्टर (या बेहतर, ट्रैक या सिलेंडर) पर लिख सकता है, लेकिन मुझे लगता है कि आधुनिक ड्राइव उन के बारे में झूठ बोलते हैं) और कर्नेल बफर सीमाएं, क्योंकि कर्नेल नहीं है सामान को छोड़ना या अतिरिक्त सामान पढ़ना या आंशिक बफर को प्रबंधित करना। निश्चित रूप से आप बस कर्नेल को यह सब बता सकते हैं, लेकिन यदि आप डेटा के गीगाबाइट की नकल कर रहे हैं, तो अतिरिक्त काम कॉपी समय को काफी कम कर सकता है।
22:00 पर geekosaur

आपको (आम तौर पर) यह शामिल करने की आवश्यकता है @Gillesकि क्या आप चाहते हैं कि मुझे आपकी टिप्पणी का उत्तर दिया जाए, देखें कि टिप्पणी @replies कैसे काम करती है? । चूँकि मैं इस तरह से गुजर रहा था: वैसे भी कर्नेल सभी से निपटेगा। आपका दावा है कि "वह अतिरिक्त काम कॉपी समय को काफी कम कर सकता है" मेरे बेंचमार्क से सहमत नहीं है, लेकिन विभिन्न प्रणालियों में अलग-अलग व्यवहार हो सकते हैं, इसलिए कृपया समय का भी योगदान दें!
गाइल्स

@ गिल्स: क्षमा करें, मैंने आपसे मूल प्रश्नकर्ता के लिए गलती की थी।
23

60

इष्टतम ब्लॉक आकार निर्धारित करने का एक तरीका है, और यह एक बेंचमार्क है। मैंने अभी एक त्वरित बेंचमार्क बनाया है। परीक्षण मशीन एक पीसी चल रहा है डेबियन जीएनयू / लिनक्स, जिसमें कर्नेल 2.6.32 और कोरुटिल्स 8.5 है। दोनों फाइलसिस्टम एक हार्ड डिस्क विभाजन पर LVM वॉल्यूम पर ext3 हैं। स्रोत फ़ाइल 2GB (सटीक होने के लिए 2040000kB) है। कैशिंग और बफ़रिंग सक्षम हैं। प्रत्येक रन से पहले, मैंने कैश को खाली कर दिया sync; echo 1 >|/proc/sys/vm/drop_caches। भाग समय syncमें बफ़र्स को फ्लश करने के लिए एक फाइनल शामिल नहीं है ; अंतिम sync1 सेकंड के आदेश पर होता है। sameरन ही फाइल सिस्टम पर प्रतियां थे; diffरन एक अलग हार्ड डिस्क पर एक फाइल सिस्टम के लिए प्रतियां थे। संगति के लिए, रिपोर्ट की गई दीवार घड़ी समय के साथ प्राप्त की जाती हैtimeसेकंड में उपयोगिता। मैं केवल प्रत्येक कमांड को एक बार चलाता था, इसलिए मुझे नहीं पता कि समय में कितना भिन्नता है।

             same   diff
dd bs=64M    71.1   51.3
dd bs=1M     73.9   41.8
dd bs=4k     79.6   48.5
dd bs=512    85.3   48.9
cat          76.2   41.7
cp           77.8   45.3

निष्कर्ष: एक बड़ा ब्लॉक आकार (कई मेगाबाइट) मदद करता है, लेकिन नाटकीय रूप से नहीं (उसी-ड्राइव प्रतियों के लिए मेरी अपेक्षा बहुत कम)। और catऔर cpइतनी बुरी तरह से प्रदर्शन नहीं करते हैं। इन नंबरों के साथ, मैं ddपरेशान करने लायक नहीं हूं । साथ जाओ cat!


मैं ओपी को अपनी बेंचमार्किंग करने की सलाह दूंगा, लेकिन फिर भी, अच्छा जवाब!
नवजाल

5
@ निखिल >|वही है जो >इसके अलावा है set -o noclobber, शेल शिकायत करेगा कि यदि आप उपयोग करते हैं तो फ़ाइल मौजूद है >
गिल्स

2
@ मासी हां, अगर मुझे पूरी डिस्क को क्लोन करना है, तो मैं उपयोग करूंगा cat। आप बेहतर तरीके की तलाश में क्यों हैं? इसमें गलत क्या है cat?
गिल्स

5
@ मासी catसिर्फ इसके इनपुट को इसके आउटपुट में कॉपी करता है। यदि आप अविश्वसनीय मीडिया से कॉपी करना चाहते हैं, और अपठनीय भागों को छोड़ देते हैं या कई बार पुन: प्रयास करते हैं, तो यह एक अलग समस्या है, जिसके लिए ddrescueबहुत अच्छी तरह से काम करता है।
गाइल्स

1
@sudo आप कॉपी किए गए डेटा की मात्रा प्राप्त कर सकते हैं lsof। त्वरित गति एक डिस्क कॉपी के साथ बहुत प्रासंगिक नहीं है क्योंकि यह एक समान है ताकि आप बीप्स द्वारा स्थानांतरित बाइट्स को विभाजित कर सकें; यदि आप कुछ बेहतर चाहते हैं, तो आप उपयोग कर सकते हैं pv
गाइल्स

8

मैं गीकॉउस से सहमत हूं कि आकार कई ब्लॉक आकार का होना चाहिए, जो अक्सर 4K होता है।

यदि आप ब्लॉक का आकार ढूंढना चाहते हैं तो stat -c "%o" filenameशायद सबसे आसान विकल्प है।

लेकिन कहते हैं कि आप करते हैं dd bs=4K, इसका मतलब है कि यह करता है read(4096); write(4096); read(4096); write(4096)...

प्रत्येक सिस्टम कॉल में एक संदर्भ स्विच शामिल होता है, जिसमें कुछ ओवरहेड शामिल होता है, और I / O अनुसूचक पर निर्भर करता है, इंटरसेप्ड राइट्स के साथ रीड्स डिस्क को बहुत सारे सॉक्स करने का कारण बन सकता है। (शायद लिनक्स अनुसूचक के साथ एक प्रमुख मुद्दा नहीं है, लेकिन फिर भी कुछ सोचने के लिए।)

इसलिए यदि आप करते हैं bs=8K, तो आप डिस्क को एक बार में दो ब्लॉक पढ़ने की अनुमति देते हैं, जो संभवतः डिस्क पर एक साथ करीब हैं, लिखने के लिए कहीं और मांग करने से पहले (या किसी अन्य प्रक्रिया के लिए I / O सेवा करने के लिए)।

उस तर्क से, bs=16Kऔर भी बेहतर है, आदि।

तो मैं जानना चाहता हूं कि क्या कोई ऊपरी सीमा है जहां प्रदर्शन खराब होने लगता है, या यदि यह केवल स्मृति से घिरा हुआ है।


4
प्रोफ़ाइल, अटकलें मत!
गाइल्स

1
लिनक्स प्रोग्रामिंग इंटरफेस मेरे साथ सहमत है। अध्याय 13 देखें - फाइल I / O बफरिंग।
मिकेल

4
दिलचस्प बात यह है कि उनके बेंचमार्क बताते हैं कि 4K के ऊपर थोड़ा फायदा है।
मिकेल

4
इसके अलावा, जाहिर है कि आगे की विंडो को पढ़ने के लिए डिफ़ॉल्ट फ़ाइल 128 KB है, ताकि मूल्य फायदेमंद हो सके।
मिकेल

6
मेरे पास यहां एक 24 ड्राइव RAID50 तक पहुंच है, जहां bs = 8K मुझे 197MB / s मिलता है, लेकिन bs = 1M मुझे 2.2 GB / s मिलता है, जो कि RAID के सैद्धांतिक प्रवाह के करीब है। तो bs ALOT मायने रखता है। हालाँकि bs = 10M का उपयोग करने पर मुझे केवल 1.7GB / s मिलता है। तो यह कुछ सीमा से भी बदतर प्रतीत होता है, लेकिन निश्चित नहीं है कि क्यों।
जोसेफ गार्विन

5

गाइल्स कहते हैं, आप के लिए इष्टतम पैरामीटर निर्धारित कर सकते हैं bs करने का विकल्प dd बेंच मार्किंग से। यह, हालांकि, इस सवाल का जवाब देता है: आप आसानी से इस पैरामीटर को कैसे बेंचमार्क कर सकते हैं?

इस प्रश्न का मेरा अस्थायी उत्तर है: dd-opt का उपयोग करें , हाल ही में मैंने इस समस्या को हल करने के लिए जिस उपयोगिता पर काम करना शुरू किया है :)


1
आउटपुट की संवेदनशीलता क्या है? 90-95% या> 95%? मुझे नहीं लगता कि आप इसे बदल सकते हैं।
लेओ लेपोल्ड हर्ट्ज़ '11

1
@ मासी, मुझे डर है कि मैंने dd-optलंबे समय तक काम नहीं किया है । हालांकि, यह AGPLv3 के तहत लाइसेंस प्राप्त मुफ्त सॉफ्टवेयर है । इसलिए, इसे सुधारने और इसकी संवेदनशीलता / सटीकता को स्पष्ट करने के लिए स्वतंत्र महसूस करें!
सम्पाब्लोकपर

0

मैंने sdcard रीडर usb2.0 के लिए अनुकूलित किया है जो सबसे अच्छा लगता है bs=10M। मैंने 4k की कोशिश की, 16M पर, 8-10M के बाद कोई सुधार नहीं हुआ। आप देख सकते हैं कि हस्तांतरण दर माप कैसे कम हो जाता है ... डिवाइस पर बफ़र्स को लोड करने के कारण सबसे अधिक संभावना है, फिर डिवाइस को वास्तविक माध्यम में स्थानांतरित करने की प्रतीक्षा कर रहा है।

angstrom/sdcard# dd if=/dev/zero of=/dev/sdb bs=10M
123+0 records in
123+0 records out
1289748480 bytes (1.3 GB) copied, 21.4684 s, 60.1 MB/s
341+0 records in
341+0 records out
3575644160 bytes (3.6 GB) copied, 117.636 s, 30.4 MB/s
816+0 records in
816+0 records out
8556380160 bytes (8.6 GB) copied, 326.588 s, 26.2 MB/s
955+0 records in
955+0 records out
10013900800 bytes (10 GB) copied, 387.456 s, 25.8 MB/s
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.