Isenção de responsabilidade : o mesmo conselho se aplica a todos os serviços com mais de 10 Gbps. Incluído, mas não limitado a, balanceadores de carga, servidores de cache, servidores da Web (HAProxy, Varnish, nginx, tomcat, ...)
O que você quer fazer é errado, não faça
Use uma CDN
As CDN destinam-se a fornecer conteúdo estático atualizável. Use a ferramenta certa para o trabalho (akamai, MaxCDN, cloudflare, cloudfront, ...)
Qualquer CDN, mesmo gratuita, terá um desempenho melhor do que o que você pode conseguir por conta própria.
Escale horizontalmente
Eu espero que um único servidor lide de 1 a 5 Gbps imediatamente, sem muitos ajustes (observação: servir apenas arquivos estáticos). Os 8-10Gbps geralmente estão ao alcance com o ajuste avançado.
No entanto, existem muitos limites rígidos para o que uma única caixa pode suportar. Você deve preferir escalar horizontalmente.
Execute uma única caixa, tente as coisas, meça, avalie, otimize ... até que a caixa seja confiável e confiável e seus recursos sejam bem determinados, depois coloque mais caixas como essa com um balanceador de carga global à frente.
Existem algumas opções globais de balanceamento de carga: a maioria das CDN pode fazer isso, DNS roundrobin, ELB / Google load balancers ...
Vamos ignorar as boas práticas e fazê-lo de qualquer maneira
Compreendendo o padrão de tráfego
WITHOUT REVERSE PROXY
[request ] user ===(rx)==> backend application
[response] user <==(tx)=== [processing...]
Há duas coisas a considerar: a largura de banda e a direção (emissão ou recepção).
Os arquivos pequenos são 50/50 tx / rx porque os cabeçalhos HTTP e a sobrecarga do TCP são maiores que o conteúdo do arquivo.
Arquivos grandes têm 90/10 tx / rx porque o tamanho da solicitação é insignificante comparado ao tamanho da resposta.
WITH REVERSE PROXY
[request ] user ===(rx)==> nginx ===(tx)==> backend application
[response] user <==(tx)=== nginx <==(rx)=== [processing...]
O proxy reverso está retransmitindo todas as mensagens nas duas direções. A carga é sempre 50/50 e o tráfego total é dobrado.
Torna-se mais complexo com o cache ativado. Os pedidos podem ser desviados para o disco rígido, cujos dados podem ser armazenados em cache na memória.
Nota : Ignorarei o aspecto de armazenamento em cache nesta postagem. Vamos nos concentrar em obter 10-40 Gbps na rede. Saber se os dados vêm do cache e otimizar esse cache é outro tópico, eles são enviados de qualquer maneira.
Limitações de monocore
O balanceamento de carga é monocore (especialmente balanceamento de TCP). A adição de núcleos não o torna mais rápido, mas pode ser mais lento.
O mesmo para o balanceamento HTTP com modos simples (por exemplo, IP, URL, com base em cookies. O proxy reverso lê cabeçalhos em tempo real, não analisa nem processa solicitações HTTP em sentido estrito).
No modo HTTPS, a descriptografia / criptografia SSL é mais intensa do que tudo o mais necessário para o proxy. O tráfego SSL pode e deve ser dividido em vários núcleos.
SSL
Dado que você faz tudo sobre SSL. Você deseja otimizar essa parte.
Criptografar e descriptografar 40 Gbps em tempo real é uma conquista.
Pegue um processador de última geração com as instruções AES-NI (usadas para operações SSL).
Ajuste o algoritmo usado pelos certificados. Existem muitos algoritmos. Você deseja o que é mais eficaz em sua CPU (faça benchmarking), ao mesmo tempo em que é suportado pelos clientes E é seguro o suficiente (sem necessidade de criptografia excessiva).
IRQ e fixação do núcleo
A placa de rede está gerando interrupções (IRQ) quando há novos dados para ler e a CPU é antecipada para processar imediatamente a fila. É uma operação em execução no kernel e / ou nos drivers de dispositivo e é estritamente monocore.
Pode ser o maior consumidor de CPU, com bilhões de pacotes saindo em todas as direções.
Atribua à placa de rede um número IRQ exclusivo e fixe-o em um núcleo específico (consulte as configurações de Linux ou BIOS).
Pin o proxy reverso para outros núcleos. Não queremos que essas duas coisas interfiram.
Adaptador Ethernet
A placa de rede está fazendo muito trabalho pesado. Todos os dispositivos e fabricantes não são iguais quando se trata de performances.
Esqueça o adaptador integrado nas placas-mãe (não importa se a placa-mãe é servidor ou consumidor), elas são uma droga.
Transferência de TCP
O TCP é um protocolo muito intensivo em termos de processamento (somas de verificação, ACK, retransmissão, remontagem de pacotes, ...) O kernel está lidando com a maior parte do trabalho, mas algumas operações podem ser transferidas para a placa de rede, se suportadas.
Não queremos apenas uma carta relativamente rápida , queremos uma com todos os sinos e assobios.
Esqueça a Intel, Mellanox, Dell, HP, qualquer que seja. Eles não suportam tudo isso.
Há apenas uma opção na mesa: SolarFlare - A arma secreta das empresas de HFT e CDN.
O mundo está dividido em dois tipos de pessoas: " Quem conhece o SolarFlare " e " quem não conhece ". (o primeiro conjunto é estritamente equivalente a " pessoas que fazem redes de 10 Gbps e se preocupam com tudo "). Mas discordo, vamos nos concentrar: D
Ajuste de TCP do Kernel
Existem opções sysctl.conf
para buffers de rede do kernel. O que essas configurações fazem ou não. Eu realmente não sei.
net.core.wmem_max
net.core.rmem_max
net.core.wmem_default
net.core.rmem_default
net.ipv4.tcp_mem
net.ipv4.tcp_wmem
net.ipv4.tcp_rmem
Brincar com essas configurações é o sinal definitivo de super otimização (ou seja, geralmente inútil ou contraproducente).
Excepcionalmente, isso pode fazer sentido, dadas as exigências extremas.
(Nota: 40Gbps em uma única caixa é super otimizada. A rota razoável é escalar horizontalmente.)
Alguns limites físicos
Largura de banda de memória
Alguns números sobre a largura de banda da memória (principalmente em GB / s): http://www.tweaktown.com/articles/6619/crucial-ddr4-memory-performance-overview-early-look-vs-ddr2-ddr3/index.html
Digamos que o intervalo seja de 150 a 300 Gbps para largura de banda de memória (limite máximo em condições ideais).
Todos os pacotes precisam estar na memória em algum momento. A ingestão de dados a uma taxa de linha de 40 Gbps é uma carga pesada no sistema.
Restará alguma energia para processar os dados? Bem, não vamos deixar nossas expectativas muito altas nisso. Apenas dizendo ^^
Barramento PCI-Express
O PCIe 2.0 é de 4 Gb / s por faixa. O PCIe 3.0 tem 8 Gbps por pista (nem todos estão disponíveis para a placa PCI).
Uma NIC de 40 Gbps com uma única porta Ethernet promete mais que o barramento PCIe se o conector tiver menos de 16x de comprimento nas especificações da v3.0.
De outros
Nós poderíamos ir além de outros limites. O ponto é que o hardware tem limitações rígidas inerentes à lei da física.
O software não pode fazer melhor do que o hardware em que está sendo executado.
O backbone da rede
Todos esses pacotes precisam ir a algum lugar, eventualmente, atravessando switches e roteadores. Os switches e roteadores de 10 Gbps são quase uma mercadoria. Os 40 Gbps definitivamente não são.
Além disso, a largura de banda precisa ser de ponta a ponta; portanto, que tipo de links você tem até o usuário?
Da última vez que verifiquei com meu pessoal do datacenter um pequeno projeto paralelo de 10 milhões de usuários, ele ficou bem claro que haveria apenas 2x 2x Gbits de links para a Internet, no máximo.
Discos rígidos
iostat -xtc 3
As métricas são divididas por leitura e gravação. Verifique se há fila (<1 é bom), latência (<1 ms é bom) e velocidade de transferência (quanto maior, melhor).
Se o disco estiver lento, a solução é colocar um SSD maior E maior no RAID 10. (observe que a largura de banda do SSD aumenta linearmente com o tamanho do SSD).
Escolha da CPU
O IRQ e outros gargalos são executados apenas em um núcleo; portanto, aponte para a CPU com os mais altos desempenhos de núcleo único (ou seja, frequência mais alta).
A criptografia / descriptografia SSL precisa das instruções da AES-NI, para ter como objetivo apenas a revisão mais recente da CPU.
O SSL se beneficia de vários núcleos, portanto, procure vários núcleos.
Resumindo: o CPU ideal é o mais novo com a maior frequência disponível e muitos núcleos. Basta escolher o mais caro e provavelmente é isso: D
Enviar arquivo()
Sendfile ON
Simplesmente o maior progresso dos kernels modernos para servidores da web de alto desempenho.
Nota final
1 SolarFlare NIC 40 Gbps (pin IRQ and core)
2 SolarFlare NIC 40 Gbps (pin IRQ and core)
3 nginx master process
4 nginx worker
5 nginx worker
6 nginx worker
7 nginx worker
8 nginx worker
...
Uma coisa fixada em uma CPU. Esse é o caminho a percorrer.
Uma placa de rede que leva ao mundo externo. Uma placa de rede que leva à rede interna. A divisão de responsabilidades é sempre boa (embora a NIC dupla de 40 Gbps possa ser um exagero).
Há muitas coisas a serem ajustadas, algumas das quais podem ser o assunto de um pequeno livro. Divirta-se comparando tudo isso. Volte para publicar os resultados.