জিপিপের মাধ্যমে 'ডিডি' পাইপিং কেন সরাসরি কপির চেয়ে এত দ্রুত হয়?


79

আমি আমার নেটওয়ার্কের একটি কম্পিউটার থেকে একই নেটওয়ার্কের একটি কম্পিউটার থেকে 100 এমবিট / এস লাইন ধরে অন্য কম্পিউটারে পাথ ব্যাকআপ করতে চেয়েছিলাম। এই জন্য আমি করেছি

dd if=/local/path of=/remote/path/in/local/network/backup.img

যা আমাকে প্রায় 50 থেকে 100 কেবি / সেকেন্ডের খুব কম নেটওয়ার্ক ট্রান্সফার গতি দিয়েছে, যা চিরতরে নেওয়া হত। তাই আমি এটিকে থামিয়েছি এবং এটিকে আরও ছোট করার জন্য ফ্লাইতে ঝাঁপিয়ে দেখার চেষ্টা করব যাতে স্থানান্তর করার পরিমাণ কম হয়। তাই আমি

dd if=/local/path | gzip > /remote/path/in/local/network/backup.img.gz

তবে এখন আমি 1 এমবি / গুলি নেটওয়ার্ক ট্রান্সফার গতির মতো কিছু পেয়েছি, সুতরাং 10 থেকে 20 এর একটি ফ্যাক্টর দ্রুত। এটি লক্ষ্য করার পরে, আমি এটি বেশ কয়েকটি পাথ এবং ফাইলগুলিতে পরীক্ষা করেছি এবং এটি সর্বদা একই ছিল।

কেন বংশীধ্বনিতুল্য নেই ddমাধ্যমে gzipএকটি বৃহত গুণক দ্বারা আদান প্রদানের হার বৃদ্ধি পরিবর্তে শুধুমাত্র একটি বৃহৎ গুণক দ্বারা স্ট্রীমের bytelength হ্রাস? সংকোচনের সময় উচ্চতর সিপিইউ খরচ হওয়ায় আমি পরিবর্তে স্থানান্তর হারেও সামান্য হ্রাস আশা করেছি, তবে এখন আমি একটি ডাবল প্লাস পেয়েছি। এমন নয় যে আমি খুশি নই, তবে আমি কেবল ভাবছি। ;)


1
প্রারম্ভিক ইউনিক্সের ফাইল স্টোরেজের জন্য 512 বাইট ছিল স্ট্যান্ডার্ড ব্লক আকার। যেহেতু সবকিছুই ইউনিক্স / লিনাক্সের একটি ফাইল, তাই এটি প্রায় সমস্ত কিছুর জন্য ডিফল্ট হয়ে যায়। বেশিরভাগ ইউটিলিটির নতুন সংস্করণগুলি এটি বাড়িয়েছে তবে ডিডি নয়।
ডকসালভেজার

সহজ উত্তরটি হ'ল dd1MB / s এ আউটপুট করা হচ্ছে ... ঠিক ওয়েটিং gzipপাইপে। এটি ব্লকের আকারের সাথে খুব কম কাজ করেছে।
Tullo_x86

উত্তর:


100

ddডিফল্টরূপে একটি খুব ছোট ব্লক আকার ব্যবহার করে - 512 বাইট (!!)। অর্থাত, অনেক ছোট পড়েন এবং লেখেন। দেখে মনে হচ্ছে যে dd, আপনার প্রথম উদাহরণে নির্লজ্জভাবে ব্যবহৃত হয়েছে, খুব অল্প পরিমাণ পেলোড সহ প্রচুর নেটওয়ার্ক প্যাকেট তৈরি করেছিল, ফলে থ্রুপুট হ্রাস পাবে।

অন্যদিকে, gzipবৃহত্তর বাফারগুলির সাথে I / O করতে যথেষ্ট স্মার্ট। এটি হ'ল, সংখ্যার বড় সংখ্যক নেটওয়ার্কে লেখেন।

আপনি কি আরও ddবৃহত্তর bs=প্যারামিটার দিয়ে আবার চেষ্টা করতে পারেন এবং দেখতে পারেন যে এটি এবার আরও ভাল কাজ করে?


20
ধন্যবাদ, 3 বা 4 এমবি / সেকেন্ডের কোনও কিছুর -> দ্রুত নেটওয়ার্ক ট্রান্সফার ব্যতীত সরাসরি অনুলিপি gzipএবং চেষ্টা করে দেখুন copy bs=10Mহাই ব্লকসাইজ + gzipছোট ব্লকসাইজ + এর তুলনায় কিছু পরিবর্তন করেনি gzip
ফু বার

7
আপনি যদি দেখতে চান যে হাই ব্লক আকারগুলি গিজিপের পরে আরও একটি ডিডি চেষ্টা করে।
জোশুয়া

জিজিপ কি নিজস্ব আউটপুট বাফারিং করছে বা এটি কেবল স্টডিও ব্যবহার করে?
বার্মার

@ বারমার যদি আমি উত্সটি সঠিকভাবে পড়ছি তবে এটি কেবল write(3)বাফারের কাছে।

@ কংম্যা আপনি জিজিপের পরিবর্তে পিগজ ব্যবহার করতেও চেষ্টা করতে পারেন, এটি আরও দ্রুত কাজ করবে
জিওম্যাক

4

এদিকে দেরি করলেও আমি যুক্ত করতে পারি ...

একটি সাক্ষাত্কারে আমি একবার জিজ্ঞেস করা হয়েছিল বিট-জন্য-বিট তথ্য ক্লোনিং দ্রুত সম্ভব পদ্ধতি কী হবে ও অসভ্য ব্যবহার সাড়া ddবা dc3dd( DoD নিহিত )। সাক্ষাত্কারকারী নিশ্চিত করেছে যে পাইপ ddদেওয়া ddআরও দক্ষ, কারণ এটি একযোগে পড়ার / লেখার বা প্রোগ্রামার পদগুলিতে অনুমতি দেয় stdin/stdout, সুতরাং আল্টিম্যাটিকভাবে লেখার গতি দ্বিগুণ হয় এবং স্থানান্তর সময় অর্ধেক হয়।

dc3dd verb=on if=/media/backup.img | dc3dd of=/dev/sdb

1
আমি সত্য মনে করি না। আমি এখনই চেষ্টা করেছি। dd status=progress if=/dev/zero count=100000 bs=1M of=/dev/null22.5GB / s dd status=progress if=/dev/zero count=100000 bs=1M | dd of=/dev/null bs=1Mছিল, 2.7GB ছিল। সুতরাং পাইপ এটি ধীর করে তোলে।
মিথ্যা পকেট

0

কংগ্রেস সঠিক। আপনি ডিস্কের অবরুদ্ধ ব্লকগুলি রিমোট হোস্টে সংকুচিত করে স্ট্রিমিং করছেন। আপনার নেটওয়ার্ক ইন্টারফেস, নেটওয়ার্ক এবং আপনার দূরবর্তী সার্ভারটি সীমাবদ্ধতা। প্রথমে আপনাকে ডিডির পারফরম্যান্স পেতে হবে। ডিস্ক বাফার মেমরির সাথে একত্রিত এমন একটি বিএস = পরামিতি নির্দিষ্ট করে ডিস্ক থেকে সর্বাধিক কর্মক্ষমতা পাবেন। উদাহরণস্বরূপ বিএস = 32 এম বলুন। এরপরে ড্রাইটা বাফার থেকে স্যাটা বা সাস লাইন রেট স্ট্রেটে জিজিপের বাফার পূরণ করা হবে। ডিস্কটি পুটের মাধ্যমে আরও ভাল ক্রমান্বয়ে স্থানান্তর করার দিকে ঝুঁকবে। জিজিপ তথ্য প্রবাহে সংকুচিত করবে এবং আপনার অবস্থানে প্রেরণ করবে। আপনি যদি এনএফএস ব্যবহার করছেন যা এনএফএস সংক্রমণকে ন্যূনতম হতে দেবে। আপনি যদি এসএসএইচ ব্যবহার করে থাকেন তবে আপনি এসএসএইচ এনক্যাপসুলেশন এবং এনক্রিপশন ওভারহেড এনক্রিউর করুন। আপনি যদি নেটক্যাট ব্যবহার করেন তবে আপনার মাথার উপরে কোনও এনক্রিপশন নেই।


0

আমি এখানে ধরে নিয়েছি যে আপনি যে "স্থানান্তর গতি" উল্লেখ করছেন তা দ্বারা রিপোর্ট করা হচ্ছে dd। এটি আসলে ddঅর্থবোধ করে , কারণ বাস্তবে প্রতি সেকেন্ডে 10x ডেটার পরিমাণ হস্তান্তরিত হয় ! তবে, ddনেটওয়ার্কের মাধ্যমে স্থানান্তরিত হচ্ছে না - সেই কাজটি gzipপ্রক্রিয়া দ্বারা পরিচালিত হচ্ছে ।

কিছু প্রসঙ্গ: gzipএর ইনপুট পাইপ থেকে যত তাড়াতাড়ি এটি এর অভ্যন্তরীণ বাফার সাফ করতে পারে তত ডেটা গ্রাস করবে। যে গতিতে gzipবাফার খালি হয় তা কয়েকটি কারণের উপর নির্ভর করে:

  • আই / ও রাইন্ড ব্যান্ডউইথ (যা নেটওয়ার্কের দ্বারা বন্ধ রয়েছে এবং স্থির রয়েছে)
  • আই / ও রিড ব্যান্ডউইথ (যা আধুনিক মেশিনে স্থানীয় ডিস্ক থেকে 1MB / s পড়ার চেয়ে অনেক বেশি বাড়তে চলেছে, সম্ভবত এটি কোনও সম্ভাব্য বাধা নয়)
  • এর সংকোচনের অনুপাত (যা আমি আপনার 10x স্পিডআপ 10% এর কাছাকাছি বলে ধরে নেব, এটি ইঙ্গিত করে যে আপনি লগ ফাইল বা কিছু এক্সএমএলের মতো কোনও ধরণের উচ্চ-পুনরাবৃত্তিযুক্ত পাঠ্যকে সংকুচিত করছেন)

সুতরাং এই ক্ষেত্রে, নেটওয়ার্ক 100 কেবি / গুলি পরিচালনা করতে পারে এবং gzip10: 1 (এবং সিপিইউ দ্বারা বাধা দেওয়া হচ্ছে না) এর কাছাকাছি তথ্য সংকুচিত করে। এর অর্থ এই যে এটি 100 কেবি / গুলি আউটপুট দেওয়ার সময় 1 এমবি / সেগুলি গ্রহণgzip করতে পারে এবং ব্যবহারের হার যা দেখতে পায় তা হ'ল ।dd

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