Como posso reduzir o uso de recursos ao copiar um arquivo grande?

8

Eu preciso mover um arquivo grande (tabela MySQL corrompida ~ 40GB) para um servidor separado para repará-lo. (Ao tentar reparar no meu servidor de produção, ele rapidamente matou o servidor).

Para fazer isso, desejo sincronizar novamente os arquivos .frm, .MYI e .MYD do meu servidor de produção em um servidor em nuvem.

Estou copiando os arquivos de / var / lib / mysql / {database} / para / home / {myuser} para que não precise ativar o acesso root para o comando rsync e tenha 100% de certeza de que o arquivo do banco de dados não está em uso (não deve ser gravado ou lido, mas obviamente não quero desligar meu banco de dados de produção para garantir).

O primeiro arquivo que tentei copiar tinha cerca de 10 GB. Estou transferindo de uma parte do meu servidor de produção para a outra, ou seja, para a mesma matriz de discos.

Infelizmente, o comando copy "cp filename newfilename" consumiu tantos recursos que deixou o servidor parado.

Como posso usar menos recursos ao copiar o arquivo para um diretório diferente? (Realmente não importa quanto tempo leva).

Supondo que eu consiga fazer isso, que uso de recursos posso esperar ao sincronizar novamente o arquivo na nuvem?

Alguém pode sugerir uma maneira melhor de fazer isso? Como estou ficando sem espaço em disco rapidamente, é necessário reparar e arquivar esta tabela o mais rápido possível.

Jon M
fonte

Respostas:

5

Você já tentou o nice -n10prefixo do comando?

10é o valor padrão. O intervalo vai de -20(prioridade mais alta) a 19(mais baixa).

Jonathan Ross
fonte
@ Jonathan O meu entendimento é que isso vai limitar o useage CPU apenas, não Disk I / O e memória RAM: linux.com/archive/feed/58638
Jon M
Sim, mas é um começo, em termos de redução de um dos gargalos - pode ser o suficiente para parar a máquina pendurada.
111111 Jonathan Ross
Obrigado, Jonathan Ross, de acordo com o seguinte: linux.die.net/man/1/ionice "Os programas herdam a configuração agradável da CPU para prioridades io.", Portanto pode funcionar, mas estou pesquisando uma combinação de "nice" e "ionice"
Jon M
Bem pensado. Eu sempre comecei com niceo hábito principalmente. iotoptambém é seu amigo.
Jonathan Ross
3
O comando final que eu executei foi: nice -n 20 ionice -c 3 cp /var/lib/mysql/{database}/{table}.MYI /home/{USER}/Isso aumentou a carga no meu servidor, diminuindo um pouco a velocidade, mas o site ficou disponível durante a transferência
Jon M -
10

Duas opções além da limitação da largura de banda rsync:

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

ionicefará interface com o planejador de E / S. bufferé um buffer circular destinado a ajudar os dispositivos de caracteres a serem mais eficientes, mas -u 150fará uma pausa de 150 microssegundos entre gravações que, de acordo com o manual, podem ser suficientes para dar espaço ao disco para respirar.

Ambos ionicee bufferestão disponíveis em uma compilação Ubuntu do estoque. iotopé útil se você tiver o CONFIG_TASK_DELAY_ACCT configurado no seu kernel, mas minha caixa do Ubuntu não limitou severamente a usabilidade do comando. Eu já sei qual comando está afogando meu disco rígido, só quero dar algum espaço para respirar.

Além disso, enquanto a cópia estiver em andamento, observe a saída de iostat -x 1(geralmente no pacote sysstat) e veja se o campo% ocupado do dispositivo é 90% ou menos durante a cópia. Se estiver entre 99 e 100%, você estará passando por outros processos de E / S.

zerolagtime
fonte
Obrigado pela sua reponse @zerolagtime acabei usando um comando semelhante ionice mas marcaram a resposta anterior como correta
Jon M
ionice -c 3 -p $pidUnisonestá trabalhando para uníssono no disco rígido externo, thx !!
Poder de Aquário
6

use rsync com a opção --bwlimit = KBPS (limite de largura de banda de E / S; KBytes por segundo). brinque com um arquivo menor e tente encontrar a combinação ideal entre velocidade de transferência e uso do sistema. Monitorar no segundo shell com "vmstat 1"

shakalandy
fonte
Certamente tentarei limitar os recursos do comando RSYNC, mas no momento estou apenas tentando copiar um arquivo para outro local no meu servidor através do comando "cp".
11139 Jon M
você também pode usar o rsync para copiar o arquivo local e limitar a largura de banda com a opção --bwlimit.
shakalandy
rsynccopiará arquivos localmente. Pense rsync --bwlimit=28000 foo.frm /bar/foo.frme depois assista iostat. Não sei por vmstatque lhe diria se você estava saturando uma unidade. Procure% ocupado em iostat.
precisa saber é o seguinte
bem, vmstat mostra seu IO em dispositivos de bloco. Além disso, você pode ver qualquer outra coisa que é importante para o uso da máquina (CPU, os processos de usuário, espera cpu, troca, ...)
shakalandy
0

Uma alternativa é:

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

Mas acho que não funcionará se $ {src} for um arquivo crescente ... você pode sugerir uma maneira de copiar e esperar que o código seja fechado ...

rzr
fonte