Comment puis-je réduire l'utilisation des ressources lors de la copie d'un gros fichier?

8

J'ai besoin de déplacer un gros fichier (table MySQL corrompue ~ 40 Go) sur un serveur séparé afin de le réparer. (En essayant de réparer sur mon serveur de production, cela a rapidement tué le serveur).

Pour ce faire, je souhaite resynchroniser les fichiers .frm, .MYI et .MYD de mon serveur de production vers un serveur cloud.

Je copie les fichiers depuis / var / lib / mysql / {base de données} / vers / home / {monutilisateur} afin de ne pas avoir besoin d'activer l'accès root pour la commande rsync et d'être sûr à 100% que le fichier de base de données n'est pas en cours d'utilisation (il ne doit pas être écrit ou lu, mais évidemment je ne veux pas fermer ma base de données de production pour m'en assurer).

Le premier fichier que j'ai essayé de copier était d'environ 10 Go. Je transfère d'une partie de mon serveur de production à l'autre, c'est-à-dire vers la même matrice de disques.

Malheureusement, la commande de copie "cp filename newfilename" a pris tellement de ressources qu'elle a mis le serveur à l'arrêt.

Comment puis-je utiliser moins de ressources lors de la copie du fichier dans un répertoire différent? (Peu importe le temps que cela prend).

En supposant que j'arrive à le faire, à quelle utilisation des ressources puis-je m'attendre lors de la synchronisation du fichier dans le cloud?

Quelqu'un peut-il suggérer une meilleure façon de procéder? Je manque rapidement d'espace disque, je dois donc réparer et archiver cette table dès que possible.

Jon M
la source

Réponses:

5

Avez-vous essayé de nice -n10préfixer la commande?

10est la valeur par défaut. La plage va de -20(priorité la plus élevée) à 19(la plus faible).

Jonathan Ross
la source
@Jonathan Je crois que cela limitera l'utilisation du processeur uniquement, pas les E / S de disque ET la RAM: linux.com/archive/feed/58638
Jon M
Oui, mais c'est un début, en termes de réduction de l'un des goulots d'étranglement - cela pourrait suffire à empêcher la machine de se bloquer.
Jonathan Ross
Merci @Jonathan Ross, selon ceci: linux.die.net/man/1/ionice "Les programmes héritent du paramètre CPU nice pour les priorités io.", Donc cela pourrait bien fonctionner, mais je recherche une combinaison de "nice" et "ionice"
Jon M
Bien pensé. Je commençais toujours par nicehabitude surtout. iotopest aussi ton ami.
Jonathan Ross
3
La dernière commande que j'ai exécutée a été nice -n 20 ionice -c 3 cp /var/lib/mysql/{database}/{table}.MYI /home/{USER}/Cela a fait augmenter la charge sur mon serveur, le ralentissant un peu, mais le site Web était disponible pendant la durée du transfert
Jon M
10

Outre la limitation de la bande passante rsync, deux choix:

  • ionice -c 3 cp foo bar
  • buffer -u 150 -m 16m -s 100m -p 75 -i foo -o bar

ionices'interface avec le planificateur d'E / S. bufferest un tampon circulaire destiné à aider les appareils de caractères à être plus efficaces, mais la -u 150pause de 150 microsecondes entre les écritures, ce qui, selon le manuel, peut être suffisant pour donner un espace disque pour respirer.

Les deux ioniceet buffersont disponibles dans une version Ubuntu d'origine. iotopest pratique si vous avez configuré CONFIG_TASK_DELAY_ACCT dans votre noyau, mais ma boîte Ubuntu ne l'a pas fait, ce qui limite gravement l'utilisabilité de la commande. Je sais déjà qui commande se noie mon disque dur, je veux juste donner une bouffée d'oxygène.

De plus, pendant que la copie est en cours, examinez la sortie de iostat -x 1(généralement dans le package sysstat) et vérifiez que le champ% occupé pour votre appareil est de 90% ou moins pendant la copie. Si elle est à 99-100%, vous affamez d'autres processus d'E / S.

zerolagtime
la source
Merci pour votre réponse @zerolagtime J'ai fini par utiliser une commande ionice similaire mais j'ai marqué la réponse précédente comme correcte
Jon M
ionice -c 3 -p $pidUnisontravaille à l'unisson sur le disque dur externe, merci !!
Aquarius Power
6

utilisez rsync avec le commutateur --bwlimit = KBPS (limite la bande passante d'E / S; Koctets par seconde). jouer avec un fichier plus petit et essayer de trouver un mélange optimal entre la vitesse de transfert et l'utilisation du système. Moniteur dans le deuxième shell avec "vmstat 1"

shakalandy
la source
J'essaierai certainement ceci pour limiter les ressources de la commande RSYNC, mais en ce moment j'essaye juste de copier un fichier vers un autre emplacement sur mon serveur via la commande "cp".
Jon M
vous pouvez également utiliser rsync pour copier le fichier local et limiter la bande passante avec le commutateur --bwlimit.
shakalandy
rsynccopiera les fichiers localement. Pensez rsync --bwlimit=28000 foo.frm /bar/foo.frmpuis regardez-le avec iostat. Je ne sais pas pourquoi vmstatvous dirait si vous saturiez un lecteur. Recherchez% occupé iostat.
zerolagtime
eh bien, vmstat montre votre E / S sur des périphériques blocs. De plus, vous pouvez voir tout ce qui est important pour l'utilisation de la machine (processeur, processus utilisateur, attente de processeur, échange, ...)
shakalandy
0

Une alternative est:

scp -l ${KBPS} ${src} ${dest}

Mais je ne pense pas que cela fonctionnera si $ {src} est un fichier en pleine croissance ... pouvez-vous suggérer un moyen de copier et d'attendre la fermeture de la source ...

rzr
la source