Truque – Controle da largura de banda do tráfego de rede de aplicativos em um Linux

Você já encontrou situações em que um aplicativo dominava toda a largura de banda da sua rede? Se já esteve em uma situação em que um aplicativo consumiu todo o seu tráfego, então você valorizará o papel do aplicativo moldador de largura de banda trickle.

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

O que é Trickle?

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

Em poucas palavras, o Trickle permite que você controle o tráfego de rede em uma base por aplicativo, ao contrário do 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 com a qual estamos mais familiarizados.

Como o Trickle Funciona?

Além disso, um Trickle pode nos ajudar a definir prioridades em uma base por aplicativo para que, quando limites gerais tenham sido estabelecidos para todo o sistema, aplicativos prioritários ainda recebam mais largura de banda automaticamente.

Para realizar essa tarefa, o Trickle define limites de tráfego na maneira como os dados são enviados e recebidos de soquetes usando conexões TCP. Devemos notar que, além das taxas de transferência de dados, o Trickle não modifica de forma alguma o comportamento do processo que está modelando 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 ele usa vinculação e carregamento dinâmicos para se colocar entre o processo modelado e seu soquete de rede associado. O Trickle então age como um proxy entre esses dois componentes de software.

Uma vez que 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, vamos explorar como definir limites gerais que os usuários do sistema não podem exceder. Em outras palavras, os usuários ainda poderão gerenciar suas taxas de tráfego, mas sempre dentro dos limites estabelecidos pelo administrador do sistema.

Ambiente de Teste

Neste artigo, explicaremos como limitar a largura de banda de rede usada por aplicativos em um servidor Linux com o trickle.

Para gerar o tráfego necessário, usaremos ncftpput e ncftpget (ambas as 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 distribuições baseadas em RHEL e baseadas em Debian como Ubuntu e Linux Mint.

Como Instalar ncftp e vsftpd no Linux

1. Para distribuições baseadas em RedHat, você precisa habilitar o repositório EPEL, que é um repositório de software livre e de código aberto de alta qualidade mantido pelo projeto Fedora.

Instalar EPEL no RHEL 9:

sudo subscription-manager repos --enable codeready-builder-for-rhel-9-$(arch)-rpms
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm

Instalar EPEL no CentOS 9, AlmaLinux 9, Rocky Linux 9:

sudo dnf config-manager --set-enabled crb
sudo dnf install epel-release

Instalar EPEL no RHEL 8:

sudo subscription-manager repos --enable codeready-builder-for-rhel-8-$(arch)-rpms
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

Instalar EPEL no CentOS 8, AlmaLinux 8, Rocky Linux 8:

sudo dnf config-manager --set-enabled powertools
sudo dnf install epel-release

2. Em seguida, instale ncftp da seguinte maneira.

sudo dnf install ncftp         [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
sudo apt install ncftp         [On Debian, Ubuntu and Mint]

3. Configure um servidor FTP em um servidor separado. Por favor, note que, embora o FTP seja inerentemente inseguro, ainda é amplamente utilizado em casos em que a segurança no envio ou recebimento 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 sobre se deve ou não ser usado para outra data e hora.

sudo dnf install vsftpd         [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
sudo apt install vsftpd         [On Debian, Ubuntu and Mint]

Agora, edite o arquivo /etc/vsftpd/vsftpd.conf no servidor FTP conforme abaixo:

$ sudo nano /etc/vsftpd/vsftpd.conf
OR
$ sudo nano /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:

sudo systemctl start vsftpd
sudo systemctl enable vsftpd
sudo systemctl status vsftpd

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

Em seguida, você pode navegar até seu diretório home digitando a seguinte URL em seu navegador. Uma janela de login será exibida pedindo suas credenciais 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 home. Mais adiante neste tutorial, você poderá atualizar essa página para exibir os arquivos que foram enviados durante os passos anteriores.

FTP Directory Tree

Como Instalar o Trickle no Linux

Agora, instale o Trickle via yum ou apt.

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

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

Verifique se o Trickle 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 essa ferramenta com um determinado aplicativo, podemos usar o conhecido utilitário ldd, onde ldd significa listar dependências dinâmicas.

Para verificar se podemos usar esta ferramenta com um determinado aplicativo, podemos usar o bem conhecido utilitário ldd, onde ldd significa listar dependências dinâmicas.

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

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

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

Por exemplo,

sudo ldd $(which ncftp) | grep libc.so

cujo resultado é:

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

A string entre colchetes no resultado pode variar de sistema para sistema e até mesmo entre execuções subsequentes do mesmo comando, uma vez que representa o endereço de carga da biblioteca na memória física.

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

Aprenda a Usar Trickle no Linux

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

Executando o Trickle no Modo Autônomo

Vamos comparar as velocidades de download e upload com e sem o uso do trickle. A opção -d indica a velocidade de download em KB/s, enquanto a bandeira -u instrui o trickle a limitar a velocidade de upload na mesma unidade. Além disso, usaremos a bandeira -s, que especifica que o trickle deve ser executado em modo autônomo.

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

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

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

Exemplo 1: Enviando um Arquivo de 2,8MB Com e Sem Trickle

Estamos usando o arquivo PDF gratuitamente distribuível Linux Fundamentals (disponível a partir de aqui) para os testes a seguir.

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

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

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

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

Onde /remote_directory é o caminho do diretório de upload em relação ao diretório home do usuário e local-filename é um arquivo no seu diretório de trabalho atual.

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

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

Saída:

LinuxFun.pdf:                                        	2.79 MB   52.02 MB/s

Com trickle, limitaremos a taxa de transferência de upload para 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 de upload média caiu para ~5 KB/s.

Exemplo 2: Baixando o mesmo arquivo de 2,8MB com e sem Trickle

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

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

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

Sem trickle:

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 Trickle em Modo Não Supervisionado [não gerenciado]

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 trickle.

Além disso, se desejamos definir configurações globais a serem usadas, de forma geral, por todas as aplicações, precisaremos usar o comando trickle. Esse 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 a necessidade de especificar limites cada vez.

Por exemplo, executando:

trickled -d 50 -u 10

Isso fará com que as velocidades de download e upload de qualquer aplicação executada 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 trickled está em execução 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: Enviando um Arquivo MP4 de 19MB para Servidor FTP Usando Trickle

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

Inicialmente, baixaremos esse arquivo para o 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 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   36.31 MB/s

Com trickle:

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 na saída acima, a taxa de transferência de upload caiu para ~10 KB/s.

Exemplo 4: Baixando o Mesmo Vídeo com Trickle

Como em Exemplo 2, estaremos baixando o arquivo para o diretório de trabalho atual.

Sem trickle:

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 trickle:

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: Uma vez que o daemon foi iniciado, não é necessário definir limites individuais para cada aplicativo que usa trickle.

Como mencionamos anteriormente, pode-se personalizar ainda mais a formação de largura de banda do trickle através de trickled.conf. Uma seção típica neste arquivo consiste nas seguintes informações:

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

Onde,

  • [service] indica o nome do aplicativo cujo uso de largura de banda pretendemos moldar.
  • Prioridade nos permite especificar um serviço com prioridade superior em relação a outro, impedindo que um único aplicativo consuma toda a largura de banda que o daemon está gerenciando. Quanto menor o número, mais largura de banda é atribuída ao [serviço].
  • Suavização Temporal [em segundos]: define com que intervalos de tempo o trickled tentará permitir que o aplicativo transfira e/ou receba dados. Valores menores (algo na faixa de 0,1 – 1s) são ideais para aplicativos interativos e resultarão em uma sessão mais contínua (suave) enquanto valores ligeiramente maiores (1 – 10 s) são melhores para aplicativos que precisam de transferência em massa. Se nenhum valor for especificado, o padrão (5 s) é usado.
  • Suavização de Comprimento [em KB]: a ideia é a mesma que na Suavização Temporal, mas baseada no comprimento de uma operação de E/S. Se nenhum valor for especificado, o padrão (10 KB) é usado.

Alterar os valores de suavização fará com que o aplicativo especificado por [serviço] use taxas de transferência dentro de um intervalo em vez de um valor fixo. Infelizmente, não há fórmula para calcular os limites inferior e superior desse intervalo, pois depende principalmente do cenário específico de cada caso.

O seguinte é um arquivo de exemplo 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 sobre transferências FTP. Observe que um processo interativo, como SSH, usa valores de suavização de tempo menores, enquanto um serviço que realiza transferências de dados em massa (FTP) usa um valor maior.

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

[ Você também pode gostar: Como Segurar e Fortalecer o Servidor OpenSSH ]

Conclusão

Neste artigo, exploramos como limitar a largura de banda usada por aplicativos usando trickle em distribuições baseadas em Fedora e Debian / derivadas. Outros casos de uso possíveis incluem, mas não se limitam a:

  • Limitando a velocidade de download através de um utilitário de sistema como wget, ou um cliente de torrent, por exemplo.
  • Limitando a velocidade na qual 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 o trickle para definir limites na velocidade de download e upload ou na velocidade de comunicação com os clientes ou o exterior.

Dúvidas e comentários são muito bem-vindos. Sinta-se à vontade para usar o formulário abaixo para enviá-los a nossa maneira.

Source:
https://www.tecmint.com/limit-linux-network-bandwidth-usage-with-trickle/