Cosa fa esattamente la bandiera `-C` in` scp`?


35

Uso sempre rsynco scpper copiare il file da / su una macchina remota. Di recente, ho scoperto nel manuale di scp( man scp) la bandiera-C

 -C      Compression enable.  Passes the -C flag to
         ssh(1) to enable compression.

Prima di scoprire questa bandiera, zipprima e poi scp.

È altrettanto efficace utilizzare semplicemente -Czippare e decomprimere? Quando si utilizza l'uno o l'altro processo per velocizzare il trasferimento?


2
Il modo migliore secondo me è il benchmark da solo. Utilizzo scp -rve scp -Crvconfronto della velocità effettiva.
cuonglm,

3
Questo è totalmente irrilevante per la domanda, ma zipè un formato di file molto "windows". Non lo vedrai quasi mai o ne avrai bisogno quando utilizzi una macchina Linux con software Linux nativo. tarè utilizzato per arrotolare le directory in un unico file, preservando i permessi e nomi e simili, mentre gzip, bzip2, xz, ecc sono utilizzati per comprimere i file. tarspesso sono formati compressi, di creazione tar.gze tar.xzcomuni per archivi su Linux. Ho visto gente rotolare la propria scpworkalike con comandi simili tar cvz directory | ssh machine 'cd somewhere; tar xz'.
Score_Under

2
@Score_Under - Il formato zip è anche usato da Java per impacchettare i file .jar, quindi zip è ancora ampiamente utilizzato su molti server Linux.
Johnny,

Invece di utilizzare l'opzione su ogni trasferimento di file, puoi inserire il Compression yestuo .ssh/configfile.
Barmar,

Se vuoi davvero la velocità, potresti essere in grado di evitare SSH: unix.stackexchange.com/questions/227951/…
rogerdpack

Risposte:


22

Non farà mai davvero alcuna differenza, ma comprimere il file prima di copiarlo dovrebbe essere un po 'meno efficiente poiché l'uso di un formato contenitore come quello zipche può incapsulare più file (come tar) non è necessario e non è possibile eseguire lo streaming zip input e output (quindi è necessario un file temporaneo).

Usare gzipd'altra parte, invece di zipdovrebbe essere esattamente lo stesso poiché è ciò che ssh -Cfa sotto il cofano ... tranne per il fatto che comprimersi è più lavoro che semplicemente usare ssh -C.


Ok, controllerò cos'è gzip. La tua risposta significa che scp -rCè probabilmente la soluzione più efficiente che ho?
Remi.b,

1
La tua risposta non considera che -Ccomprime un flusso di protocollo interattivo. Si considerano solo i dati. Quindi le tue conclusioni sono sbagliate. Vedi la mia risposta
Martin Prikryl,

@Celada Zip può scrivere su una pipeline poiché la directory dei membri è posizionata alla fine. Tuttavia, come hai detto, decomprimere richiede la ricerca di estrarre più di un membro e quindi non è possibile leggere da una pipeline.
jrw32982 supporta Monica il

20

Il -Cflag abilita una compressione gzip di un flusso SSH.

È un equivalente di Accept-Encoding: gzipin HTTP.

Le prestazioni del flag dipendono dal tipo di dati trasferiti:

  • Quando si trasferisce un singolo file di grandi dimensioni, le prestazioni sarebbero pressoché uguali a zippare il file prima del trasferimento (trascurando l'efficienza dell'algoritmo zip vs. gzip).

    Ma l'utilizzo -Cè uno sforzo minore per te come utente.

  • Quando si trasferiscono molti file di piccole dimensioni, le prestazioni saranno inferiori a zippare i file prima del trasferimento.

    Un motivo alla base di ciò è che prima di ogni trasferimento di file esiste una comunicazione interattiva tra il server SCP e il client (per lo scambio di metadati di file, come data e ora e autorizzazioni). Quindi entrambe le parti devono aspettare un po 'per rispondere dall'altra parte (la compressione non aiuta durante l'attesa). È un tempo sprecato per ogni file trasferito. Quanto tempo viene sprecato dipende dalla latenza della connessione. Alla fine, il trasferimento può essere molto più lento.

    Quando si trasferisce un singolo file zippato, tale comunicazione avviene una sola volta.


8

Abilita la compressione gzip in ssh (sotto lo scp).

Su connessioni lente questo accelera le cose, su qualsiasi connessione ragionevolmente veloce (100 Mbit o più veloce) è molto probabile che la compressione rallenti le cose.

Sarà più o meno efficiente di zip in base al fatto che gzip (in particolare gzip -6) sarebbe più o meno efficiente del livello di compressione zip selezionato


1
Nel mio caso specifico, ho una connessione relativamente buona (sono nel campus) ma le cartelle che devo copiare sono molto grandi (~ 100 GB su 442 .bine .txtfile). Quindi suggeriresti di usare solo scp -re nessuna -Cbandiera e no zip, gzipno tar?
Remi.b,

2
@ Remi.b: probabilmente devi confrontarlo in entrambi i modi e vedere. La domanda è: se la CPU è abbastanza veloce da comprimere i dati a una velocità maggiore di quella che potrebbero essere inviati in rete non compressi. Quindi la risposta dipenderà dalla tua particolare macchina e rete.
Nate Eldredge,

Ok ho ottenuto il punto +1. Grazie per l'aiuto
Remi.b

SSH stesso sembra prendere un po 'di CPU che noto, a volte al massimo molto al di sotto della larghezza di banda massima. Non so cosa fare lì ...
rogerdpack,

Le prestazioni dipendono anche dai dati. La copia di un file che è essenzialmente tutti zeri sarà altamente compressa. Ho un collegamento da 500 Mb tra due server remoti e ho appena copiato un file 50G (VMWare VMDK) contenente tutti gli zeri su questo collegamento a ~ 128-130 MB / s (probabilmente un limite del buffer di compressione scp), che richiede solo circa 6-7 minuti. Senza compressione questo avrebbe richiesto 1:45 ore. Il chilometraggio varia in base alla complessità dei dati e alla capacità di compressione.
Topher
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.