Pesquisa de site

Como limitar a largura de banda da rede usada por aplicativos em um sistema Linux com Trickle


Você já se deparou com situações em que um aplicativo dominava toda a largura de banda da rede? Se você já esteve em uma situação em que um aplicativo consumiu todo o seu tráfego, você valorizará a função do aplicativo modelador de largura de banda lenta.

Seja você um administrador de sistema ou apenas um usuário Linux, você precisa aprender como controlar as velocidades de upload e download de aplicativos para garantir que a largura de banda da sua rede não seja queimada por um único aplicativo.

O que é gotejamento?

Trickle é uma ferramenta modeladora de largura de banda de rede que nos permite gerenciar as velocidades de upload e download de aplicativos para evitar que qualquer um deles consuma toda (ou a maior parte) da largura de banda disponível.

Em poucas palavras, o trickle permite controlar a taxa de tráfego da rede por aplicativo, em oposição ao controle por usuário, que é o exemplo clássico de modelagem de largura de banda em um ambiente cliente-servidor e é provavelmente a configuração que estamos mais familiarizados. familiar com.

Como funciona o gotejamento?

Além disso, um gotejamento pode nos ajudar a definir prioridades por aplicativo, de modo que, quando os limites gerais forem definidos para todo o sistema, os aplicativos prioritários ainda obtenham mais largura de banda automaticamente.

Para realizar essa tarefa, o trickle define limites de tráfego para a forma como os dados são enviados e recebidos de soquetes usando conexões TCP. Devemos observar que, além das taxas de transferência de dados, o trickle não modifica de forma alguma o comportamento do processo que está moldando em um determinado momento.

O que o Trickle não pode fazer?

A única limitação, por assim dizer, é que o trickle não funcionará com aplicativos vinculados estaticamente ou binários com os bits SUID ou SGID definidos, pois usa vinculação e carregamento dinâmicos para colocar entre o processo moldado e seu soquete de rede associado. Trickle então atua como um proxy entre esses dois componentes de software.

Como o trickle não requer privilégios de superusuário para ser executado, os usuários podem definir seus próprios limites de tráfego. Como isso pode não ser desejável, exploraremos como definir limites gerais que os usuários do sistema não podem ultrapassar. Ou seja, os utilizadores continuarão a poder gerir as suas taxas de tráfego, mas sempre dentro dos limites definidos pelo administrador do sistema.

Ambiente de teste

Neste artigo, explicaremos como limitar lentamente a largura de banda da rede usada por aplicativos em um servidor Linux.

Para gerar o tráfego necessário, usaremos ncftpput e ncftpget (ambas ferramentas estão disponíveis instalando ncftp) no cliente (CentOS servidor – dev1: 192.168.0.17) e vsftpd no servidor (Debian – dev2: 192.168.0.15 ) para fins de demonstração. As mesmas instruções também funcionam em sistemas baseados em RedHat, Fedora e Ubuntu.

Instalando ncftp e vsftpd no Linux

1. Para RHEL/CentOS 8/7, ative o repositório EPEL. Extra Packages for Enterprise Linux (EPEL) é um repositório de software gratuito e de código aberto de alta qualidade mantido pelo projeto Fedora e é 100% compatível com seus spinoffs, como o Red Hat Enterprise Linux e CentOS. Tanto trickle quanto ncftp são disponibilizados neste repositório.

2. Instale ncftp da seguinte forma:

yum update && sudo yum install ncftp		[On RedHat based systems]
aptitude update && aptitude install ncftp	[On Debian based systems]	

3. Configure um servidor FTP em um servidor separado. Observe que, embora o FTP seja inerentemente inseguro, ele ainda é amplamente utilizado nos casos em que a segurança no upload ou download de arquivos não é necessária.

Estamos usando-o neste artigo para ilustrar as recompensas do trickle e porque mostra as taxas de transferência em stdout no cliente, e deixaremos a discussão se deve ou não ser usado para outro data e hora.

yum update && yum install vsftpd 		[On RedHat based systems]
apt update && apt install vsftpd 	[On Debian based systems]

Agora, edite o arquivo /etc/vsftpd/vsftpd.conf no servidor FTP da seguinte maneira:

sudo nano /etc/vsftpd/vsftpd.conf
OR
sudo /etc/vsftpd.conf

Faça as seguintes alterações:

anonymous_enable=NO
local_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES

Depois disso, certifique-se de iniciar o vsftpd para sua sessão atual e habilitá-lo para inicialização automática em inicializações futuras:

systemctl start vsftpd 		[For systemd-based systems]
systemctl enable vsftpd
service vsftpd start 			[For init-based systems]
chkconfig vsftpd on

4. Se você optar por configurar o servidor FTP em um droplet CentOS/RHEL com chaves SSH para acesso remoto, você precisará de uma conta de usuário protegida por senha com o diretório apropriado e permissões de arquivo para fazer upload e download do conteúdo desejado FORA do diretório inicial da raiz.

Você pode então navegar até seu diretório inicial digitando o seguinte URL em seu navegador. Uma janela de login aparecerá solicitando uma conta de usuário e senha válidas no servidor FTP.

ftp://192.168.0.15

Se a autenticação for bem-sucedida, você verá o conteúdo do seu diretório inicial. Posteriormente neste tutorial, você poderá atualizar essa página para exibir os arquivos que foram carregados nas etapas anteriores.

Como instalar o Trickle no Linux

Agora instale o trickle via yum ou apt.

Para garantir uma instalação bem-sucedida, é considerada uma boa prática garantir que os pacotes atualmente instalados estejam atualizados (usando yum update) antes de instalar a ferramenta em si.

yum -y update && yum install trickle 		        [On RedHat based systems]
apt -y update && apt install trickle 	[On Debian based systems]

Verifique se o gotejamento funcionará com o binário desejado. Como explicamos anteriormente, o trickle só funcionará com binários que usam bibliotecas dinâmicas ou compartilhadas. Para verificar se podemos usar esta ferramenta com uma determinada aplicação, podemos usar o conhecido utilitário ldd, onde ldd significa listar dependências dinâmicas.

Especificamente, procuraremos a presença de glibc (a biblioteca GNU C) na lista de dependências dinâmicas de qualquer programa porque é precisamente essa biblioteca que define as chamadas de sistema envolvidas na comunicação através de soquetes.

Execute o seguinte comando em um determinado binário para ver se o trickle pode ser usado para moldar sua largura de banda:

ldd $(which [binary]) | grep libc.so

Por exemplo,

ldd $(which ncftp) | grep libc.so

cuja saída é:

libc.so.6 => /lib64/libc.so.6 (0x00007efff2e6c000)

A string entre colchetes na saída pode mudar de sistema para sistema e até mesmo entre execuções subsequentes do mesmo comando, pois representa o endereço de carregamento da biblioteca na memória física.

Se o comando acima não retornar nenhum resultado, significa que o binário no qual ele foi executado não usa libc e, portanto, o trickle não pode ser usado como modelador de largura de banda nesse caso.

Aprenda como usar o Trickle no Linux

O uso mais básico do gotejamento é no modo autônomo. Usando essa abordagem, trickle é usado para definir explicitamente as velocidades de download e upload de um determinado aplicativo. Conforme explicamos anteriormente, por uma questão de brevidade, usaremos o mesmo aplicativo para testes de download e upload.

Executando o Trickle no modo autônomo

Compararemos as velocidades de download e upload com e sem uso de trickle. A opção -d indica a velocidade de download em KB/s, enquanto o sinalizador -u diz ao trickle para limitar a velocidade de upload na mesma unidade. Além disso, usaremos o sinalizador -s, que especifica que o gotejamento deve ser executado em modo independente.

A sintaxe básica para executar o trickle no modo autônomo é a seguinte:

trickle -s -d [download rate in KB/s] -u [upload rate in KB/s]

Para executar os exemplos a seguir por conta própria, certifique-se de ter trickle e ncftp instalados na máquina cliente (192.168.0.17 no meu caso).

Exemplo 1: Carregando um arquivo PDF de 2,8 MB com e sem gotejamento.

Estamos usando o arquivo PDF Linux Fundamentals de distribuição gratuita (disponível aqui) para os testes a seguir.

Você pode inicialmente baixar este arquivo para seu diretório de trabalho atual com o seguinte comando:

wget http://linux-training.be/files/books/LinuxFun.pdf 

A sintaxe para enviar um arquivo para nosso servidor FTP sem problemas é a seguinte:

ncftpput -u username -p password 192.168.0.15  /remote_directory local-filename 

Onde /remote_directory é o caminho do diretório de upload relativo à página inicial do nome de usuário e local-filename é um arquivo em seu diretório de trabalho atual.

Especificamente, sem gotejamento, obtemos uma velocidade máxima de upload de 52,02 MB/s (observe que esta não é a velocidade média real de upload, mas um pico inicial instantâneo), e o arquivo é carregado quase instantaneamente:

ncftpput -u username -p password 192.168.0.15  /testdir LinuxFun.pdf 

Saída :

LinuxFun.pdf:                                        	2.79 MB   52.02 MB/s

Com o trickle, limitaremos a taxa de transferência de upload em 5 KB/s. Antes de enviar o arquivo pela segunda vez, precisamos excluí-lo do diretório de destino; caso contrário, ncftp nos informará que o arquivo no diretório de destino é o mesmo que estamos tentando enviar, e não realizará a transferência:

rm /absolute/path/to/destination/directory/LinuxFun.pdf 

Então :

trickle -s -u 5 ncftpput -u username -p password 111.111.111.111 /testdir LinuxFun.pdf 

Saída :

LinuxFun.pdf:                                        	2.79 MB	4.94 kB/s

No exemplo acima, podemos ver que a velocidade média de upload caiu para ~5 KB/s.

Exemplo 2: baixando o mesmo arquivo PDF de 2,8 MB com e sem gotejamento

Primeiro, lembre-se de excluir o PDF do diretório de origem original:

rm /absolute/path/to/source/directory/LinuxFun.pdf 

Observe que os casos a seguir farão download do arquivo remoto para o diretório atual na máquina cliente. Este fato é indicado pelo ponto (‘.‘) que aparece após o endereço IP do servidor FTP.

Sem gotejamento:

ncftpget -u username -p  password 111.111.111.111 . /testdir/LinuxFun.pdf 

Saída :

LinuxFun.pdf:                                        	2.79 MB  260.53 MB/s

Com trickle, limitando a velocidade de download em 20 KB/s:

trickle -s -d 30 ncftpget -u username -p password 111.111.111.111 . /testdir/LinuxFun.pdf 

Saída :

LinuxFun.pdf:                                        	2.79 MB   17.76 kB/s

Executando o Trickle no modo supervisionado [não gerenciado]

O Trickle também pode ser executado em modo não gerenciado, seguindo uma série de parâmetros definidos em /etc/trickled.conf. Este arquivo define como o trickled (o daemon) se comporta e gerencia o gotejamento.

Além disso, se quisermos definir configurações globais para serem usadas, de maneira geral, por todos os aplicativos, precisaremos usar o comando trickled. Este comando executa o daemon e nos permite definir limites de download e upload que serão compartilhados por todas as aplicações executadas através do trickle sem precisarmos especificar limites a cada vez.

Por exemplo, executando:

trickled -d 50 -u 10

Fará com que as velocidades de download e upload de qualquer aplicativo executado através do trickle sejam limitadas a 30 KB/s e 10 KB/s, respectivamente.

Observe que você pode verificar a qualquer momento se o trickle está sendo executado e com quais argumentos:

ps -ef | grep trickled | grep -v grep

Saída :

root 	16475 	1  0 Dec24 ?    	00:00:04 trickled -d 50 -u 10
Exemplo 3: Carregando um arquivo mp4 de 19 MB para nosso servidor FTP usando com e sem trickle.

Neste exemplo, usaremos o vídeo “He is the gift”, de distribuição gratuita, disponível para download neste link.

Inicialmente, baixaremos este arquivo para seu diretório de trabalho atual com o seguinte comando:

wget http://media2.ldscdn.org/assets/missionary/our-people-2014/2014-00-1460-he-is-the-gift-360p-eng.mp4 

Primeiro, iniciaremos o daemon trickled com o comando listado acima:

trickled -d 30 -u 10

Sem gotejamento:

ncftpput -u username -p password 192.168.0.15 /testdir 2014-00-1460-he-is-the-gift-360p-eng.mp4 

Saída :

2014-00-1460-he-is-the-gift-360p-eng.mp4:           	18.53 MB   36.31 MB/s

Com gotejamento:

trickle ncftpput -u username -p password 192.168.0.15 /testdir 2014-00-1460-he-is-the-gift-360p-eng.mp4 

Saída :

2014-00-1460-he-is-the-gift-360p-eng.mp4:           	18.53 MB	9.51 kB/s

Como podemos ver no resultado acima, a taxa de transferência de upload caiu para ~10 KB/s.

Exemplo 4: baixando o mesmo vídeo com e sem gotejamento

Como no Exemplo 2, iremos baixar o arquivo para o diretório de trabalho atual.

Sem gotejamento:

ncftpget -u username -p password 192.168.0.15 . /testdir/2014-00-1460-he-is-the-gift-360p-eng.mp4 

Saída :

2014-00-1460-he-is-the-gift-360p-eng.mp4:           	18.53 MB  108.34 MB/s

Com gotejamento:

trickle ncftpget -u username -p password 111.111.111.111 . /testdir/2014-00-1460-he-is-the-gift-360p-eng.mp4 

Saída :

2014-00-1460-he-is-the-gift-360p-eng.mp4:           	18.53 MB   29.28 kB/s

O que está de acordo com o limite de download definido anteriormente (30 KB/s).

Nota: Depois que o daemon for iniciado, não há necessidade de definir limites individuais para cada aplicativo que usa gotejamento.

Como mencionamos anteriormente, é possível personalizar ainda mais a modelagem da largura de banda do trickle por meio do trickled.conf. Uma seção típica neste arquivo consiste no seguinte:

[service]
Priority = <value>
Time-Smoothing = <value>
Length-Smoothing = <value>

Onde,

  1. [serviço] indica o nome da aplicação cujo uso de largura de banda pretendemos moldar.
  2. Prioridade nos permite especificar um serviço para ter uma prioridade mais alta em relação a outro, não permitindo assim que um único aplicativo consuma toda a largura de banda que o daemon está gerenciando. Quanto menor o número, mais largura de banda será atribuída ao [serviço].
  3. Time-Smoothing [em segundos]: define com quais intervalos de tempo o gotejamento tentará deixar a aplicação transferir e/ou receber dados. Valores menores (algo entre 0,1 – 1s) são ideais para aplicações interativas e resultarão em uma sessão mais contínua (suave), enquanto valores ligeiramente maiores (1 – 10 s) são melhores para aplicações que precisam de transferência em massa. Se nenhum valor for especificado, o padrão (5 s) será usado.
  4. Length-Smoothing [em KB]: a ideia é a mesma da Time-Smoothing, mas baseada na duração de uma operação de I/O. Se nenhum valor for especificado, o padrão (10 KB) será usado.

A alteração dos valores de suavização se traduzirá no aplicativo especificado por [service] usando taxas de transferência dentro de um intervalo em vez de um valor fixo. Infelizmente, não existe uma fórmula para calcular os limites inferior e superior deste intervalo, pois depende principalmente de cada cenário específico.

A seguir está um arquivo de amostra trickled.conf no cliente CentOS 7 (192.168.0.17):

[ssh]
Priority = 1
Time-Smoothing = 0.1
Length-Smoothing = 2

[ftp]
Priority = 2
Time-Smoothing = 1
Length-Smoothing = 3

Usando esta configuração, o trickled priorizará conexões SSH em vez de transferências FTP. Observe que um processo interativo, como o SSH, utiliza valores menores de suavização de tempo, enquanto um serviço que realiza transferências de dados em massa (FTP) utiliza um valor maior.

Os valores de suavização são responsáveis pelas velocidades de download e upload em nosso exemplo anterior, não correspondendo ao valor exato especificado pelo daemon gotejado, mas movendo-se em um intervalo próximo a ele.

Conclusão

Neste artigo, exploramos como limitar a largura de banda usada por aplicativos que usam trickle em distribuições baseadas no Fedora e Debian/derivados. Outros casos de uso possíveis incluem, mas não estão limitados a:

  • Limitar a velocidade de download por meio de um utilitário de sistema como o wget ou um cliente de torrent, por exemplo.
  • Limitar a velocidade com que seu sistema pode ser atualizado via `yum` (ou `aptitude`, se você estiver em um sistema baseado em Debian), o sistema de gerenciamento de pacotes.
  • Se o seu servidor estiver atrás de um proxy ou firewall (ou for o próprio proxy ou firewall), você pode usar trickle para definir limites de download e upload ou velocidade de comunicação com os clientes ou com o exterior.

Perguntas e comentários são muito bem-vindos. Sinta-se à vontade para usar o formulário abaixo para enviá-los para nós.