Ci sono due modi per fare ciò entrambi comportano la disattivazione della compressione. Gradle prima poi spegnerlo con il metodo del vaso ...
È possibile farlo usando Gradle (questa risposta in realtà è venuto dalla OP)
shadowJar {
zip64 true
entryCompression = org.gradle.api.tasks.bundling.ZipEntryCompression.STORED
exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
manifest {
attributes 'Main-Class': 'com.my.project.Main'
}
}
con
jar {
manifest {
attributes(
'Main-Class': 'com.my.project.Main',
)
}
}
task fatJar(type: Jar) {
manifest.from jar.manifest
classifier = 'all'
from {
configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) }
} {
exclude "META-INF/*.SF"
exclude "META-INF/*.DSA"
exclude "META-INF/*.RSA"
}
with jar
}
La cosa fondamentale qui è che la compressione è stato spento cioè
org.gradle.api.tasks.bundling.ZipEntryCompression.STORED
è possibile trovare la documentazione qui
https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/bundling/ZipEntryCompression.html#STORED
Sì, è possibile accelerarlo di circa il 40% su un nuovo archivio e di oltre il 200% su un vaso archiviare hai già rsync'd. Il trucco è quello di non comprimere il barattolo in modo che tu possa sfruttare l'algoritmo di chunking di rsyncs.
ho usato i seguenti comandi per comprimere una directory con un sacco di file di classe ...
jar cf0 uncompressed.jar .
jar cf compressed.jar .
Questo ha creato i seguenti due vasi ...
-rw-r--r-- 1 rsync jar 28331212 Apr 13 14:11 ./compressed.jar
-rw-r--r-- 1 rsync jar 38746054 Apr 13 14:10 ./uncompressed.jar
Si noti che la dimensione del vaso non compresso è di circa 10 MB più grande.
Quindi ho eseguito il rsync di questi file e li ho cronometrati utilizzando i seguenti comandi. (Nota, anche l'attivazione della compressione per il file compresso ha avuto scarso effetto, spiegherò più avanti).
Jar compressa
time rsync -av -e ssh compressed.jar [email protected]:/tmp/
building file list ... done
compressed.jar
sent 28334806 bytes received 42 bytes 2982615.58 bytes/sec
total size is 28331212 speedup is 1.00
real 0m9.208s
user 0m0.248s
sys 0m0.483s
Jar non compresso
time rsync -avz -e ssh uncompressed.jar [email protected]:/tmp/
building file list ... done
uncompressed.jar
sent 11751973 bytes received 42 bytes 2136730.00 bytes/sec
total size is 38746054 speedup is 3.30
real 0m5.145s
user 0m1.444s
sys 0m0.219s
Abbiamo acquisito un aumento di velocità di quasi il 50%. Questo almeno accelera il rsync e otteniamo una buona spinta ma per quanto riguarda i successivi rsyncs in cui una piccola modifica è stata effettuata .
ho rimosso un file di classe dalla directory che è stato di 170 byte di dimensione ricreato i vasi falciare sono queste dimensioni ..
-rw-r--r-- 1 rsycn jar 28330943 Apr 13 14:30 compressed.jar
-rw-r--r-- 1 rsync jar 38745784 Apr 13 14:30 uncompressed.jar
Ora i tempi sono molto diversi.
Jar compressa
building file list ... done
compressed.jar
sent 12166657 bytes received 31998 bytes 2217937.27 bytes/sec
total size is 28330943 speedup is 2.32
real 0m5.435s
user 0m0.378s
sys 0m0.335s
Jar non compresso
building file list ... done
uncompressed.jar
sent 220163 bytes received 43624 bytes 175858.00 bytes/sec
total size is 38745784 speedup is 146.88
real 0m1.533s
user 0m0.363s
sys 0m0.047s
in modo che possiamo accelerare rsyncing grande vaso file molto con questo metodo. La ragione di ciò è legata alla teoria dell'informazione. Quando comprimi i dati, in pratica rimuove tutto ciò che è comune ai dati, ovvero ciò che ti rimane assomiglia molto a dati casuali, i migliori compressori rimuovono più di queste informazioni. Una piccola modifica a qualsiasi dato e la maggior parte degli algoritmi di compressione hanno un effetto drammatico sull'output dei dati.
L'algoritmo Zip rende effettivamente più difficile per rsync trovare checksum uguali tra server e client e ciò significa che è necessario trasferire più dati. Quando lo decidi, stai facendo sì che rsync faccia ciò che è buono, invia meno dati per sincronizzare i due file.
Commento in caso qualcuno risponda.Devo saperlo anche io. –
È un'opzione per inviare il JAR decompresso con rsync e comprimerlo nuovamente sul dispositivo remoto? In questo modo rsync dovrebbe essere in grado di avere poco traffico. –
Beh, è un'opzione. Preferirei preparare tutto sulla macchina sorgente però. Penso che questa soluzione richiederebbe anche molte operazioni inutili sul disco di I/O. –