2012-06-05 14 views
5

Włączyłem SSL na moim serwerze proxy i odkryłem, że wydajność spadła z około 17 tys. Żądań na sekundę do 5 tys. Żądań na sekundę. Postępowałem zgodnie z kodem w bezpiecznym czacie Netty i nie sądzę, abym zrobił coś inaczej.Jak mogę zwiększyć wydajność serwera SSL

Napisałem fałszywy serwer, aby sprawdzić, czy popełniłem błędy w moim proxy. Uruchamianie fałszywego serwera SSL w normalnym trybie http jest w stanie wykonać około 50k żądań na sekundę. Kiedy włączam SSL na fałszywym serwerze, który spada do 28 tys. Żądań na sekundę.

Czy jest coś, co robię źle? Czy jest coś, czego mi brakuje?

Używam JDK 6 do kompilacji kodu, działającego na JDK 7u4. Używam również Netty-3.5.0. Używam zeusbench do uruchomienia testu. Parametry badań są: zeusbench -n 10000 -c 100 -k -C RC4_SHA "https: ///"

Źródło: http://pastebin.com/iahqr3zT

Edit 1: Zabrakło mi obojętne poprzez serwer JProfiler. Wywołanie SSLContext.createSSLEngine w fabryce potoków zajmuje (średnio) 55.005 mikrosekund (ta średnia została obliczona z 540 wywołań metody).

Wywołanie SslHandler.handshake w channelConnected zajmuje (średnio) 46 284 mikrosekund (tę średnią obliczono na podstawie 540 inwokacji metody).

Rozumiem, że Netty niewiele może zrobić w związku z wywołaniem tworzeniaSSLEngine, ale czy SslHandler.handshake może być lepiej dostrojony? Zajmuje prawie tyle samo czasu, co generowanie samego silnika.

+0

Czy masz możliwość zakończenia protokołu SSL, zanim żądanie dotrze do Twojego serwera? Najlepiej byłoby użyć dedykowanego sprzętu do zakończenia SSL. Także Amazons Elastic Load Balancer może to zrobić. Jaka jest długość klucza SSL? Długość klucza ma wpływ na wydajność http://www.javamex.com/tutorials/cryptography/rsa_key_length.shtml –

+0

@JohnP Dzięki za odpowiedź. Kończenie protokołu SSL przed dotarciem do mojego serwera nie jest możliwe. Dzięki za podpowiedź na temat długości klucza SSL, jego 2048 – blucas

Odpowiedz

-1

Szyfrowanie/odszyfrowywanie w/java jest bardzo powolne.
Nie należy używać implementacji SSL w/java dla wydajności.
Istnieje kilka sposobów na uniknięcie Java dla połączenia SSL: serwer proxy

  1. skonfigurować, które zapewniają połączenia SSL frontem swojej serwera java
  2. Wdrożenie ssl uzgadniania bibliotekę w/openssl korzystania z biblioteki w kodzie Netty przez JNI
+2

Naprawdę powolny w porównaniu do czego? Istnieją miliony witryn działających np. Tomcat z SSL, które są kontrprzykładami do tych twierdzeń. Sam je prowadzę od kilku lat. – EJP

+0

Oto jedno źródło komentarza "java to slow" w tej odpowiedzi: http://netty.io/wiki/requirements-for-4.x.html#benefits-of-using-openssl – cdeszaq

0

Możesz spróbować ponownie użyć sesji ssl dla istniejących połączeń, zmniejsza to handshake ssl i powinno dać ogólny impuls.

+0

To już dzieje się domyślnie. Musisz zrobić wszystko, aby temu zapobiec. – EJP

Powiązane problemy