11 votes

Copie de fichiers en parallèle

J'ai une liste de fichiers que je dois copier sur un système Linux - chaque fichier a une taille comprise entre 10 et 100 Go.

Je ne veux copier que sur le système de fichiers local. Existe-t-il un moyen de faire cela en parallèle - avec plusieurs processus chacun responsable de la copie d'un fichier - dans un système de gestion de fichiers ? simple manière ?

Je peux facilement écrire un programme multithread pour faire cela, mais j'aimerais savoir s'il existe une méthode Linux de bas niveau pour faire cela.

1voto

johann peyrard Points 21

Pour ceux qui pensent que ce n'est pas une bonne idée, je dirais que c'est une dépendance. Vous pouvez avoir un gros système raid ou un système de fichiers parallèle qui fournira de bien meilleures performances que ce qu'un seul processus cp peut gérer. Alors oui, vous devez utiliser un "outil parallèle".

Prenons l'exemple suivant :

timeout 10 strace -e write -c cp /dev/zero /dev/null
strace: Process 24187 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.655188           4    166222           write
------ ----------- ----------- --------- --------- ----------------
100.00    0.655188                166222           total

puis ceci

timeout 0.01 strace -e write  cp /dev/zero /dev/null
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
strace: Process 24567 detached

Donc chaque écriture syscall faite par "cp" dans ce cas est de 64KiB et pendant 10s sur mon système je suis capable de fournir cette bande passante : 65536*166222/10 = 1089352499 =~ 1,08GB/s

Maintenant, lançons cette charge de travail avec 2 processus (j'ai 4 cœurs mais mon bureau est utilisé pour d'autres choses, et ici c'est juste un exemple) :

timeout 10 strace -e write -c cp /dev/zero /dev/null & timeout 10 strace -e write -c cp /dev/zero /dev/null &  wait
[1] 26106
[2] 26107
strace: Process 26113 detached
strace: Process 26112 detached
% time     seconds  usecs/call     calls    errors syscall
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
------ ----------- ----------- --------- --------- ----------------
100.00    0.624108           4    162616           write
100.00    0.638468           4    162451           write
------ ----------- ----------- --------- --------- ----------------
100.00    0.624108                162616           total
100.00    0.638468                162451           total
------ ----------- ----------- --------- --------- ----------------
[1]-  Exit 124                timeout 10 strace -e write -c cp /dev/zero /dev/null

Nous voyons donc que nous pouvons presque doubler les performances en utilisant 2 cœurs pour lancer cette application.

Donc si nous sommes dans un contexte différent de 1xHard drive à 1xHard drive mais une matrice raid ( ou plusieurs NVMe donc pas le cas le plus commun je suis d'accord mais je travaille sur ça tous les jours ), il montre définitivement une meilleure performance d'utiliser plusieurs communs en parallèle.

-1voto

user3749113 Points 1

Vous devriez essayer ceci :

    $ seq 3 | parallel cp -v /etc/passwd passwd{}

Ceci copiera 3 fois le fichier passwd du répertoire /etc/ vers votre $HOME

Ou si votre fichier se trouve dans votre répertoire personnel

    $ seq 3 | parallel cp -v passwd{,{}}

Ceci copiera le fichier passwd 3 fois dans votre $HOME

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X