¿Cómo puedo reducir el uso de recursos al copiar un archivo grande?

8

Necesito mover un archivo grande (tabla corrupta de MySQL ~ 40GB) a un servidor separado para repararlo. (Al intentar reparar en mi servidor de producción, rápidamente mató al servidor).

Para hacer esto, quiero sincronizar los archivos .frm, .MYI y .MYD de mi servidor de producción a un servidor en la nube.

Estoy copiando los archivos de / var / lib / mysql / {database} / a / home / {myuser} para no tener que habilitar el acceso raíz para el comando rsync y estar 100% seguro de que el archivo de la base de datos no está en uso (no debería escribirse ni leerse, pero obviamente no quiero cerrar mi base de datos de producción para asegurarme).

El primer archivo que intenté copiar era de unos 10 GB. Estoy transfiriendo de una parte de mi servidor de producción a la otra, es decir, a la misma matriz de discos.

Desafortunadamente, el comando de copia "cp filename newfilename" tomó tantos recursos que detuvo el servidor.

¿Cómo puedo usar menos recursos al copiar el archivo a un directorio diferente? (Realmente no importa cuánto tiempo tome).

Suponiendo que logré hacer esto, ¿qué uso de recursos puedo esperar al sincronizar el archivo a la nube?

¿Alguien puede sugerir una mejor manera de hacer esto? Me estoy quedando rápidamente sin espacio en disco, así que necesito reparar y archivar esta tabla lo antes posible.

Jon M
fuente

Respuestas:

5

¿Has probado nice -n10prefijado al comando?

10es el valor predeterminado El rango va de -20(prioridad más alta) a 19(más bajo).

Jonathan Ross
fuente
@Jonathan Entiendo que esto limitará el uso de la CPU solamente, no la E / S de disco y la RAM: linux.com/archive/feed/58638
Jon M
Sí, pero es un comienzo, en términos de reducir uno de los cuellos de botella: puede ser suficiente para detener la máquina.
Jonathan Ross el
Gracias @Jonathan Ross, de acuerdo con esto: linux.die.net/man/1/ionice "Los programas heredan la configuración agradable de la CPU para las prioridades io", por lo que podría funcionar, pero estoy investigando una combinación de "agradable" y "ionice"
Jon M
Buen pensamiento. Siempre comencé nicepor costumbre en su mayoría. iotopTambién es tu amigo.
Jonathan Ross el
3
El comando final que ejecuté fue nice -n 20 ionice -c 3 cp /var/lib/mysql/{database}/{table}.MYI /home/{USER}/Esto aumentó la carga en mi servidor, lo que lo ralentizó un poco, pero el sitio web estuvo disponible mientras duró la transferencia
Jon M
10

Dos opciones además de la limitación de ancho de banda de rsync:

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

ioniceinteractuará con el planificador de E / S. bufferes un búfer circular destinado a ayudar a los dispositivos de caracteres a ser más eficientes, pero -u 150pausará 150 microsegundos entre escrituras que, según el manual, pueden ser suficientes para dar espacio a un disco para respirar.

Ambos ionicey bufferestán disponibles en una compilación de Ubuntu. iotopes útil si tiene CONFIG_TASK_DELAY_ACCT configurado en su kernel, pero mi cuadro de Ubuntu no lo hizo, lo que limita severamente la usabilidad del comando. Ya sé qué comando está ahogando mi disco duro, solo quiero darle un respiro.

Además, mientras la copia está en progreso, mire la salida de iostat -x 1(generalmente en el paquete sysstat) y vea que el campo% ocupado para su dispositivo es 90% o menos durante la copia. Si está al 99-100%, entonces está eliminando otros procesos para E / S.

zerolagtime
fuente
Gracias por su respuesta @zerolagtime Terminé usando un comando ionice similar pero marqué la respuesta anterior como correcta
Jon M
ionice -c 3 -p $pidUnisonestá trabajando para unísono en HDD externo, gracias !!
Acuario Power
6

use rsync con el conmutador --bwlimit = KBPS (límite de ancho de banda de E / S; KBytes por segundo). juega con un archivo más pequeño y trata de encontrar una combinación óptima entre la velocidad de transferencia y el uso del sistema. Monitor en el segundo shell con "vmstat 1"

shakalandy
fuente
Ciertamente intentaré esto para limitar los recursos del comando RSYNC, pero en este momento solo estoy tratando de copiar un archivo a otra ubicación en mi servidor a través del comando "cp".
Jon M
También puede usar rsync para copiar el archivo local y limitar el ancho de banda con el modificador --bwlimit.
shakalandy
rsynccopiará archivos localmente. Piensa rsync --bwlimit=28000 foo.frm /bar/foo.frmy luego míralo con iostat. No estoy seguro de por qué vmstatte diría si estuvieras saturando un disco. Busque% ocupado en iostat.
zerolagtime
bueno, vmstat muestra tu IO en dispositivos de bloque. Además se puede ver cualquier otra cosa que es importante para el uso de la máquina (CPU, los procesos de usuario, la CPU espera, intercambio, ...)
shakalandy
0

Una alternativa es:

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

Pero no creo que funcione si $ {src} es un archivo en crecimiento ... ¿puede sugerir una forma de copiar y esperar a que se cierre la fuente ...

rzr
fuente