Encerrando um alto volume de conexões SSL de maneira econômica no EC2

5

Eu configurei recentemente um servidor de soquete da Web baseado em Node.js que foi testado para lidar com cerca de 2.000 novas solicitações de conexão por segundo em uma pequena instância do EC2 (m1.small). Considerando o custo de uma instância m1.small e a capacidade de colocar várias instâncias atrás de um servidor proxy compatível com WebSocket, como o HAProxy, estamos muito felizes com os resultados.

No entanto, percebemos que ainda não tínhamos feito nenhum teste usando o SSL, então analisamos várias opções de SSL. Ficou evidente que a terminação de conexões SSL no servidor proxy é ideal, pois o servidor proxy pode inspecionar o tráfego e inserir cabeçalhos, como X-Forward-For, para que o servidor saiba de qual IP a solicitação veio.

As soluções de terminação SSL olhei para onde Pound, stunnel e stud, todas as quais permitiam conexões de entrada no 443 serem finalizadas, e então passadas para o HAProxy na porta 80, que por sua vez passa a conexão para os servidores da web. Infelizmente, no entanto, descobri que o envio de tráfego para o servidor proxy de terminação SSL em uma instância c1.medium (CPU Alta) consumia muito rapidamente todos os recursos da CPU e apenas a uma taxa de 50 ou mais solicitações por segundo. Eu tentei usar todos os três da solução listada acima, e todos eles executaram aproximadamente o mesmo que eu assumo sob o capô todos eles confiam no OpenSSL de qualquer maneira. Eu tentei usar uma instância muito alta de 64 bits de CPU alta (c1.xlarge) e descobri que o desempenho é escalável apenas linearmente com o custo. Então, com base no preço do EC2, eu precisaria pagar cerca de US $ 600p / m para 200 solicitações de SSL por segundo, em vez de US $ 60p / m para 2.000 solicitações não SSL por segundo. O preço anterior torna-se economicamente inviável muito rapidamente quando começamos a planejar a aceitação de 1.000 ou 10.000 de solicitações por segundo.

Eu também tentei encerrar o SSL usando o servidor https do Node.js, e o desempenho foi muito semelhante ao de Pound, stunnel e stud, portanto, nenhuma vantagem clara para essa abordagem.

Então, o que eu espero que alguém possa ajudar é aconselhar como posso contornar este custo ridículo que temos que absorver para fornecer conexões SSL. Ouvi dizer que os aceleradores de hardware SSL fornecem um desempenho muito melhor, pois o hardware foi projetado para criptografia e descriptografia SSL, mas como estamos usando o Amazon EC2 para todos os nossos servidores, usar aceleradores de hardware SSL não é uma opção, a menos que tenhamos dados separados centro com servidores físicos. Eu estou apenas lutando para ver como os gostos da Amazon, Google, Facebook podem fornecer todo o seu tráfego sobre SSL quando o custo é tão alto. Deve haver uma solução melhor por aí.

Qualquer conselho ou idéia seria muito apreciado.

Obrigado Matt

    
por Matthew O'Riordan 01.02.2012 / 17:28

3 respostas

3

Em primeiro lugar, bom em você para o benchmarking começar. Meu instinto de lá me faz pensar em qual tamanho de chave você está usando. Parece-me que você deve ser capaz de encerrar mais de 200 conexões por segundo . Se você estiver usando um tamanho de chave maior que 1024, saiba que o desempenho cai muito rapidamente .

Se você estiver usando uma chave menor e ainda estiver com problemas, eu daria uma boa olhada nas ofertas de GPU que o EC2 tem a oferecer. SSLShader pode ser uma mudança de custo efetivo após um certo número de conexões por segundo.

Além disso, investigar a citação do @@ ceejayoz do Elastic Load Balancer tem mérito.

    
por 01.02.2012 / 17:50
2

Você possivelmente está fazendo o benchmarking errado. Eu duvido que você esteja realmente esperando 200 novos visitantes SSL exclusivos por segundo? Se alguma dessas conexões for reconectada de pessoas que visitaram recentemente, você deve estar usando o cache de SSL - esse tipo de coisa:

server.on ('newSession', função (id, data) { tlsSessionStore [id] = data; });

server.on ('resumeSession', função (id, cb) { cb (null, tlsSessionStore [id] || nulo); });

E, é claro, o seu benchmark precisa se apresentar em seus testes como a proporção correta de novas conexões virgens e retomada / reutilizada como faz sentido para sua aplicação.

Além disso, as cifras escolhidas e os tamanhos das chaves, como mencionado anteriormente, provavelmente também desempenham papéis na velocidade.

    
por 15.01.2014 / 15:08
0

Parece que a velocidade do SSL depende do algoritmo e do nível de segurança desejado, mas ainda não testei minha instância do EC2, mas queria compartilhar algumas dicas com todos sobre a ativação da troca de chaves ECDHE no estilo Google com algoritmos SSL pré-selecionados para evitar o BEAST e outras configurações incorretas do SSL.

Alguns bons links para começar: (nenhum lugar ainda tem tudo, eu deveria escrever um manual, mas até então eu fiz este post um wiki da comunidade se alguém quiser contribuir com links e dicas!)

E dê uma olhada no link para alguma conversa sobre por que o SSL não é "apenas SSL" nos dias de hoje.

    
por 17.03.2017 / 14:14