Como posso limitar a largura de banda usada por um processo?

Como posso limitar a largura de banda usada por um processo?

Eu tenho um servidor CentOS 5.7 que fará backup de seus arquivos todas as noites. Estou preocupado que os visitantes dos vários sites hospedados pelo servidor tenham um desempenho degradado enquanto o backup é transferido pela rede.

É possível limitar o rendimento máximo permitido de um processo a uma interface de rede? Gostaria de limitar a transferência de arquivos baseada em SSH a apenas metade da minha largura de banda disponível. Isso pode estar no lado do servidor ou do cliente; isto é, eu ficaria feliz em fazer isso no cliente que inicia a conexão ou no servidor que recebe a conexão.

(Infelizmente, não posso adicionar uma interface para dedicar aos backups. Eu poderia aumentar minha taxa de transferência disponível, mas isso significaria apenas que a transferência de rede seria concluída mais rapidamente, mas ainda assim maximizaria a capacidade total da conexão ao fazê-lo.)


Alguns antecedentes

Talvez alguns antecedentes sejam necessários. Recuando, tive o problema de não ter espaço local suficiente para criar o backup propriamente dito. Entre no SSHFS! O backup é salvo no que aparentemente é uma unidade local, para que nenhum bit de backup fique no próprio servidor da web.

Por que isso é importante? Porque isso pareceria invalidar o uso do venerável rsync --bwlimit. rsyncnão está realmente fazendo a transferência nempodeisso porque não consigo nem poupar espaço para salvar o arquivo de backup.

Posso ouvir você perguntar: "Então espere, por que você precisa fazer um arquivo de backup? Por que não apenas rsyncos arquivos e pastas de origem?" Porque uma coisa chata chamada "Plesk" está na mistura! Este é o meu host voltado para o cliente que usa o Plesk por conveniência. Como tal, eu uso o Plesk para iniciar os backups porque o Plesk adiciona todo tipo de magia extra ao backup que torna muito seguro consumi-lo durante um procedimento de restauração.

rosto triste

Responder1

Uma opção que acabei de descobrir é usartrickle.

trickleé um modelador de largura de banda de espaço de usuário leve e portátil. Ele pode ser executado em modo colaborativo (em conjunto com trickled) ou em modo autônomo.

tricklefunciona aproveitando o pré-carregamento do carregador Unix. Essencialmente, ele fornece ao aplicativo uma nova versão da funcionalidade necessária para enviar e receber dados através de soquetes. Em seguida, limita o tráfego com base no atraso do envio e recebimento de dados por meio de um soquete. trickleé executado inteiramente no espaço do usuário e não requer privilégios de root.

Para usuários do Ubuntu, instale-o executando

sudo apt install trickle

E como exemplo, execute maven buildlimitando a taxa de download de 20kB/s e 111kB/s para upload:

trickle -sd 20 -u 111 mvn build

Responder2

Você pode usar iptablespara marcar um pacote (--pid-owner ...) e depois usar tcpara moldar o tráfego. Além disso, "--sid-owner" pode ser usado para incluir threads e filhos desse processo.

http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH

Corresponder --pid-proprietário
Núcleo2,3, 2,4, 2,5 e 2,6
Exemplo iptables -A OUTPUT -m proprietário --pid-proprietário 78
Explicação Essa correspondência é usada para combinar pacotes com base no ID do processo (PID) responsável por eles. Essa correspondência é um pouco mais difícil de usar, mas um exemplo seria apenas permitir que o PID 94 envie pacotes da porta HTTP (se o processo HTTP não for encadeado, é claro). Alternativamente, poderíamos escrever um pequeno script que pegue o PID de uma saída ps para um daemon específico e então adicione uma regra para ele. Por exemplo, você poderia ter uma regra conforme mostrado no exemplo Pid-owner.txt

Responder3

Se você puder gravar em um pipe (ou stdout), poderá instalar o pvcomando (pipe viewer). Ele foi originalmente escrito para exibir o progresso dos dados transferidos através de um pipe.

tar cvf - /files/to/backup | pv -L 512k > /your/file/on/sshfs

   -L RATE, --rate-limit RATE
          Limit the transfer to a maximum of RATE  bytes  per  second.   A
          suffix of "k", "m", "g", or "t" can be added to denote kilobytes
          (*1024), megabytes, and so on.

Responder4

Como você está transferindo os dados? (rsync sobre ssh? scp? sftp? alguma outra coisa?)

rsync permitirá limitar a largura de banda (veja a opção --bwlimit=KBPS). rsync -e ssh --bwlimit ..

Como alternativa, você pode configurar um qdisc ou equivalente para limitar a taxa sofisticada, mas suspeito que, no seu caso, isso seria um exagero. A documentação sobre isso está disponível emO COMO FAZER Roteamento Avançado e Controle de Tráfego do Linux

informação relacionada