Jeg er utdannet student, og gruppen jeg jobber med opprettholder en Linux-klynge. Hver node i klyngen har sin egen lokale disk, men disse lokale diskene er relativt små og er ikke utstyrt med automatisk sikkerhetskopiering. Så gruppen eier en filserver med mange TB-er lagringsplass. Jeg er en relativ Linux-nybegynner, så jeg er ikke sikker på hva som er spesifikasjonene til filserveren når det gjelder hastighet, nettverksevne osv. Jeg vet av erfaring at de lokale diskene er betydelig raskere enn filserveren når det gjelder I / O . Omtrent et dusin mennesker bruker filserveren.
Å bruke cp
til å kopiere en ~ 20 GB fil fra filserveren til en av de lokale diskene tar i gjennomsnitt omtrent 11,5 minutter i sanntid (ifølge time
). Jeg vet at denne cp
operasjonen ikke er veldig effektiv fordi (1) time
forteller meg at systemtiden for en slik kopi bare er ~ 45 sekunder; og fordi (2) når jeg undersøker top
under kopien, % CPU er ganske lav (ved inspeksjon, omtrent 0-10% i gjennomsnitt).
Bruk av cp
til å kopiere den samme ~ 20 GB-filen fra en mappe på den lokale disken til en annen mappe på samme lokale disk tar kortere tid – omtrent 9 minutter i sanntid (~ 51 sekunder i systemtid, i henhold til time
). Så tilsynelatende er filserveren noe tregere enn den lokale disken, som forventet, men kanskje ikke vesentlig tregere. Jeg er overrasket over at kopiering fra lokal til samme lokale ikke er raskere enn 9 minutter.
Jeg trenger å kopiere ~ 200 store filer – hver ~ 20 GB – fra filserveren til en av de lokale diskene. Så spørsmålet mitt er: Er det et raskere alternativ til cp
for å kopiere store filer i Linux? (Eller er det noen flagg i cp
som jeg kunne bruke som ville gi raskere kopiering?) Selv om jeg på en eller annen måte kunne barbere et minutt av denne kopieringstiden, ville det hjelper utrolig mye.
Jeg er sikker på at jeg kjøper nye, raskere maskinvaredisker, men jeg har ikke tilgang til slike ressurser. Jeg er heller ikke systemadministrator – jeg er bare en (nybegynner) bruker – – så jeg har ikke tilgang til mer detaljert informasjon om belastningen på diskene. Jeg vet at mens omtrent et dusin mennesker bruker filserveren daglig, er jeg den eneste personen som bruker akkurat denne noden / den lokale disken.
Kommentarer
Svar
% CPU skal være lav under en kopi. CPU forteller diskkontrolleren «hente data fra sektor X – Y til minnebuffer ved Z». Så går det og gjør noe annet (eller sover, hvis det ikke er noe annet). Maskinvaren utløser et avbrudd når dataene er i minnet. Deretter må CPU-en kopiere den et par ganger, og forteller nettverkskortet «overføre pakker på minnesteder A, B og C». Så går det tilbake til å gjøre noe annet.
Du skyver på ~ 240 Mbps.På et gigabit LAN bør du kunne gjøre minst 800 Mbps, men:
- Det deles blant alle som bruker filserveren (og muligens en forbindelse mellom brytere osv.)
- Dette er begrenset av hastigheten filserveren kan håndtere skrivingen, med tanke på at disk I / O-båndbredden deles av alle som bruker den.
- Du spesifiserte ikke hvordan du får tilgang til filserveren (NFS, CIFS (Samba), AFS, etc.). Det kan hende du må justere nettverksmonteringen, men på noe som er helt nylig er standardinnstillingene ganske sunne.
For å spore flaskehalsen, iostat -kx 10
kommer til å være en nyttig kommando. Det vil vise deg bruken på dine lokale harddisker. Hvis du kan kjøre det på filserveren, vil det fortelle deg hvor opptatt filserveren er.
Den generelle løsningen vil være å fremskynde flaskehalsen, som du selvfølgelig ikke har budsjettet for. Men det er et par spesielle tilfeller der du kan finne en raskere tilnærming:
- Hvis filene er komprimerbare, og du har en rask CPU, det å gjøre en minimal komprimering på farten kan være raskere. Noe som
lzop
eller kanskjegzip --fastest
. - Hvis du bare endrer noen få biter her og der, og deretter sender filen tilbake, vil bare sende deltas være mye raskere.
rsync
hjelper ikke virkelig her, da det må lese filen på begge sider for å finne deltaet. I stedet trenger du noe som holder styr på deltaet når du endrer filen … De fleste tilnærminger her er appspesifikke. Men det er mulig at du kan rigge opp noe med for eksempel enhetsmapper (se det splitter nye dm-era-målet ) eller btrfs. - Hvis du kopierer de samme dataene til flere maskiner, kan du bruke noe som udpcast til å sende dem til alle maskinene samtidig.
Og, siden du merker at du ikke er sysadmin, antar jeg at det er sysadmin. Eller i det minste noen som er ansvarlig for filserveren & nettverk. Du bør nok spørre ham / henne / dem, de burde være mye mer kjent med detaljene i oppsettet ditt. Syadministratorene dine skal i det minste kunne fortelle deg hvilken overføringshastighet du med rimelighet kan forvente.
Kommentarer
- +1 for iostat -kx 10 🙂
Svar
Dette kan muligens være et raskere alternativ, og du vil ikke tette nettverket i to dager: Ta en eller to store USB (USB 3 hvis du har det) eller FireWire-disker, koble den til serveren og kopier filene til disken. Bær disken til din lokale maskin. Kopier filene til maskinen.
Kommentarer
- Sneakernet ( en.wikipedia.org/ wiki / Sneakernet ) kan være veldig rask: Undervurder aldri båndbredden til en stasjonsvogn full av bånd som slynger seg nedover motorveien.
Svar
Hvis du har direkte SSH (eller SFTP) tilgang (spør sysadmin), kan du bruke scp
med komprimering (-C
):
scp -C you@server:/path/to/yourfile .
Selvfølgelig er det bare nyttig hvis filen er komprimerbar, og dette vil bruke mer CPU-tid siden det vil bruke kryptering (fordi det er over SSH), og komprimering.
Kommentarer
- I dette tilfellet vil det være nyttig å deaktivere krypteringen. Husk at vi prøver å gjøre kopien raskere .
- @lgeorget Jeg mistenker at kostnaden for krypteringen ikke vil være ‘ t være betydelig , med tanke på hvor sakte harddisker er. Jeg vurderte å legge til noe om
-c none
, men at ser ut til å være ikke-standard . - Vi ‘ har å gjøre med ~ 20G-filer, så det er ganske ineffektivt å bruke kryptering hvis det ikke er nødvendig.
- @lgeorget Kryptering kan være gjort langt raskere enn gjennomstrømningen han ‘ får, så det vant ‘ t å senke noe. Men det virker unødvendig å gå gjennom SSH her. Hvis du bare trenger komprimering, finnes det sikkert andre verktøy?
- @Thomas Fordelen med SSH er at hvis du ‘ skal ha tilgang til den eksterne serveren, så kjører det nesten helt sikkert ‘ SSH. Et annet alternativ vil være å komprimere filen lokalt, kopiere den til serveren, deretter
ssh
inn og dekomprimere den ..
Svar
Din definisjon av effektiv er bakover. En mer effektiv implementering kaster bort mindre CPU-tid. På den lokale kopien har du gjennomsnittlig 74 MB / s gjennomstrømning (les + skriv), noe som er omtrent like bra som en enkelt harddisk kommer til å bli.
Kommentarer
- Beklager.Da jeg sa » effektiv, » mente jeg » raskt. »
Svar
cp
implementering er sannsynligvis ikke en flaskehals. Prøv å observere IO-bruk via iotop
på både server og klyngenode. Dette vil gi deg en ide hvor du kan forbedre ytelsen.
Et annet tips er å unngå å kopiere samme data fra samme vert. For eksempel, hvis du har identisk 20G-fil å distribuere fra filserver over nettverket til alle klyngenoder, vil den fungere mye raskere enn hvis du kopierer filer på peer-to-peer-måte i stedet for en-server-til-alle-klienter. Det er litt mer komplisert å implementere, men du kan til og med prøve å bruke noen kommandolinje p2p som direktekoblingsnav. dele den opp i vanlige og spesifikke deler, og distribuer deretter felles del på p2p-måte.
Kommentarer
- Hvis du ‘ på et LAN, bør du kunne gjøre multicast i stedet for peer-to-peer. Hvilket skal være raskere og mindre belastning på nettverket.
Svar
Filenes art / innhold kan gjøre noen forskjell. Jeg forsto at du trenger å kopiere 200 filer, ~ 20 GB hver, fra en datamaskin til en annen , er det det?
Hvis disse filene er komprimerbare eller med lignende / identiske deler, har du to tilnærminger:
-
zip dem før du kopierer, eller opprett en tunnel mellom datamaskiner med zip-aktivering på. Så hvis nettverket er flaskehalsen, vil det være litt fast r
-
Hvis filene er veldig like, eller deler noen deler av vanlig innhold blant dem, kan du prøve å bruke rsync . Det vil bruke litt tid på å finne det som er vanlig blant filene, og trenger ikke å kopiere det bokstavelig fordi det vil rekonstruere det basert på det som er vanlig.
redigere
Trenger du å kopiere disse filene mange ganger ?? (som en kopi -> bruk disse filene -> endre noe i filene i datamaskinen A -> kopier filer på nytt til datamaskin B)
I så fall vil rsync være nyttig, fordi den vil prøve å oppdage hva som er likt blant versjonene og ikke kopiere det som er uendret.
Og en tredje metode: hvis det ovennevnte er riktig (endringer i filen, kopier deretter alle filene igjen til den andre datamaskinen) kan du prøve noen binary diff
til bare endring i den andre datamaskinen hva som ble endret i den første datamaskinen.
Svar
Jeg ser følgende her, kryptering er ikke en god idé, da det muligens ØKER mengden data som skal overføres.
Hvis du kopierer mellom to systemer, er flaskehalsen selvsagt ikke forbindelsen mellom serverne.
Hvis du kopierer lokalt, se på hvordan prosessen går, den er ENKELT gjenget, så standard Linux-verktøy bruker:
- for all blocks in a file read a block write a block
Denne operasjonen har INGEN samtidighet.
For å øke hastigheten kan du bruke noe sånt som dette:
buffer -i infile -o outfile -m size-of-shared-memory-default-1MByte
Se buffersiden (1) for mer informasjon.
Bufferkommandoen setter opp to prosesser for å kjøre kopieringsprosessen samtidig: den ene for lesing og den andre for skriving, og den bruker en delt minnebuffer for å kommunisere dataene mellom de to prosessene. Delt minnebuffer er din klassiske sirkulære buffer som forhindrer overskriving av uskrevne data og skriving av data som allerede er skrevet. Jeg har brukt dette programmet til å kutte av omtrent 10-20% av kopitiden i overføringer fra disk til tape.
Kommentarer
- Det er faktisk samtidighet i » les en blokk / skriv en blokk » fordi » skriv en blokk » setter den faktisk bare i kjernen ‘ s buffer, og kjernen håndterer den faktiske blokkeringen i bakgrunnen (i det minste, til du begynn å gå tom for RAM). Eller hvis du av en eller annen grunn bruker O_DSYNC / O_SYNC.
Svar
Hvorfor ikke prøve en P2P-formeringsalgoritme , hvis du trenger å oppdatere hele klyngen samtidig?
https://github.com/lg/murder er hva twitter bruker
Det er «s BTSync som du også kan prøve.
Svar
Hvis du ofte kopierer de samme settene med filer fra din lokale datamaskin til serveren med mindre endringer her og der. Du kan øke hastigheten på overføringen ved å bruke rsync eller en DVCS (f.eks. Hg eller git).
git eller hg kan holde oversikt og oppdage deltas og bare overføre deltas. I tilfelle du bruker en git, siden begge sider har full historie med depotet, er det veldig billig å finne ut deltaet.
rsync bruker en form for rullende sjekkummingsalgoritme for å oppdage deltas uten forhåndskunnskap om hva som er på den andre siden. Selv om det tar mer arbeid for rsync å beregne deltaene, trenger det ikke å lagre hele filhistorikk.
Svar
Det kan være lurt å prøve å pakke alle filene inn i ett arkiv (trenger ikke komprimeres). Etter min erfaring er å kopiere det ene arkivet raskere enn å kopiere et stort antall individuelle filer
Kommentarer
- God generisk observasjon, men som spørsmålet sier “~ 200 store filer – hver ~ 20 GB”, jeg tror ikke ‘ t dette kan betraktes som et faktisk svar på dette problemet.
- @manatwork ah .. jeg leste ikke ‘. Jeg trodde han hadde 200 filer på til sammen 20 GB
Svar
Prøv bbcp . Testing i vårt miljø avslørte at cp hadde en slags o f innebygd guvernør. Bare vær forsiktig fordi når du tar av guvernøren, kan du rødlinje serveren din og forårsake strømbrudd. I vårt tilfelle tok vi serveren offline for å lage kopien, så raskere var bedre. Denne forbedrede overføringstiden flere timer.
Svar
Sørg for at målet filer eksisterer ikke før kopiering.
Noen ganger er det overraskende hvor mye tid som brukes til og med bare å kopiere på samme vert (ingen nettverk involvert).
Se svaret mitt på et annet cp-spørsmål her . Kort fortelling, å overskrive en eksisterende fil er mye tregere enn å trunke den eller fjerne tilknytningen først, og deretter kopiering. Sistnevnte er 8 ganger raskere for en 1,2 GB-fil.
dd
ogrsync
for å sammenligne hvilken som fungerer raskere i miljøet dittdd
, men jeg har bare prøvdrsync
. Sanntiden var omtrent 11,5 minutter og systemtiden var omtrent 1,5 minutter, i henhold tiltime
./dev/sda1
til/dev/sdb1
kommer til å gå raskere enn å kopiere fra ett sted på/dev/sda1
til et annet sted på/dev/sda1
eller en annen partisjon på/dev/sda
fordi harddisken vant ‘ t må gjøre flere søk mellom lesing og skriving (forutsatt at tradisjonelle harddisker med spinnende disker og hoder som beveger seg; SSD er åpenbart annerledes).