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

41

Eu tenho um servidor CentOS 5.7 que fará o backup de seus arquivos todas as noites. Preocupa-me que os visitantes dos vários sites que o servidor hospeda tenham um desempenho reduzido enquanto o backup está sendo transferido pela rede.

É possível limitar o rendimento máximo permitido de um processo a uma interface de rede? Eu gostaria de limitar a transferência de arquivos baseada em SSH para apenas metade da minha largura de banda disponível. Isso pode estar no servidor ou no lado do cliente; isto é, 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 a 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 max a capacidade total da conexão ao fazê-lo.)

Alguns antecedentes

Talvez algum contexto esteja em ordem. Voltando atrás, eu tive um problema em não ter espaço local suficiente para criar o próprio backup. Digite SSHFS! O backup é salvo no que é ostensivamente uma unidade local, de modo que nenhum bit de backup esteja no próprio servidor da web.

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

Eu ouço você perguntar: "Então espere, por que você precisa fazer um arquivo de backup? Por que não apenas rsync dos arquivos e pastas de código-fonte?" Porque uma coisa chata chamada "Plesk" está na mistura! Este é meu host da Web 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 todos os tipos de magia extra ao backup, o que torna o consumo durante um procedimento de restauração muito seguro.

cara triste

    
por Wesley 14.03.2012 / 01:24

5 respostas

25

Você pode usar iptables para marcar um pacote (--pid-owner ...) e usar tc para moldar o tráfego. Também "--sid-owner" pode ser usado para incluir segmentos e filhos desse processo.

link

Match --pid-owner
Kernel 2.3, 2.4, 2.5 and 2.6
Example iptables -A OUTPUT -m owner --pid-owner 78
Explanation This match is used to match packets based on the Process ID (PID) that was responsible for them. This match is a bit harder to use, but one example would be only to allow PID 94 to send packets from the HTTP port (if the HTTP process is not threaded, of course). Alternatively we could write a small script that grabs the PID from a ps output for a specific daemon and then adds a rule for it. For an example, you could have a rule as shown in the Pid-owner.txt example

    
por 14.03.2012 / 01:57
37

Uma opção que acabei de descobrir é usar o gotejamento .

trickle is a portable lightweight userspace bandwidth shaper. It can run in collaborative mode (together with trickled) or in stand alone mode.

trickle works by taking advantage of the unix loader preloading. Essentially it provides, to the application, a new version of the functionality that is required to send and receive data through sockets. It then limits traffic based on delaying the sending and receiving of data over a socket. trickle runs entirely in userspace and does not require root privileges.

    
por 14.03.2012 / 02:57
21

Se você puder gravar em um pipe (ou stdout), poderá instalar o comando pv (visualizador de pipe). 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.
    
por 14.03.2012 / 10:06
6

Eu uso o rsync com a opção --bwlimit = KBPS pelo mesmo motivo.

Nossa Ethernet de 1 Gbit é facilmente capaz de inundar nosso antigo RAID SCSI320 DAS e, essencialmente, algumas de nossas antigas caixas de produção que dependem dele para seus repositórios NFS.

    
por 14.03.2012 / 01:28
4

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

O rsync permitirá que você limite a largura de banda (veja a opção --bwlimit = KBPS). rsync -e ssh --bwlimit ..

Alternativamente, você pode configurar um qdisc ou equivalente para limitar a taxa de fantasia, mas eu suspeito que no seu caso isso seria um exagero grave. A documentação sobre isso está disponível em O HOWTO de Roteamento avançado e controle de tráfego do Linux

    
por 14.03.2012 / 01:32