Trickle – Controlar a Largura de Banda do Tráfego de Rede de Aplicações em um Linux

Você já se deparou com situações em que uma aplicação dominou a largura de banda da sua rede? Se já esteve em uma situação em que uma aplicação consumiu todo o seu tráfego, então você valorizará o papel da aplicação de modelagem de largura de banda em gotejamento.

Seja você um administrador de sistema ou apenas um usuário Linux, você precisa aprender a controlar as velocidades de upload e download das aplicações para garantir que a largura de banda da sua rede não seja consumida por uma única aplicação.

O que é o Trickle?

Trickle é uma ferramenta de modelagem de largura de banda de rede que nos permite gerenciar as velocidades de upload e download das aplicações para evitar que qualquer uma delas monopolize toda (ou a maioria) da largura de banda disponível.

Em algumas palavras, o Trickle permite que você controle o tráfego de rede em uma base 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 é o cenário com o 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 forem 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 à 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 nenhuma maneira 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 o ncftpput e o ncftpget (ambas as ferramentas estão disponíveis ao instalar o ncftp) no cliente (servidor CentOS – dev1: 192.168.0.17), e o 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 no RHEL e baseadas no Debian, como Ubuntu e Linux Mint.

Como Instalar ncftp e vsftpd no Linux

1. Para distribuições baseadas no 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 forma.

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, ele ainda é amplamente utilizado em casos em que a segurança no envio ou no download de arquivos não é necessária.

Estamos usando neste artigo para ilustrar os benefícios do trickle e porque ele 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 da seguinte forma:

$ 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, certifique-se de iniciar o vsftpd para a 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 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 upload e download do conteúdo desejado FORA do diretório home do root.

Em seguida, você pode navegar até o seu diretório home inserindo a seguinte URL em seu navegador. Uma janela de login será exibida 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 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 prática recomendada garantir que os pacotes atualmente instalados estejam atualizados (usando yum update) antes de instalar a própria ferramenta.

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 determinada aplicação, podemos usar a conhecida utilidade 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, pois é 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 mudar de sistema para sistema e até entre execuções subsequentes do mesmo comando, pois representa o endereço de carga da biblioteca na memória física.

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

Aprenda a usar o 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 informa ao trickle para 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 no 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 trickle e 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 Linux Fundamentals gratuitamente distribuível (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 o 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 o trickle, obtemos uma velocidade máxima de upload de 52,02 MB/s (por favor, note que esta não é a velocidade de upload média real, mas um pico instantâneo inicial), e o arquivo é carregado 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 o trickle, limitaremos a taxa de transferência de upload para 5 KB/s. Antes de fazer o upload do 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 fazer o upload, 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 de 2,8MB com e sem o trickle

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

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

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

Sem o 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 o 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 em 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 trickle.

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

Por exemplo, executando:

trickled -d 50 -u 10

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

Observe que você pode verificar a qualquer momento se 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 o servidor FTP usando Trickle

Neste exemplo, usaremos o vídeo “He is the gift” gratuitamente distribuído, 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 

Em primeiro lugar, 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 há necessidade de 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 uma prioridade mais alta em relação a outro, evitando 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 a [service].
  • Time-Smoothing [em segundos]: define com que intervalos de tempo trickled tentará permitir que o aplicativo transfira e/ou receba dados. Valores menores (algo entre o intervalo 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.

A mudança dos valores de suavização resultará na aplicação especificada por [serviço] usando 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 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 essa 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 a ferramenta trickle para definir limites tanto na velocidade de download e upload quanto 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 em nossa direção.

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