Puncte:4

Pot copia un fișier pe două unități în același timp dintr-o singură citire? (Copiați unul la doi într-o singură operație, de preferință în rsync)

drapel cn

Am frecvent nevoie să fac copii de rezervă ale unui disc sursă pe mai multe discuri țintă. Momentan fluxul de lucru este rsync din sursă la tinta1 atunci dd clonare tinta1 la tinta2.
Ar fi minunat dacă aș putea rsync din sursă la tinta1+tinta2 secvenţial în aceeaşi operaţie de citire pentru a accelera foarte mult lucrurile. Citiți fișierul în memorie o dată și scrieți-l pe două hard disk-uri separate în sincronie mare.
Există, poate, o modalitate de a avea rsync citiți fișierul în memorie și direcționați ieșirea la două operațiuni de scriere simultan? Nu avea a fi rsync dar asta ar fi de preferat.

sudodus avatar
drapel jp
Cred că ceea ce doriți se întâmplă deja în versiunile actuale de Ubuntu, dacă există suficientă RAM liberă pentru întregul fișier sau întregul lot de fișiere pe care rsync sau un alt instrument trebuie să le copieze. (Dar un fișier uriaș sau un lot de fișiere ar putea să nu încapă în RAM). Am observat că atunci când creez unități de pornire USB dintr-un fișier iso, a doua oară procesul de citire nu are nevoie aproape deloc de timp (dar, desigur, procesul de scriere va fi limitat de viteza de scriere a fiecărui dispozitiv țintă).
Puncte:6
drapel pl

Adunând informații din mai multe surse, există câteva opțiuni.

Concluzia este că numai cu comanda paralel s-ar putea să obții ceea ce îți dorești, vezi mai jos.

Notite importante:

  1. Am facut teste cu cp pentru copiere.De asemenea, ar trebui să luați în considerare accelerarea (sau scăderea!) obținută cu rsync vs cp sau alte comenzi alternative, combinate cu paralel.
  2. Am testat copierea unui singur fișier. Rezultatele se pot schimba dacă copiați mai multe fișiere (de exemplu, combinând câteva fișiere mari, după cum aveți nevoie, cu multe alte fișiere și subdirectoare mici).

timp <opțiunea #N, copierea către o țintă>
timp <opțiunea #N, copierea la două ținte>

pentru a obține o comparație, cu un fișier de 1.2Gb. Mai mult, în unele cazuri am testat de două sau trei ori aceeași comandă, pentru a evalua dispersia în rezultate. Nu am calculat medii și abateri standard, dar rezultatele sunt evidente.

Asta am obtinut in conditiile de testare specificate mai sus, cu scurte comentarii. Am concatenat într-un singur rând rezultatele testelor multiple, ori de câte ori sunt disponibile.

The caz de baza:

$ time cp -p sursă/fișier1 țintă1/

real 0m0.846s 0m0.680s 0m0.659s
utilizator 0m0.000s 0m0.001s 0m0.016s
sys 0m0,777s 0m0,662s 0m0,643s

The opțiuni de copiere:

  1. Opțiune paralel

    $ paralel cp -p sursă/fișier1 ::: țintă1/
    real 0m0,745s 0m0,740s
    utilizator 0m0,121s 0m0,108s
    sys 0m0,609s 0m0,619s
    
    $ paralel cp -p sursă/fișier1 ::: target1/ target2/
    real 0m0,794s 0m0,860s
    utilizator 0m0,116s 0m0,134s
    sys 0m1.300s 0m1.380s
    
  2. Opțiune tricou (anexând > /dev/null pentru a evita ieșirea către stdout)

    $ tee target1/file1 < sursă/fișier1 > /dev/null
    real 0m0.874s 0m1.040s 0m1.028s
    utilizator 0m0,160s 0m0,172s 0m0,137s
    sys 0m0,714s 0m0,868s 0m0,887s
    
    $ tee target1/file1 target2/file1 < sursă/fișier1 > /dev/null
    real 0m1.802s 0m1.680s 0m1.833s
    utilizator 0m0,136s 0m0,212s 0m0,197s
    sys 0m1.642s 0m1.468s 0m1.619s
    

    Copiere la doi ţintăs dublează aproximativ timpul pentru unul ţintă, care este puțin mai mare decât timpul pentru caz de baza.

  3. Opțiune xargs

    $ echo target1 | xargs -n 1 cp -p sursă/fișier1
    0m0,666s reale
    utilizator 0m0,021s
    sys 0m0,646s
    
    $ echo target1 target2 | xargs -n 1 cp -p sursă/fișier1
    0m1,197s reale
    utilizator 0m0,018s
    sys 0m1,173s
    

    Copiere la doi ţintăs dublează aproximativ timpul pentru unul ţintă, care este similar cu timpul pentru caz de baza.

  4. Opțiune găsi

    $ find target1 -exec cp -p source/file1 {} \;
    0m2,167s reale
    utilizator 0m0,017s
    sys 0m1.627s
    
    $ find target1 target2 -exec cp -p source/file1 {} \;
    0m3,905s reale
    utilizator 0m0,020s
    sys 0m3,185s
    

    Copiere la doi ţintăs dublează aproximativ timpul pentru unul ţintă, care este mult mai mare decât timpul pentru caz de baza... un învins clar.

Surse pentru „copiere multiple”:

  1. https://www.cyberciti.biz/faq/linux-unix-copy-a-file-to-multiple-directories-using-cp-command/
  2. Cum să copiați un fișier în mai multe foldere folosind linia de comandă?
  3. https://stackoverflow.com/questions/195655/how-to-copy-a-file-to-multiple-directories-using-the-gnu-cp-command

Surse de performanță cp vs. rsync:

  1. https://unix.stackexchange.com/questions/91382/rsync-is-very-slow-factor-8-to-10-compared-to-cp-on-copying-files-from-nfs-sha
  2. https://lwn.net/Articles/400489/
  3. https://superuser.com/questions/1170636/why-is-there-a-write-speed-difference-between-dd-cp-rsync-and-macos-finder-to
  4. Care este diferența dintre `cp` și `rsync`?
sudodus avatar
drapel jp
Ați verificat timpul folosit (cu fișiere destul de mari) pentru a verifica dacă exemplele dvs. evită într-adevăr recitirea fișierului sursă sau, altfel, îmbunătățiți viteza în comparație cu „copierul de două ori”?
sancho.s ReinstateMonicaCellio avatar
drapel pl
@sudodus - Aveți dreptate, în scurt timp va rafina acest punct.
sudodus avatar
drapel jp
Lasă-mă să ghicesc: exemplul cu paralelă va fi cel mai bun (sau cel puțin unul dintre cele mai bune).
sancho.s ReinstateMonicaCellio avatar
drapel pl
@sudodus - `parallel` pare să fie nu numai cel mai bun, ci și singurul care atinge obiectivul.
Puncte:3
drapel cn

rsync are o modul lot ai putea experimenta. Când faci o rsync --write-batch=foo de la la va face copierea obișnuită, dar va replica și instrucțiunile și datele în fișier foo. Dacă în loc de un fișier acesta este un fifo, puteți utiliza un al doilea rsync în paralel pentru a citi fifo-ul și a face o nouă rsync către o altă destinație. Evident, noua destinație trebuie să fie suficient de asemănătoare cu originalul pentru a avea sens.

De exemplu, printr-o rețea ați putea încerca

mkfifo myfifo
ssh remotec 'rsync -av --read-batch=- destc' <myfifo &
somn 1
rsync -av --write-batch=myfifo srca/ remoteb:destb

--citește-loc nu poate fi folosit cu a telecomandă:destc destinație de stil.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.