Melhor maneira de limitar a largura de banda de saída no servidor apache (espelho)

1

Eu configurarei um espelho de download da fundação do Apache e será aberto para acesso público e privado. Eu gostaria de limitar o acesso externo a cerca de 650 Mbps, mas não coloque limites (preferencialmente priorize) no acesso interno. Eu também gostaria de servir os clientes o mais rápido possível quando houver capacidade suficiente para fazê-lo, mas dividir a largura de banda quando houver muitos clientes conectados (esperamos que uniformemente, mas não necessários). Do lado, o servidor também será usado para espelhamento de pacotes Debian e Ubuntu. O servidor da Web só servirá conteúdo estático e deverá usar o apache.

Configuração atual:
Versão do Apache: Apache 2.4.18
SO: Ubuntu 16.04 LTS
CPU e amp; RAM: preferencialmente 2 núcleos 4GB por enquanto, mas pode expandir para 4 núcleos 32GB se necessário Módulo Apache: padrão

Opções disponíveis classificadas por facilidade de acesso:
- módulos do apache
- acesso root ao servidor executando o servidor apache (aberto para modelagem de tráfego de software / limitação de taxa)
- muito poderoso e 99% parando o interruptor da série Juniper EX4xxx

    
por jackluo923 26.11.2016 / 19:06

3 respostas

2

Aqui está o exemplo de trabalho baseado em tc e iptables.

Etapa 1:
Substitua a fila padrão pfifo_fast pela fila PRIO.
A fila PRIO é uma fila de classe e nos permite anexar filtros mais tarde para classificar diferentes tipos de tráfego.

Verifique a fila existente

tc -s qdisc ls dev eth0

Substitua por PRIO. Isto irá criar 3 bandas padrão.

tc qdisc add dev eth0 root handle 1: prio 

Que pode ser visualizado como abaixo

      1:   root qdisc
     / | \ 
   /   |   \
   /   |   \
 1:1  1:2  1:3    classes

E agora vamos adicionar filas classful. Vamos anexá-los às bandas 1: 1, 1: 2 e 1: 3

tc qdisc add dev eth0 parent 1:1 handle 10: sfq
tc qdisc add dev eth0 parent 1:2 handle 20: tbf rate 20kbit buffer 1600 limit 3000
tc qdisc add dev eth0 parent 1:3 handle 30: sfq 

Que pode ser visualizado como abaixo

      1:   root qdisc
     / | \ 
   /   |   \
   /   |   \
 1:1  1:2  1:3    classes
  |    |    |
 10:  20:  30:    qdiscs    qdiscs
 sfq  tbf  sfq
  0    1    2     bands

Com base no tráfego de pacote de TOS, você acessará

  • 1:10 - tráfego interativo
  • 1:20 - Tráfego interativo
  • 1:30 - Tráfego em massa

Mas isso não é exatamente o que queremos, considerando que algumas aplicações realmente irão definir valores de TOS | Queremos classificar o tráfego iniciado da porta 80 (sport = 80) para ir para 1: 2 (que moldamos e limitamos a taxa) e o restante do tráfego para 1: 1. Desta forma, o resto do tráfego não terá que esperar pelo tráfego http e terá uma prioridade. Caso contrário, o tráfego http lento bloqueará outros tráfegos não interativos.

Então, como fazer isso?
Nós marcaremos nossos pacotes iniciados a partir da porta de origem 80 com a marca 2 via iptables e o tráfego não http com a marca 1

iptables -t mangle -A OUTPUT -m tcp -p tcp --sport 80 -j MARK --set-mark 2          
iptables -t mangle -A OUTPUT -m tcp -p tcp ! --sport 80 -j MARK --set-mark 1        

E usaremos o filtro tc, que roteará os pacotes marcados com uma tag para uma determinada banda

tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 2 fw flowid 1:2    ### Send traffic from source port 80 to tbf queue
tc filter add dev eth0 protocol ip parent 1:0 prio 2 handle 1 fw flowid 1:1    ### Send all other traffic to sfq queue 1:1

E agora estamos prontos para testar. Vou iniciar o download do CentOS iso do servidor http e ao mesmo tempo vou iniciar a transferência do sftp da mesma imagem do mesmo servidor. Na imagem abaixo, podemos ver que, enquanto a transferência do sftp é de cerca de 13MB / s, a transferência http é limitada a 20kbit / s.

Comesteexemplo,abanda1:3neméusada.
Então,talvezfossemelhorusartbfnabanda1:3eter1:1e1:2comprioridadessfqedefault.Noentanto,estefoiapenasumtesterápidoedevesersuficienteparaesclarecerumpoucomelhoradocumen-taçãocomplicada.

Recursosusados:

  • link
  • link
  • link
  • man iptables (no CentOS6, o CentOS 7 tem um homem muito reduzido para iptables já que não é mais um método padrão para controlar o firewall)
por 27.11.2016 / 19:38
1

Um método simples poderia ser criar várias interfaces físicas, cada uma com 1 Gbps. Coloque um em uma sub-rede de frente externa e outro em um lado interno. mirror.example.com é acessível publicamente, mas mirror.corp.example.com é apenas na LAN.

No entanto, o truque limitado por interface não é suficiente em máquinas virtuais, onde o vNIC pode ir mais rápido do que o dispositivo que está emulando.

Também é muito menos fino do que você pediu. Você pode precisar de algo mais sofisticado se não for seguro ultrapassar o alvo de 650 Mbps.

    
por 26.11.2016 / 23:07
0

Como a arquitetura do apache espalha a carga em muitos processos / threads diferentes, não acho que limitar / priorizar no nível do apache vá ajudar.

Espero que a melhor abordagem seja usar o suporte ao controle de fluxo / priorização de tráfego no kernel do linux.

Infelizmente eu não fiz isso sozinho, mas eu entendo que o documento sobre o assunto é o roteamento avançado do Linux e o howto de controle de tráfego.

Acredito que o link é o capítulo relevante.

Se você fizer isso, por favor, volte e escreva uma resposta detalhando como você fez isso funcionar.

    
por 26.11.2016 / 23:40