বিএস প্যারামিটারের ডিডি করার জন্য সর্বোত্তম মান নির্ধারণ করার কোনও উপায় আছে কি?


70

উপলক্ষে আমি অনলাইনে মন্তব্যগুলি দেখেছি "আপনি 'বিএস =' সেট করেছেন তা নিশ্চিত করুন কারণ ডিফল্ট মানটি খুব বেশি সময় নেয়," এবং আমার নিজের অত্যন্ত-অবৈজ্ঞানিক অভিজ্ঞতা, "এটির চেয়ে অন্যটি বেশি সময় নেয় বলে মনে হয় গত সপ্তাহে সময় "এটি বহন করা বলে মনে হচ্ছে। তাই যখনই আমি 'ডিডি' ব্যবহার করি (সাধারণত 1-2 জিবি রেঞ্জের মধ্যে) আমি বাইট প্যারামিটারটি নির্দিষ্ট করে দেওয়ার বিষয়টি নিশ্চিত করি। আমি যে অনলাইন অনলাইন গাইড থেকে অনুলিপি করছি তাতে উল্লিখিত মানটি প্রায় অর্ধেক সময় ব্যবহার করি; বাকি সময় আমি এমন কিছু নম্বর বাছাই করব যা আমি 'fdisk -l' তালিকা থেকে বোঝাচ্ছি যা আমি অনুমান করি তার জন্য ধীর মিডিয়া (যেমন আমি যে এসডি কার্ডটি লিখছি) is

প্রদত্ত পরিস্থিতির জন্য (মিডিয়া টাইপ, বাসের আকার, বা অন্য যে কোনও বিষয়), একটি "সেরা" মান নির্ধারণ করার উপায় আছে কি? এটি নির্ধারণ করা সহজ? যদি তা না হয়, তবে সেখানে 90-95% পথ পাওয়ার সহজ উপায় কি আছে? বা "সঠিকভাবে 512 এর চেয়ে বড় কিছু চয়ন করুন" এমনকি সঠিক উত্তরটিও রয়েছে?

আমি নিজেই পরীক্ষার চেষ্টা করার কথা ভেবেছিলাম, তবে (অনেক বেশি কাজ করার পাশাপাশি) আমি নিশ্চিত না যে কোন কারণগুলি উত্তরটির উপর প্রভাব ফেলবে, তাই আমি কীভাবে একটি ভাল পরীক্ষার নকশা করব তা জানি না।


একই স্টোরেজ মিডিয়ামে লেখার জন্য আলাদা স্টোরেজ মিডিয়ামে লেখার চেয়ে আলাদা এবং বিভিন্ন অনুকূল সেটিংসের প্রয়োজন হবে, অনেকগুলি ভেরিয়েবল রয়েছে যা ডিভাইসের ধরণ, গতি, ক্যাশে ইত্যাদির উপর নির্ভর করে সবার জন্য আলাদা হবে। আমার মেশিনে বিএস = 256 এম সর্বোত্তম।

উত্তর:


27

ddপুরানো আইবিএম মেইনফ্রেম টেপগুলি অনুবাদ করার জন্য যখন পূর্বের তারিখগুলি উপস্থিত ছিল এবং টেপ বা ডেটা ব্লকগুলি লেখার জন্য ব্যবহৃত ব্লকের আকারটি বাদ দেওয়া বা ছাঁটা হত match (9 টি ট্র্যাকের টেপগুলি ফিনিकी ছিল glad তারা খুব বেশি দিন মরেছে বলে খুশী হোন)) আজকাল, ব্লকের আকারটি ডিভাইস সেক্টরের আকারের একাধিক হওয়া উচিত (সাধারণত 4KB, তবে খুব সাম্প্রতিক ডিস্কগুলিতে অনেক বড় এবং খুব ছোট থাম্বের উপরে থাকতে পারে) ড্রাইভগুলি ছোট হতে পারে, তবে 4KB নির্বিশেষে একটি যুক্তিসঙ্গত মাঝারি স্থল) এবং পারফরম্যান্সের জন্য আরও বৃহত্তর। আমি প্রায়শই হার্ড ড্রাইভ সহ 1 এমবি ব্লক আকার ব্যবহার করি। (এই দিনগুলিতেও আমাদের অনেক বেশি স্মৃতি রয়েছে))


হার্ড ড্রাইভ বা ইউএসবি ভর স্টোরেজ ডিভাইসগুলি হয় হয় 512 বা 4096 (আরও নতুন) বাইট। অপটিকাল এবং সরাসরি অ্যাক্সেস ফ্ল্যাশ মিডিয়া 2048 বাইট হয়। 4096 বাইট দিয়ে ভুল হতে পারে না।
LawrenceC

3
কেন অনুলিপি প্রোগ্রামটির ব্লক আকারের অন্তর্নিহিত ডিভাইসের বৈশিষ্ট্যগুলি (টেপগুলি ব্যতীত) সাথে কিছু করা উচিত? কার্নেল যাইহোক তার নিজস্ব বাফারিং (এবং কখনও কখনও প্রিফেকিং) করে।
গিলস

1
ভগ্নাংশ বাফার হ্রাস করতে; আপনি যখন সারিবদ্ধ বাফারগুলি ব্যবহার করেন তখন সাধারণ জিনিসগুলি দ্রুত হয় কারণ কার্নেল সেক্টরে বাফার পড়তে / লিখতে শুরু করতে পারে (বা আরও ভাল, ট্র্যাক বা সিলিন্ডার, তবে আমি মনে করি আধুনিক ড্রাইভগুলি সেগুলি সম্পর্কে মিথ্যা) এবং কার্নেল বাফার সীমানা, কারণ কার্নেলটি নেই স্টাফ এড়িয়ে যেতে বা অতিরিক্ত স্টাফ পড়তে বা আংশিক বাফার পরিচালনা করতে। অবশ্যই আপনি কার্নেলটিকে এগুলির সাথে সমস্ত কিছু করতে দেন তবে আপনি যদি গিগা বাইটের ডেটা অনুলিপি করেন তবে অতিরিক্ত কাজ অনুলিপি করার সময়টি কপির সময়কে বেশ কমাতে পারে।
গাইকোসৌর

আপনি (সাধারণত) @Gillesআপনার মন্তব্য জবাব সম্পর্কে আমাকে অবহিত করতে চান তবে আপনাকে অন্তর্ভুক্ত করতে হবে, দেখুন মন্তব্য কীভাবে @ রিপ্লাইস কাজ করে? । যেহেতু আমি পাশ দিয়ে যাচ্ছিলাম: কার্নেল যে কোনও উপায়ে এটি মোকাবেলা করবে। আপনার দাবী যে "সেই অতিরিক্ত কাজটি কপির সময়কে যথেষ্ট পরিমাণে হ্রাস করতে পারে" আমার মানদণ্ডগুলির সাথে একমত নয়, তবে বিভিন্ন সিস্টেমে বিভিন্ন আচরণ থাকতে পারে, তাই দয়া করে সময়কেও অবদান রাখুন!
গিলস

@ গিলস: দুঃখিত, আমি আপনাকে আসল প্রশ্নকারীকে ভুল করেছিলাম।
গাইকোসৌর

60

অনুকূল ব্লকের আকার নির্ধারণের একটি উপায় আছে এবং এটি একটি মানদণ্ড। আমি মাত্র একটি দ্রুত মানদণ্ড তৈরি করেছি made পরীক্ষা মেশিনটি একটি পিসি যা ডিবিয়ান জিএনইউ / লিনাক্স দিয়ে চালিত হয়, কার্নেল ২.6.৩২ এবং কোর্টিলস ৮.৫ রয়েছে। জড়িত উভয় ফাইল সিস্টেম একটি হার্ড ডিস্ক পার্টিশনের LVM ভলিউমের ext3 3 উত্স ফাইলটি 2 জিবি (2040000 কেবি সুনির্দিষ্ট হতে হবে)। ক্যাচিং এবং বাফারিং সক্ষম রয়েছে। প্রতিটি রান করার আগে আমি ক্যাশেটি খালি করে দিয়েছিলাম 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

উপসংহার: একটি বৃহত ব্লকের আকার (বেশ কয়েকটি মেগাবাইট) সহায়তা করে, তবে নাটকীয়ভাবে নয় (একই ড্রাইভের অনুলিপিগুলির জন্য আমার চেয়ে খুব কম) than এবং catএবং cpখুব খারাপভাবে পারফর্ম করবেন না। এই সংখ্যাগুলির সাথে, আমি ddবিরক্ত করার মতো মূল্য খুঁজে পাই না । সাথে যান cat!


আমি ওপিকে তার নিজস্ব বেঞ্চমার্কিং করার পরামর্শ দিই, তবে যাইহোক, সুন্দর উত্তর!
নিনজালজ

5
@Nikhil >|হিসাবে একই >যে অধীনে ছাড়া set -o noclobber, শেল অভিযোগ করবে যদি আপনি ব্যবহার ফাইল বিদ্যমান >
গিলস 21

2
@ মাসি হ্যাঁ, আমি যদি একটি সম্পূর্ণ ডিস্ক ক্লোন করতে চাই, তবে আমি এটি ব্যবহার করব cat। কেন আপনি আরও ভাল উপায় খুঁজছেন? এর সাথে কী হয়েছে cat?
গিলস

5
@ মসি catকেবলমাত্র তার ইনপুটটিকে এর আউটপুটে অনুলিপি করে। আপনি যদি অবিশ্বাস্য মিডিয়া থেকে অনুলিপি করতে চান এবং অপঠনযোগ্য অংশগুলি এড়িয়ে যেতে বা একাধিকবার চেষ্টা করতে চান তবে এটি অন্যরকম সমস্যা, যার জন্য ddrescueবেশ সুন্দরভাবে কাজ করে।
গিলস

1
@ সুডো আপনি যে পরিমাণ অনুলিপি করেছেন তার পরিমাণ পেতে পারেন 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 কেবি, যাতে মানটি উপকারী হতে পারে।
মিকেল

6
আমার এখানে 24 ড্রাইভের RAID50 এ অ্যাক্সেস রয়েছে, যেখানে বিএস = 8 কে আমাকে 197 এমবি / এস দেয় তবে বিএস = 1 এম আমাকে 2.2 গিগাবাইট / এস দেয় যা র‌্যাডের তাত্ত্বিক থ্রুপুটটির কাছাকাছি। সুতরাং বিএস বিষয়গুলি অনেকটাই গুরুত্বপূর্ণ। তবে বিএস = 10 এম ব্যবহার করে আমি কেবল 1.7 জিবি / এস পাই get সুতরাং এটি কিছু প্রান্তিকের চেয়েও খারাপ হয়ে উঠছে, তবে কেন তা নিশ্চিত নয় not
জোসেফ গারভিন

5

গিলেজ বলেছেন, আপনার জন্য অনুকূল পরামিতি নির্ধারণ করতে পারেন BS করার বিকল্প dd মাপকাঠিতে দ্বারা। এটি, যদিও প্রশ্নটি জাগায়: আপনি কীভাবে এই প্যারামিটারটিকে সুবিধামত বেঞ্চমার্ক করতে পারেন?

এই প্রশ্নের আমার অস্থায়ী উত্তরটি হ'ল: ডিডি-অপ্ট ব্যবহার করুন , আমি সম্প্রতি যে সমস্যাটি এই সমস্যাটি সমাধান করার জন্য কাজ শুরু করেছি :)


1
আউটপুট সংবেদনশীলতা কি? 90-95% বা> 95%? আপনি এটি পরিবর্তন করতে পারেন তা আমি খুঁজে পাই না।
লিও লোপোল্ড হার্টজ

1
@ মাশি, আমি ভয় করি আমি dd-optদীর্ঘদিন ধরে কাজ করিনি । তবে এটিজিপিএলভি 3 এর আওতায় লাইসেন্সযুক্ত ফ্রি সফটওয়্যার । সুতরাং, এটিকে উন্নত করতে এবং এর সংবেদনশীলতা / নির্ভুলতার উদ্রেক করতে নির্দ্বিধায়!
সাম্পাব্লুকুপার

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.