Jag är doktorand och gruppen där jag arbetar upprätthåller ett Linux-kluster. Varje nod i klustret har sin egen lokala disk, men dessa lokala diskar är relativt små och är inte utrustade med automatisk säkerhetskopiering. Så gruppen äger en filserver med många TB lagringsutrymme. Jag är en relativ Linux-nybörjare, så jag är inte säker på vad som är specifikationen för filservern när det gäller hastighet, nätverksförmåga etc. Jag vet av erfarenhet att de lokala diskarna är betydligt snabbare än filservern när det gäller I / O . Ungefär ett dussin personer använder filservern.

Att använda cp för att kopiera en ~ 20 GB-fil från filservern till en av de lokala diskarna tar i genomsnitt cirka 11,5 minuter i realtid (enligt time). Jag vet att denna cp operation inte är så effektiv eftersom (1) time säger till mig att systemtiden för en sådan kopia bara är ~ 45 sekunder; och eftersom (2) när jag undersöker top under kopian, % CPU är ganska låg (vid inspektion ungefär 0-10% i genomsnitt).

Använd cp för att kopiera samma ~ 20 GB-fil från en mapp på den lokala disken till en annan mapp på samma lokala disk tar mindre tid – cirka 9 minuter i realtid (~ 51 sekunder i systemtid, enligt time). Så uppenbarligen är filservern något långsammare än den lokala disken, som förväntat, men kanske inte signifikant långsammare. Jag är förvånad över att kopiering från lokal till samma lokal inte går snabbare än 9 minuter.

Jag måste kopiera ~ 200 stora filer – vardera ~ 20 GB – från filservern till en av de lokala diskarna. Så min fråga är: Finns det ett snabbare alternativ till cp för att kopiera stora filer i Linux? (Eller finns det några flaggor inom cp som jag skulle kunna använda som skulle påskynda kopieringen?) Även om jag på något sätt kunde raka en minut av denna kopieringstid skulle det hjälp oerhört.

Jag är säker på att köpa nya, snabbare hårdvarudiskar, men jag har inte tillgång till sådana resurser. Jag är inte heller systemadministratör – jag är bara en (nybörjare) användare – – så jag har inte tillgång till mer detaljerad information om belastningen på skivorna. Jag vet att medan ungefär ett dussin personer använder filservern dagligen är jag den enda personen som använder just denna nod / lokal disk.

Kommentarer

  • Det gör cirka 29 MB / s, vilket är ganska snabbt om du frågar mig. Jag tror inte ’ där ’ är något kommando som kommer att påskynda detta, ” flaskhals ” är sannolikt a) nätverket eller b) filservern.
  • tink är 100% korrekt. Jag ’ Jag har aldrig sett någonting som kan förbättra detta. Det enda jag ’ har gjort tidigare är att komprimera data innan du skickar det, men det betyder att du ’ lägger till tid med komprimeringssteget och dekomprimeringsstegen, men ibland är det ’ värt det om data är en bra kandidat för att komprimeras!
  • Du kan också prova dd och rsync för att jämföra vilken som fungerar snabbare i din miljö
  • @Salton Tack. Jag har ännu inte provat dd, men jag försökte bara rsync. Den reala tiden var cirka 11,5 minuter och systemtiden var cirka 1,5 minuter, enligt time.
  • I ’ Jag är förvånad över att ingen har påpekat att den lokala skivan till den lokala skivkopian skulle kunna effektiviseras genom att flera skivor är monterade. Kopiering från /dev/sda1 till /dev/sdb1 kommer att gå snabbare än att kopiera från en plats på /dev/sda1 till en annan plats på /dev/sda1 eller en annan partition på /dev/sda eftersom hårddisken vann ’ t måste göra ytterligare sökningar mellan läser och skriver (förutsatt att traditionella hårddiskar med snurrande skivor och rörliga huvuden; SSD är uppenbarligen annorlunda).

Svar

% CPU ska vara lågt under en kopia. CPU: n berättar för skivkontrollen att ”hämta data från sektorer X – Y till minnesbuffert vid Z”. Sedan går det och gör något annat (eller sover, om det inte finns något annat). Maskinvaran utlöser ett avbrott när data finns i minnet. Då måste processorn kopiera den några gånger och säger till nätverkskortet att ”sända paket på minnesplatserna A, B och C”. Sedan går det tillbaka till att göra något annat.

Du trycker på ~ 240 Mbps.På ett gigabit LAN borde du kunna göra minst 800 Mbps, men:

  1. Det delas mellan alla som använder filservern (och eventuellt en anslutning mellan växlar osv.)
  2. Det begränsas av hastigheten som filservern kan hantera skrivningen med tanke på att dess I / O-bandbredd delas av alla som använder den.
  3. Du specificerade inte hur du kommer åt filservern (NFS, CIFS (Samba), AFS, etc.). Du kan behöva ställa in ditt nätverksfäste, men på något halvt senaste är standardvärdena vanligtvis ganska sunda.

För att spåra flaskhalsen, iostat -kx 10 kommer att vara ett användbart kommando. Det visar dig användningen på dina lokala hårddiskar. Om du kan köra det på filservern berättar det hur upptagen filservern är.

Den allmänna lösningen kommer att vara att påskynda den flaskhalsen, som du naturligtvis inte har budgeten för. Men det finns ett par speciella fall där du kan hitta ett snabbare tillvägagångssätt:

  • Om filerna är komprimerbara, och du har en snabb CPU, det går snabbare att göra en minimal komprimering. Något som lzop eller kanske gzip --fastest.
  • Om du bara ändrar några bitar här och där och sedan skickar tillbaka filen blir det bara snabbare att skicka delta. Tyvärr rsync hjälper inte riktigt här, eftersom det måste läsa filen på båda sidor för att hitta deltaet. Istället behöver du något som håller reda på deltaet när du ändrar filen … De flesta tillvägagångssätt här är appspecifika. Men det är möjligt att du kan rigga upp något med, t.ex. enhetsmapper (se det helt nya dm-era-målet ) eller btrfs.
  • Om du kopierar samma data till flera maskiner kan du använda något som udpcast för att skicka det till alla maskiner samtidigt.

Och, eftersom du noterar att du inte är sysadmin, antar jag att det betyder att du har ett sysadmin. Eller åtminstone någon som är ansvarig för filservern & nätverk. Du bör nog fråga honom / henne / dem, de borde vara mycket mer bekanta med detaljerna i din installation. Dina sysadmin (er) borde åtminstone kunna berätta vilken överföringshastighet du rimligen kan förvänta dig.

Kommentarer

  • +1 för iostat -kx 10 🙂

Svar

Detta kan, möjligen, vara ett snabbare alternativ, och du kommer inte att täppa till nätverket i två dagar: Ta en eller två stora USB (USB 3 om du har det) eller FireWire-skivor, anslut den till och kopiera filerna till disken. Bär disken till din lokala maskin. Kopiera filerna till maskinen.

Kommentarer

Svar

Om du har direkt SSH-åtkomst (eller SFTP) (fråga din sysadmin) kan du använda scp med komprimering (-C):

scp -C you@server:/path/to/yourfile . 

Naturligtvis är det bara användbart om filen är komprimerbar, och detta kommer att använda mer CPU-tid, eftersom det kommer att använda kryptering (eftersom det är över SSH) och komprimering.

Kommentarer

  • I det här fallet skulle det vara användbart att inaktivera krypteringen. Kom ihåg att vi försöker göra kopian snabbare .
  • @lgeorget Jag misstänker att krypteringskostnaden ’ inte blir betydande , med tanke på hur långsamma hårddiskar är. Jag övervägde att lägga till något om -c none, men att verkar vara icke-standard .
  • Vi ’ hanterar ~ 20G-filer så att det är ganska ineffektivt att använda kryptering om det inte behövs.
  • @lgeorget Kryptering kan vara gjort mycket snabbare än den genomströmning han ’ får, så det kommer ’ inte att sakta ner något. Men det verkar onödigt att gå igenom SSH här. Om du bara behöver komprimering finns det säkert andra verktyg?
  • @Thomas Fördelen med SSH är att om du ’ ska ha tillgång till fjärrservern, sedan kör det ’ SSH. Ett annat alternativ skulle vara att komprimera filen lokalt, kopiera den till servern, sedan ssh i och dekomprimera den ..

Svar

Din definition av effektiv är bakåt. En effektivare implementering slösar bort mindre CPU-tid. På den lokala kopian har du i genomsnitt cirka 74 MB / s genomströmning (läs + skriv), vilket är ungefär lika bra som en enda hårddisk kommer att få.

Kommentarer

  • Hoppsan.När jag sa ” effektiv, ” menade jag ” snabbt. ”

Svar

cp implementering är sannolikt inte en flaskhals. Försök att följa IO-användningen via iotop på både servern och klusternoden. Detta ger dig en uppfattning om hur du kan förbättra prestanda.

Ett annat tips är att undvika att kopiera samma data från samma värd. Till exempel, om du har identisk 20G-fil att distribuera från filserver över nätverket till alla klusternoder, kommer den att fungera mycket snabbare än om du kopierar filer på peer-to-peer-sätt snarare än en server-till-alla-klienter. Det är lite mer komplicerat att implementera, men du kan till och med försöka använda någon kommandorad p2p som direktanslutningsnav.

Om det inom de 20G-filerna är en del vanligt och vissa är klusternodsspecifika, överväg dela upp den i vanliga och specifika delar och sedan distribuera gemensam del på p2p-sätt.

Kommentarer

  • Om du ’ på ett LAN bör du kunna göra multicast istället för peer-to-peer. Vilket ska vara snabbare och mindre belastning på nätverket.

Svar

Karaktären / innehållet i dessa filer kan göra skillnad. Jag förstod att du måste kopiera 200 filer, ~ 20 GB vardera, från en dator till en annan , är det det?

Om filerna är komprimerbara eller med liknande / identiska delar, har du två metoder:

  • zip dem innan du kopierar, eller skapa en tunneln mellan datorerna med zip-aktiverad på. Så om nätverket är flaskhalsen blir det lite fast r

  • om filerna är mycket lika, eller om du delar några vanliga delar bland dem, försök använda rsync . Det kommer att spendera lite tid på att hitta det som är vanligt bland filerna och behöver inte kopiera det bokstavligen eftersom det rekonstruerar det baserat på vad som är vanligt.

redigera

Behöver du kopiera filerna många gånger ?? (som en kopia -> använda filerna -> ändra något i filerna i datorn A -> kopiera filer igen till dator B)

Om så är fallet kommer rsync att vara till hjälp, eftersom det ”försöker upptäcka vad som är lika mellan versionerna och inte kopiera det som är oförändrat.

Och en tredje metod: om ovanstående är korrekt (ändringar i fil, kopiera sedan alla filer igen till den andra datorn) kan du prova lite binary diff till bara ändra på den andra datorn vad som ändrades på den första datorn.

Svar

Jag ser följande här, kryptering är inte en bra idé eftersom det eventuellt ÖKAR mängden data som ska överföras.

Om du kopierar mellan två system är flaskhalsen naturligtvis inte kopplingen mellan servrarna.

Om du kopierar lokalt, titta på hur processen går, den är ENGÅNGÅNG, så standard Linux-verktyg använder:

- for all blocks in a file read a block write a block 

Denna operation har INGEN samtidighet.

För att påskynda saker kan du använda något så här:

 buffer -i infile -o outfile -m size-of-shared-memory-default-1MByte 

Se buffertens (1) mansida för mer information.

Buffertkommandot ställer in två processer för att köra kopieringsprocessen samtidigt: en för läsning och den andra för skrivning, och den använder en delad minnesbuffert för att kommunicera data mellan de två processerna. Det delade minnesbufferten är din klassiska cirkulära buffert som förhindrar överskrivning av oskrivna data och skrivning av redan skrivna data. Jag har använt det här programmet för att skära bort cirka 10-20% av kopieringstiden vid överföringar från disk till band.

Kommentarer

  • Det finns faktiskt samtidighet i ” läs ett block / skriv ett block ” eftersom ” skriv ett block ” sätter det faktiskt bara i kärnan ’ s buffert, och kärnan hanterar den faktiska blockskrivningen i bakgrunden (åtminstone tills du börja ta slut på RAM-minne). Eller om du använder O_DSYNC / O_SYNC av någon anledning.

Svar

Varför inte prova en P2P-propagationsalgoritm , om du behöver uppdatera hela klustret samtidigt?

https://github.com/lg/murder är vilken twitter använder

Det finns ”s BTSync som du också kan prova.

Svara

Om du ofta kopierar samma uppsättningar filer från din lokala dator till servern med mindre ändringar här och där. Du kan påskynda överföringen med rsync eller en DVCS (t.ex. hg eller git).

git eller hg kan hålla koll på och upptäcka deltor och bara överföra dessa deltor. Om du använder en git, eftersom båda sidor har fullständig historik för förvaret, är det mycket billigt att ta reda på deltaet.

rsync använder en form av rullande kontrollsummingsalgoritm för att upptäcka deltor utan förkunskaper om vad som finns på andra sidan. Även om det krävs mer arbete för rsync att beräkna deltorna behöver det inte lagra hela filhistorik.

Svar

Du kanske vill försöka packa alla filer i ett enda arkiv (behöver inte komprimeras). Enligt min erfarenhet är det snabbare att kopiera ett arkiv än att kopiera ett stort antal enskilda filer

Kommentarer

  • Bra generisk observation, men som frågan säger “~ 200 stora filer – vardera ~ 20 GB”, jag tror inte ’ att detta kan betraktas som ett verkligt svar på detta problem.
  • @manatwork ah .. jag ’ läste inte tydligt. Jag trodde att han hade 200 filer på totalt 20 GB

Svar

Försök bbcp . Testning i vår miljö avslöjade att cp hade något slags o f inbyggd regulator. Var bara försiktig, för när du tar av guvernören kan du göra en ny linje på din server och orsaka avbrott. I vårt fall tog vi servern offline för att göra kopian, så snabbare var bättre. Denna förbättrade överföringstid flera timmar.

Svar

Se till att målet filer finns inte innan de kopieras.

Ibland är det förvånande hur mycket tid som går till och med bara att kopiera på samma värd (inget nätverk involverat).

Se mitt svar på en annan cp-fråga här . Lång historia, att skriva över en befintlig fil är mycket långsammare än att trunka den eller ta bort länken först, och sedan kopiering. Den senare är 8 gånger snabbare för en 1,2 GB-fil.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *