2010-11-11 7 views
8

Ho un repository con 30k + file di piccole dimensioni e posso accedere al server tramite Internet solo tramite https://. Il checkout è molto, molto lento. Nell'ordine delle ore. La velocità di connessione Internet è ~ 20 Mb e la macchina locale è 3Ghz multi-core & 10k RPM HD.Un controllo SVN può essere multithreading?

(svn:// protocollo non è un'opzione, purtroppo.)

Quindi la mia domanda:

Può svn fare un checkout multi-threaded in parallelo di una copia di lavoro?

Sembra che il checkout di svn proceda file per file in ordine sequenziale. C'è un ritardo minimo tra ogni file e suppongo che sia la richiesta/risposta http e possibilmente i ritardi del mio filesystem locale. (Forse un po 'di latenza filesystem del server come bene?)

Grazie

+0

Immagino (anche se non ho controllato) che il tempo di checkout sia dominato dalla larghezza di banda I/O. Sarei interessato a sapere se questo non è il caso. –

+0

Un attacco così ovvio come quello che stai tentando di provare è chiaramente un'indicazione che qualcosa è fondamentalmente sbagliato nell'ambiente. Forse staresti meglio a fare un'altra domanda che descrive la tua situazione e chiedere suggerimenti su come le cose potrebbero essere meglio ottimizzate. Ad esempio, perché ci sono 30.000 file in un unico repository SVN. Forse è ora di dividerli un po '? –

+2

@spencer Il repository è grande, ma questo non dipende da me. So che altri layout sono migliori, ma dal momento che questo non è nel mio controllo, non ho fatto questa domanda. – nonot1

risposta

9

Non so di un comando, ma potresti scrivere un piccolo script Python (o lo strumento di tua scelta) per aiutarti. "svn list" ti dà il nome di ogni sottodirectory. È quindi possibile eseguire un checkout di ciascuna sottodirectory in background in modo che avvengano in parallelo. Potrebbe essere necessario farlo al 2 °/3 °/qualsiasi livello in profondità a seconda della struttura della directory e dove risiedono tutti i file minuscoli.

Suppongo che non si abbiano file 30K nella stessa directory, naturalmente.

+0

Non è una cattiva idea. Probabilmente potresti anche usare una serie di checkout poco profondi. Qualche strumento lo fa già? – nonot1

0

Anche se non posso pensare a nessun motivo per cui non poteva SVN checkout più di un file alla volta, non so qualsiasi client SVN così fa.

-1

Non dipende molto dal tempo di ping sul server?

Se il ping è lungo, potrebbe non essere possibile fare nulla al riguardo.

C'è anche una possibilità che il router che gestisce il firewall stia cadendo indietro e usi qualcosa come l'ispezione di pacchetti stateful, ovvero guardando ogni pacchetto. il router può essere modificato in modo da consentire la scansione dei pacchetti di escape del server svn.

+1

Il tempo di ping o "latenza" in teoria influisce solo sul tempo impiegato dal primo pacchetto per arrivare. Poiché SVN esegue molte richieste di back-and-forward sequenziali, l'idea di utilizzare il parallelismo è molto valida. Se il collo di bottiglia fosse pura larghezza di banda, il parallelismo non aiuterebbe affatto. – Evert

0

È possibile che i controlli sparsi (versioni SVN più recenti,> = 1,6 o così!) Siano utili per le prestazioni?

time svn co --depth=empty http://URI 

cd svn_repo_root/ 

time svn up --depth=infinity * 

Inoltre, forse è utile per la fornitura di server e/o client con SSD per poter lavorare sistema operativo intorno cattivo o prestazioni implementazione del server/client SVN nel caso di multi-lookup di molti file di piccole dimensioni (a causa di cercare la latenza temporale che domina a fondo le operazioni del file system in caso di file di piccole dimensioni - la ricerca è molto meno un problema con gli SSD).

E forse vale la pena garantire la cache-hotness di tutti i file sul server prima di controllare le cose, scrivendo uno script per analizzare l'intero albero del repository sul server.

2

È possibile utilizzare GNU Parallel per checkout svn paralleli. Esempio-

svn ls 'https://foo/bar' | parallel svn export 'https://foo/bar/'{} 

Verrà avviata casse svn parallele sotto directory 'bar'.