Je suis un étudiant diplômé et le groupe dans lequel je travaille maintient un cluster Linux. Chaque nœud du cluster possède son propre disque local, mais ces disques locaux sont relativement petits et ne sont pas équipés de sauvegarde automatique. Le groupe possède donc un serveur de fichiers avec de nombreux To d'espace de stockage. Je suis un novice Linux, je ne sais donc pas quelles sont les spécifications du serveur de fichiers en termes de vitesse, de capacité de mise en réseau, etc. Je sais par expérience que les disques locaux sont nettement plus rapides que le serveur de fichiers en termes d'E/S. . Une douzaine de personnes environ utilisent le serveur de fichiers.
L'utilisation de cp
pour copier un fichier de ~ 20 Go du serveur de fichiers vers l'un des disques locaux prend en moyenne 11,5 minutes en temps réel (selon time
). Je sais que cette opération cp
n'est pas très efficace car (1) time
me dit que l'heure système pour une telle copie n'est que de ~ 45 secondes; et parce que (2) lorsque j'examine top
pendant la copie, % CP est assez faible (par inspection, environ -10% en moyenne).
L'utilisation de cp
pour copier le même fichier ~ 20 Go d'un dossier sur le disque local vers un autre dossier sur le même disque local prend moins de temps - environ 9 minutes en temps réel (~ 51 secondes en temps système, selon à time
). Donc, apparemment, le serveur de fichiers est un peu plus lent que le disque local, comme prévu, mais peut-être pas beaucoup plus lent. Je suis surpris que la copie d'un local vers un même local ne soit pas plus rapide que 9 minutes.
J'ai besoin de copier ~ 200 gros fichiers - chacun ~ 20 Go - du serveur de fichiers vers l'un des disques locaux. Donc, ma question est: Y a-t-il une alternative plus rapide à cp
pour copier de gros fichiers sous Linux? (Ou y a-t-il des drapeaux dans cp
que je pourrais utiliser qui accélérerait la copie?) Même si je pouvais en quelque sorte raser une minute de ce temps de copie, cela aiderait énormément.
Je suis sûr que l'achat de nouveaux disques matériels plus rapides, mais je n'ai pas accès à ces ressources. Je ne suis pas non plus un administrateur système - je ne suis qu'un utilisateur (novice) - donc je n'ai pas accès à des informations plus détaillées sur la charge qui se trouve sur les disques. Je sais que même si une dizaine de personnes utilisent quotidiennement le serveur de fichiers, je suis la seule personne à utiliser ce nœud/disque local particulier.
% CPU devrait être faible lors d'une copie. Le CPU indique au contrôleur de disque "saisir les données des secteurs X – Y dans la mémoire tampon en Z". Ensuite, il s'en va et fait autre chose (ou sommeil, s'il n'y a rien d'autre). Le matériel déclenche une interruption lorsque les données sont en mémoire. Ensuite, le processeur doit le copier plusieurs fois et indique à la carte réseau "transmettre des paquets aux emplacements de mémoire A, B et C". Ensuite, cela revient à faire autre chose.
Vous poussez ~ 240 Mbps. Sur un LAN gigabit, vous devriez pouvoir faire au moins 800 Mbps, mais:
Pour rechercher le goulot d'étranglement, iostat -kx 10
va être une commande utile. Il vous montrera l'utilisation sur vos disques durs locaux. Si vous pouvez l'exécuter sur le serveur de fichiers, cela vous dira à quel point le serveur de fichiers est occupé.
La solution générale sera d'accélérer ce goulot d'étranglement, pour lequel vous n'avez bien sûr pas le budget. Mais, il existe quelques cas particuliers où vous pouvez trouver une approche plus rapide:
lzop
ou peut-être gzip --fastest
.rsync
n'aidera pas vraiment ici, car il devra lire le fichier des deux côtés pour trouver le delta. Au lieu de cela, vous avez besoin de quelque chose qui garde la trace du delta lorsque vous modifiez le fichier ... La plupart des approches ici sont spécifiques à l'application. Mais il est possible que vous puissiez truquer quelque chose avec, par exemple, Device-mapper (voir le tout nouveau cible dm-era ) ou btrfs.Et, puisque vous remarquez que vous n'êtes pas l'administrateur système, je suppose que cela signifie que vous avez un administrateur système. Ou au moins quelqu'un responsable du serveur de fichiers et du réseau. Vous devriez probablement leur demander, ils devraient être beaucoup plus familiers avec les spécificités de votre configuration. Votre administrateur système devrait au moins être en mesure de vous dire à quel taux de transfert vous pouvez raisonnablement vous attendre.
Cela pourrait, éventuellement, être une alternative plus rapide, et vous n'obstruerez pas le réseau pendant deux jours: prenez un ou deux gros disques USB (USB 3 si vous l'avez) ou FireWire, connectez-le au serveur et copiez les fichiers sur le disque. Transportez le disque sur votre ordinateur local. Copiez les fichiers sur la machine.
Si vous avez un accès SSH direct (ou SFTP) (demandez à votre administrateur système), vous pouvez utiliser scp
avec compression (-C
):
scp -C you@server:/path/to/yourfile .
Bien sûr, cela n'est utile que si le fichier est compressible, et cela utilisera plus de temps CPU, car il utilisera le cryptage (car il est sur SSH) et la compression.
Votre définition de l'efficacité est à l'envers. Une implémentation plus efficace gaspille moins temps CPU. Sur la copie locale, vous obtenez en moyenne environ 74 Mo/s de débit (lecture + écriture), ce qui est à peu près aussi bon qu'un disque dur unique.
L'implémentation cp
n'est probablement pas un goulot d'étranglement. Essayez d'observer IO utilisation via iotop
sur le serveur et le nœud de cluster. Cela vous donnera une idée où vous pouvez améliorer les performances.
Une autre astuce consiste à éviter de copier les mêmes données du même hôte. Par exemple, si vous avez un fichier 20G identique à distribuer à partir du serveur de fichiers sur le réseau vers tous les nœuds de cluster, cela fonctionnera beaucoup plus rapidement si vous copiez des fichiers de façon homologue à homologue plutôt qu'un serveur à tous les clients. C'est un peu plus compliqué à implémenter, mais vous pouvez même essayer d'utiliser certains p2p en ligne de commande comme le hub de connexion directe.
Si dans ces fichiers 20G, une partie est commune et certaines sont spécifiques au nœud de cluster, envisagez de la diviser en parties communes et spécifiques, puis distribuez la partie commune de manière p2p.
La nature/le contenu de ces fichiers peuvent faire une différence. J'ai compris que vous devez copier 200 fichiers, ~ 20 Go chacun, d'un ordinateur à un autre, c'est ça?
Si ces fichiers sont compressibles ou avec des pièces similaires/identiques, vous avez deux approches:
Compressez-les avant de copier ou créez un tunnel entre les ordinateurs avec Zip activé. Donc, si le réseau est le goulot d'étranglement, ce sera un peu plus rapide
si les fichiers sont très similaires, ou partagent des éléments de contenu commun entre eux, essayez d'utiliser rsync . Il passera un peu de temps à trouver ce qui est commun aux fichiers et n'aura pas besoin de le copier littéralement , car il le reconstruira en fonction de ce qui est commun.
modifier
Aurez-vous besoin de copier ces fichiers plusieurs fois ?? (comme une copie -> utiliser ces fichiers -> changer quelque chose dans les fichiers de l'ordinateur A -> copier à nouveau les fichiers sur l'ordinateur B)
Si c'est le cas, rsync sera utile, car il essaiera de détecter ce qui est égal entre les versions et ne copiera pas ce qui est inchangé.
Et une troisième méthode: si ce qui précède est correct (changements dans le fichier, puis copiez à nouveau tous les fichiers sur le deuxième ordinateur), vous pouvez essayer binary diff
pour simplement changer dans le deuxième ordinateur ce qui a été changé dans le premier ordinateur.
Je vois ce qui suit ici, le cryptage n'est pas une bonne idée car il pourrait éventuellement AUGMENTER la quantité de données à transférer.
Si vous copiez entre deux systèmes, le goulot d'étranglement est bien sûr la connexion entre les serveurs.
Si vous copiez localement, regardez comment le processus se déroule, il est à thread unique, donc les utilitaires Linux standard utilisent:
- for all blocks in a file
read a block
write a block
Il n'y a AUCUNE concurrence pour cette opération.
Pour accélérer les choses, vous pouvez utiliser quelque chose comme ceci:
buffer -i infile -o outfile -m size-of-shared-memory-default-1MByte
Consultez la page de manuel buffer (1) pour plus d'informations.
La commande buffer configure deux processus pour exécuter le processus de copie simultanément: l'un pour la lecture et l'autre pour l'écriture, et il utilise un tampon de mémoire partagée pour communiquer les données entre les deux processus. Le tampon de mémoire partagée est votre tampon circulaire classique qui empêche l'écrasement des données non écrites et l'écriture des données déjà écrites. J'ai utilisé ce programme pour couper environ 10 à 20% du temps de copie des transferts du disque vers la bande.
Pourquoi ne pas essayer un algorithme de propagation P2P, si vous devez mettre à jour votre cluster entier en même temps?
https://github.com/lg/murder est ce que Twitter utilise
Il y a BTSync que vous pouvez également essayer.
Si vous copiez fréquemment les mêmes ensembles de fichiers de votre ordinateur local vers le serveur avec des modifications mineures ici et là. Vous pouvez accélérer le transfert en utilisant rsync ou un DVCS (par exemple hg ou git).
git ou hg peuvent suivre et détecter les deltas et ne transférer que ces deltas. En cas d'utilisation d'un git, puisque les deux parties ont un historique complet du référentiel, déterminer le delta est très bon marché.
rsync utilise une forme d'algorithme de somme de contrôle continue pour détecter les deltas sans connaissance préalable de ce qui se trouve de l'autre côté. Bien que rsync demande plus de travail pour calculer les deltas, il n'a pas besoin de stocker l'historique complet du fichier.
Vous voudrez peut-être essayer de regrouper tous les fichiers dans une seule archive (ne doit pas être compressé). D'après mon expérience, la copie d'une archive est plus rapide que la copie d'un grand nombre de fichiers individuels
Essayez bbcp . Les tests dans notre environnement ont révélé que cp avait une sorte de régulateur intégré. Faites juste attention car lorsque vous enlevez le gouverneur, vous pouvez rediriger votre serveur et provoquer une panne. Dans notre cas, nous mettions le serveur hors ligne pour effectuer la copie, donc plus vite était mieux. Cela a amélioré le temps de transfert de plusieurs heures.
Assurez-vous que les fichiers cibles n'existent pas avant la copie.
Parfois, il est surprenant de voir combien de temps est passé, même juste à copier sur le même hôte (aucun réseau impliqué).
Voir ma réponse à une autre question cp ici . Pour faire court, écraser un fichier existant est beaucoup plus lent que de le tronquer ou de le dissocier d'abord, puis de le copier. Ce dernier est 8 fois plus rapide pour un fichier de 1,2 Go.