web-dev-qa-db-fra.com

scp bloqué lors de la copie de gros fichiers

En fonction des besoins de l’expérience, j’ai mis le MTU sur 8000. Après cela, lorsque j’utilise scp pour copier des fichiers volumineux, le problème est survenu avec 0.00%. J'ai essayé scp -l ou scp -C et activer/désactiver tcp_sack, mais cela ne fonctionnait toujours pas. Et je ne peux pas changer la taille du MTU pour la comparaison des résultats d’expérimentation. Y a-t-il un autre moyen d'aider?

28
flyhighzy

Une tentative de solution globale, car il pourrait y avoir plusieurs problèmes et limitations en fonction de votre situation.

rsync

Mon option préférée: utiliser rsyncne pose pas ce problème et est un peu plus polyvalente à mon avis, par exemple. il garde la trace des fichiers qui sont déjà là, donc si la connexion est interrompue, elle peut reprendre là où elle s'est arrêtée - essayez également le drapeau --partial - , entre autres

Au lieu de 

scp local/path/some_file [email protected]:"/some/path/"

tu peux juste faire

rsync -avz --progress local/path/some_file [email protected]:"/some/path/"

J'ai testé cela à plusieurs reprises lorsque scp me donnait le même problème que celui que vous aviez rencontré - et maintenant j'utilise simplement rsync par défaut.

Vitesse limite

Pas une solution pour OP car le MTU est fixé dans cette situation (et probablement pas le problème ici), mais si le coupable est une connexion lente/peu fiable entre les deux disques, la définition d’une limite de vitesse réduit les retards qui font que TCP décrochage de la connexion - au prix d’un transfert plus lent, bien sûr. C'est parce que scp récupère toute la bande passante qu'il peut obtenir à moins que vous ne spécifiiez le débit binaire maximum en kilobits, comme ceci:

scp -l 8192 local/path/some_file [email protected]:"/some/path/"

Ceci ne fonctionne pas toujours bien. 

Option de compression

l'option -C de scp peut accélérer le transfert, réduisant ainsi la probabilité que le transfert stagne. 

Désactiver SACK TCP

Comme mentionné par le PO, et ici

Sudo sysctl -w net.ipv4.tcp_sack=0

( ou similaire )

MTU de la carte LAN

Encore une fois un MTU fix , pas nécessairement du transfert spécifiquement si: 

ifconfig eth0 mtu 1492

ou sur les nouveaux systèmes (Linux)

ip link set dev eth0 mtu 1492

Autre

Si tout échoue, this répertorie une poignée de solutions potentielles non incluses ici. 

Le bogue plus exotique hpn peut également être en cause. 

60
BrechtDeMan

Avez-vous une chance d'être derrière un pare-feu Cisco ASA? Si tel est le cas, désactivez la "randomisation du numéro de séquence" et cela vous aidera beaucoup - désactivez également TCP Déchargement (ethtool -K $ INTERFACE tso off gso off gro gro) si vous utilisez un Cisco ASA avec Broadcom Cartes réseau sur votre serveur.

0
dotwaffle