কেন একটি নেটওয়ার্ক জুড়ে একটি ফাইলের জন্য ডেল্টা স্থানান্তর ব্যবহার করে আরএসসিএনসি হচ্ছে না?


15

আমি এই প্রশ্নটি এবং এই প্রশ্নটির দিকে নজর রেখেছি , তবে তারা যে লক্ষণগুলি দেখছি সেগুলি তারা সম্বোধন করেছে বলে মনে হয় না।

আমার কাছে একটি বড় লগ ফাইল রয়েছে (প্রায় 600 এমবি) যা আমি সেলুলার নেটওয়ার্ক জুড়ে স্থানান্তর করার চেষ্টা করছি। কারণ এটা শুধু সংযোজন করা হয় একটি লগ ফাইল (যদিও এটি শুধুমাত্র ঢোকান সঙ্গে একটি SQLite ডাটাবেসের মধ্যে আসলে সম্পাদনা করা হচ্ছে, তাই এটি নয় বেশ যে হিসাবে সহজ হিসাবে, কিন্তু শেষ 4K পৃষ্ঠার বাদে (অথবা হয়তো কয়েকটি) ফাইলটি প্রতিবার অভিন্ন It এটি গুরুত্বপূর্ণ যে কেবলমাত্র পরিবর্তন (এবং যে কোনও চেকসাম সংক্রমণ করা দরকার) আসলে প্রেরণ করা যায়, কারণ ডেটা সংযোগটি মিটার করা হয়।

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

(সংবেদনশীল তথ্য সরানোর জন্য স্যানিটাইজড) কমান্ডটি আমি ব্যবহার করছি:

rsync 'ssh -p 9999' --progress LogFile michael@my.host.zzz:/home/michael/logs/LogFile

আমি শেষে যে আউটপুটটি পাই তা দেখতে এই রকম দেখাচ্ছে:

LogFile
    640,856,064 100%   21.25MB/s   0:00:28 (xfr$1, to-chk=0/1)

কোনও ধরণের স্পিডআপের কথা নেই।

আমি সন্দেহ করি যে সমস্যাগুলি নিম্নলিখিতগুলির মধ্যে একটি হতে পারে:

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

আমি নিম্নলিখিতটি বাতিল করে দিয়েছি:

  • স্থানীয় নেটওয়ার্কে বদ্বীপান্তর স্থানান্তরিত হয়নি। বাতিল হয়ে গেছে কারণ আমি ইন্টারনেটের মাধ্যমে স্থানান্তর সম্পাদন করার চেষ্টা করছি
  • চেকসাম গণনার কারণে ওভারহেড। আমি এই আচরণটি দ্রুত এবং ধীর ওয়াইফাই সংযোগে উভয়ই দেখেছি এবং স্থানান্তর হারটি গণনা সীমাবদ্ধ বলে মনে হয় না।

1
but with the exception of the last 4k page (or maybe a few) the file is identical each time. আপনি কি সত্যিই এটি যাচাই করেছেন cmp? বা আরও ভাল, সঙ্গে xdeltaবা কিছু? আপনি যদি সত্যিই স্থানান্তর আকারটি হ্রাস করতে চান তবে স্থানীয়ভাবে পুরানো এবং নতুন সংস্করণগুলি রাখুন, যাতে আপনি স্থানীয়ভাবে একটি ন্যূনতম বাইনারি ডিফের গণনা করতে পারেন (আরএসসিএনসি ব্যতীত অন্য কোনও কিছু দিয়ে) এবং কেবলমাত্র মেটারড সংযোগের জন্য চেকসাম না প্রেরণ করে তা প্রেরণ করতে পারেন। বাইনারি-ফাইল স্তরের পরিবর্তে ডাটাবেস-রেকর্ড স্তরে এটি করা সম্ভবত আরও ভাল, ডেরোবার্টের পরামর্শ অনুসারে।
পিটার কর্ডেস

1
এছাড়াও, আপনি আরও ভার্বোজ স্ট্যাটাস পেতে rsync --statsএবং ব্যবহার করতে পারতেন -v -v। Rsync আপনাকে জানায় যে বনাম তুলনায় কতটা মিলছে না data
পিটার কর্ডেস

উত্তর:


27

সারসংক্ষেপ

ডেটাবেসগুলি প্রচুর পরিমাণে মেটাডেটা, সাংগঠনিক ডেটা রাখে tend এসকিউএলাইট পরীক্ষা করে দেখা যায় যে ওয়াল এবং নন-ওয়াল উভয় মোডেই এটি সেভাবে আচরণ করে। এটি আপনার প্রত্যাশার চেয়ে আরও অনেক বেশি ডেঙ্ক সিঙ্ক করতে পারে আরএসসিটিকে। আপনি নিম্ন ব্যবহার করে এই ওভারহেড কিছুটা কমিয়ে আনতে পারেন --block-size(আরও বেশি ওভারহেড কম্পিউটিং এবং চেকসাম স্থানান্তরিত করার জন্য)।

আরও ভাল পন্থাটি সম্ভবত এসকিউএল ডাম্প হিসাবে নতুন রেকর্ডগুলি ছুঁড়ে ফেলা, সংকোচনের সাথে তা স্থানান্তর করা। বিকল্পভাবে, এসকিউএলাইটের জন্য বেশ কয়েকটি প্রতিলিপি সমাধান রয়েছে বলে মনে হয়, আপনি এর মধ্যে একটি ব্যবহার করতে পারেন।

রোয়াইমা সবেমাত্র নূন্যতমে পরামর্শ দেয় আপনি সম্ভবত একটি সম্পূর্ণ এসকিউএল ডাম্প করতে পারেন, এটি ব্যবহার করে সংকোচিত করতে পারেন gzip --rsyncableএবং তারপরে এটি আরএসএনসি করতে পারেন । আমি মনে করি, এটি একটি পরীক্ষা যথেষ্ট মূল্যবান ডেল্টা কিনা তা দেখার জন্য।

বিস্তারিত

আপনি যা চেষ্টা করছেন তা কাজ করা উচিত । আমি ব্যক্তিগতভাবে --partialআপনার আরএসসিএনসি বিকল্পগুলিতে যুক্ত করব, যদি এটি কোনওভাবে আংশিক স্থানান্তর হিসাবে ক্রমবর্ধমান ফাইলটি সনাক্ত করে ing আপনি এর সাথে আরও ভাল ট্রান্সফার স্ট্যাটাস পেতে পারেন --stats

দ্বিতীয়টি যাচাইয়ের জন্য হ'ল এসকিউএলাইট যদি সত্যিই কেবল কয়েকটি পৃষ্ঠা স্পর্শ করে। সত্যি কথা বলতে, এটি যদি সমস্ত ফাইলের মধ্যে পৃষ্ঠাগুলি লিখতে থাকে তবে আমি অবাক হব না। চেক করার একটি দ্রুত উপায় cmp -lহ'ল দুটি সংস্করণ ব্যবহার করা — চূড়ান্ত কয়েকটি বাদে অন্য পৃষ্ঠাগুলিতে কোনও পরিবর্তন আছে কিনা তা দেখুন। মনে রাখবেন যে rsync"পৃষ্ঠা" / ব্লকের ধারণাটি এসকিউএলাইটের চেয়ে পৃথক; আপনি rsync এর মাধ্যমে পরিবর্তন করতে পারবেন --block-size। এটি হ্রাস করতে সাহায্য করতে পারে।

সম্পাদনা: এসকিউএলাইটের সাথে আমি একটি দ্রুত পরীক্ষা করেছি। এমনকি 32k পৃষ্ঠা, উপর হিজিবিজি করে লেখা লগ এন্ট্রি একটি গুচ্ছ যোগ দিয়ে যে পাতা। নিচে বিস্তারিত.

সম্পাদনা 2 : এটি ওয়াল মোডে আরও ভাল বলে মনে হচ্ছে, যদিও আপনি এখনও চেকপয়েন্ট থেকে প্রচুর পরিমাণে ওভারহেড নেন।

3 সম্পাদনা করুন : প্রতি স্থানান্তর প্রতি আপনি যে পরিমাণ আরও ডেটা যুক্ত করছেন তা আরও ভাল — আমার ধারণা এটি সম্ভবত নির্দিষ্ট ব্লকগুলিকে বারবার স্ক্রাইব করে। সুতরাং আপনি একই ব্লকগুলি সেগুলি একবার বা একশবার লিখেছিল তা নির্বিশেষে স্থানান্তরিত করছেন।

বিটিডাব্লু: ট্রান্সফার হ্রাস করার জন্য, আপনি সম্ভবত আরএসসিএনসি-র চেয়ে অনেক ভাল করতে পারেন। উদাহরণস্বরূপ, সর্বশেষ স্থানান্তর xz --best(বা এমনকি gzip) দ্বারা চালিত হওয়ার পরে নতুন রেকর্ডগুলির একটি এসকিউএল ডাম্প সম্ভবত মোটামুটি ছোট হবে।

দ্রুত এসকিউএলাইট পরীক্ষা

স্কিমা:

CREATE TABLE log (id integer primary key not null, ts integer not null, app text not null, message text not null);
CREATE INDEX log_ts_idx on log(ts);
CREATE INDEX log_app_idx on log(app);

পার্ল প্রোগ্রাম:

use 5.022;
use DBI;

my $DBH = DBI->connect('dbi:SQLite:test.db', '', '', {RaiseError => 1, AutoCommit => 0})
    or die "connect...";

my @apps = (
    '[kthreadd]',        '[ksoftirqd/0]',
     # there were 191 of these
    '[kworker/5:0H]',
);

my @messages = <DATA>;

(my $curr_time) = $DBH->selectrow_array(<<QUERY);
    SELECT COALESCE(MAX(ts),978307200) FROM log
QUERY

my $n_apps = @apps;
my $n_msgs = @messages;
say "Apps: $n_apps";
say "Messages: $n_msgs";
say 'Start time: ', scalar gmtime($curr_time), ' UTC';

my $sth = $DBH->prepare(<<QUERY);
    INSERT INTO log(ts, app, message) VALUES (?, ?, ?)
QUERY

for (my $i = 0; $i < 10_000; ++$i) {
    $sth->execute(int($curr_time), $apps[int rand $n_apps], $messages[int rand $n_msgs]);
    $curr_time += rand 0.1;
}
$DBH->commit;

__DATA__
microcode: CPU0 microcode updated early to revision 0x19, date = 2013-06-21
Linux version 4.5.0-2-amd64 (debian-kernel@lists.debian.org) (gcc version 5.3.1 20160528 (Debian 5.3.1-21) ) #1 SMP Debian 4.5.5-1 (2016-05-29)

আরও অনেক উদাহরণ লগ বার্তা ছিল (2076)।

কোন পৃষ্ঠাগুলি পরিবর্তিত হয়েছে তা পরীক্ষা করা হচ্ছে:

cp test.db test.db.old
perl test.pl
cmp -l test.db.old test.db | perl -n -E '/^\s*(\d+) / or die "wtf"; $bucket{int $1/32768} = 1; END { say join "\n", sort( { $a <=> $b } keys %bucket) }'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.