Linux QoS: transmissão de dados em massa durante os tempos ociosos

6

Como eu faria uma configuração de QoS em que um determinado fluxo de dados de baixa prioridade chegasse a X Mbps de largura de banda, mas somente se a largura de banda total atual (de todos os streams / classes) nessa interface não excedesse X? Ao mesmo tempo, outros fluxos / classes de dados não devem ser limitados a X.

O caso de uso é um ISP cobrando o tráfego calculando a média da largura de banda em intervalos de 5 minutos e faturando o máximo. Eu gostaria de manter o uso máximo ao mínimo (ou seja, extinguir a transferência em massa durante os horários de ocupado da interface), mas obter os dados durante o tempo ocioso / baixo tráfego.

Olhando para os escalonadores de classes freqüentemente usados CBQ, HTB e HSFC, não consigo ver uma maneira direta de conseguir isso.

    
por the-wabbit 29.03.2012 / 00:08

3 respostas

1

Eu tenho isso para trabalhar no hfsc. Eu suponho que "X" no seu exemplo é 100mbit, mas isso poderia ser qualquer coisa, claro ..

O truque aqui é criar uma classe de árvore assim:

+--------------------------------------------------------------+  +---------------------+
|                                                              |  |        1:1          |
|                            root                              |  |---------------------|
|                              +                               |  | Rate: 100mbit       |
|                              |                               |  | Upper Rate: 100mbit |
|                              |                               |  |                     |
|                              |                               |  |                     |
|                              |                               |  |                     |
|                         +----v------+                        |  +---------------------+
|                         |  1:1      |                        |
|                         |           |                        |  +---------------------+
|                         +--+---+----+                        |  |         1:10        |
|                            |   |                             |  |---------------------|
|                            |   |                             |  | Rate: 100mbit       |
|                            |   |                             |  | Upper Rate: 100mbit |
|                            |   |                             |  |                     |
|          +----------+------+   +--------+----------+         |  |                     |
|          |  1:10    |                   |  1:11    |         |  |                     |
|          |          |                   |          |         |  +---------------------+
|          +----------+                   +----------+         |
|                                                              |  +---------------------+
|                                                              |  |         1:11        |
|                                                              |  |---------------------|
|                                                              |  | Rate: 10kbit        |
+--------------------------------------------------------------+  | Upper Rate: 100mbit |
                                                                  |                     |
                                                                  |                     |
                                                                  |                     |
                                                                  +---------------------+

A mágica acontece porque a classe 1:10 (classe padrão) é configurada para ter sempre uma largura de banda garantida de 100mbit, enquanto a classe 'lenta' 1:11 oferece uma largura de banda garantida de apenas 10kbit para 100mbit.

Isso força a classe raiz (1: 1) a sempre honrar as necessidades de 1:10 acima de 1:11.

Coisas a serem observadas:

  • Não use o destino CLASSIFY do iptables para colocar o tráfego em 1:11. Está muito lento em fazer classificações. Use filtros de controle de tráfego. Ou se você tiver um número de aplicativos para entrar aqui e as portas podem variar para filtrar, use um cgroup.
  • Definir um alvo padrão no hfsc para 1:10.
  • Você provavelmente deve definir o link "lento" como o tamanho máximo do segmento TCP do seu host. Dessa forma, você pode tentar colocar seu aplicativo de envio emperrado na fila lenta para bloquear por longos períodos sem que o kernel renegocie os tamanhos das janelas e outros enfeites.

Testei isso com dois aplicativos concorrentes enviando dados o mais rápido possível para um host vizinho em dois serviços. Onde um dos serviços estava na aula 1:11. Ambos enviaram 5 segundos de tráfego ao longo de 100mbit (assim, 60MB de dados foram transmitidos). Ao correr sem classe, como esperado, ambos terminam em 10 segundos (ambos compartilhando o link para que o tempo seja dividido igualmente).

Com esta configuração de QoS, o serviço prioritário terminou em 5 segundos, enquanto o serviço de baixa prioridade terminou em 10 (como se a baixa prioridade estivesse aguardando que a alta prioridade terminasse primeiro), o que eu acho que é o que você deseja.

    
por 15.06.2012 / 01:50
0

Não tenho certeza se isso funcionará, mas você pode tentar HTB:

  • Para o fluxo de baixa prioridade, defina o rate para zero (ou quase zero) e o ceil para o X máximo real. Isso resulta no fluxo de baixa prioridade tendo uma velocidade garantida de zero e uma chance de emprestando um máximo de X MBit / s de outros fluxos.
  • Para os outros fluxos, defina a taxa para a velocidade da sua interface de rede.

De acordo com a documentação do HTB , isso deve funcionar. No entanto, eu não tentei sozinho.

EDIT : isso não limitará o tráfego de baixo nível enquanto o link tiver largura de banda ociosa de X MBit / s. Mas pode ser um começo ...

    
por 01.04.2012 / 23:31
0

É estranho, mas se você puder alterar manualmente o limite, você pode ter um daemon usando uma malha mais fina (digamos, intervalos de 1 minuto, mantendo o controle dos últimos 5-10). Então você só precisa de um loop de controle bastante simples, onde você ajusta o limite de tráfego para manter a média de 5 minutos em um valor seguro abaixo do seu limite. Esquemas de previsão de tráfego mais complicados são opcionais.

    
por 13.06.2012 / 20:21

Tags