Krótki test wydajności OpenVPNa

5 września, 2014 (20:28) | linux, security, sprzęt | By: admin

Jakiś czas temu rozie na swoim blogu zwrócił uwagę na wydajność szyfrowania AESem w zależności od procesora, na którym taką operację przeprowadzamy. Z krótkiego wpisu rozwinęła się całkiem ciekawa dyskusja o akceleracji szyfrowania i implementacji tego mechanizmu dla konkretnych rozwiązań. Okazuje się, że temat jest zdecydowanie nietrywialny i że na wydajność szyfrowania, niezależnie od tego, czy szyfrujemy zawartość dysku, czy przesyłane przez sieć dane, wpływa wiele ciekawych czynników.

Na początku tego roku robiłem testy wydajnościowe na potrzeby szyfrowania dysków za pomocą LUKSa. Wyniki (jak znajdę czas, to je tutaj kiedyś wrzucę) pokazały, że bardzo duży przyrost wydajności możemy osiągnąć wykorzystując rozszerzenie procesora o nazwie AES-NI. Samo załadowanie modułu aesni_intel (bo taka platforma mnie wtedy interesowała) powodowało wydajnościowego kopa na poziomie 250% (cryptsetup dla algorytmu aes-128-cbc pokazał wzrost z 219MB/s do 620MB/s).

Dzisiaj chciałbym się skupić na tym samym zagadnieniu, ale w kontekście szyfrowania danych przesyłanych przez tunel OpenVPNa. Ponieważ takich testów raczej nie należy przeprowadzać na produkcji, skleciłem na kolanie „laba”, składającego się z mojego domowego pseudo-serwera (Intel Pentium G2130, 2 rdzenie, 3.2GHz, bez AES-NI) jako koncentratora i kilku klientów:

Procesor Ilość rdzeni Taktowanie Obsługa AES-NI Wersja OpenVPN Wersja OpenSSL
Intel Pentium G2130 (serwer) 2 3.2GHz nie 2.3.2 1.0.1e
BCM2708 (Raspberry Pi) 1 700MHz nie 2.2.1 1.0.1e
Atom N450 2 1.66GHz nie 2.3.4 1.0.1h
Intel Core i3-2328M 4 2.20GHz nie 2.3.2 1.0.1e

Najpierw warto by było przedstawić benchmark samych maszynek. Żeby być jako tako spójnym z wpisem roziego, test przeprowadziłem za pomocą polecenia 'openssl speed’ (ale bez opcji –multi). Odpowiednie cyferki możemy obejrzeć w poniższej tabelce:

Procesor metoda EVP 16 bajtów 64bajty 256 bajtów 1024 bajty 8192 bajty
Pentium G2130 blowfish nie 111838.03k 118068.71k 119746.30k 120131.93k 119834.54k
Pentium G2130 aes-128 nie 117062.41k 126229.12k 129054.21k 130245.29k 130149.38k
Pentium G2130 aes-192 nie 98864.16k 106001.69k 107704.23k 108460.37k 108311.30k
Pentium G2130 aes-256 nie 85420.73k 91069.50k 92267.01k 92833.45k 92675.74k
Pentium G2130 blowfish tak 105716.16k 116182.74k 119066.20k 119753.73k 119559.65k
Pentium G2130 aes-128 tak 271673.82k 309998.76k 318558.72k 322995.54k 323809.89k
Pentium G2130 aes-192 tak 232440.81k 261580.93k 268462.59k 270156.03k 272441.34k
Pentium G2130 aes-256 tak 204231.31k 225104.90k 228725.76k 231693.31k 232056.77k
BCM2708 blowfish nie 11755.84k 12993.39k 13405.07k 13446.49k 13463.37k
BCM2708 aes-128 nie 13140.15k 15115.10k 15601.49k 15752.53k 15780.52k
BCM2708 aes-192 nie 11679.77k 13123.96k 13607.43k 13685.64k 13664.26k
BCM2708 aes-256 nie 10476.46k 11671.22k 11977.46k 12062.65k 12120.31k
Atom N450 blowfish nie 31808.31k 37482.97k 38595.49k 39433.69k 39458.13k
Atom N450 aes-128 nie 17452.50k 19512.13k 20164.56k 20287.65k 20246.74k
Atom N450 aes-192 nie 14971.40k 16236.56k 16473.60k 16860.37k 16635.85k
Atom N450 aes-256 nie 13112.14k 13518.60k 14060.91k 14216.53k 14206.87k
Intel Core i3-2328M blowfish nie 28692.63k 30520.29k 30977.54k 31125.49k 31278.05
Intel Core i3-2328M aes-128 nie 66138.57k 71990.69k 73180.38k 73739.64k 73621.50k
Intel Core i3-2328M aes-192 nie 56869.05k 60106.45k 60723.46k 61241.02k 61324.93k
Intel Core i3-2328M aes-256 nie 48708.71k 51531.41k 52133.67k 52185.43k 52426.06k
Intel Core i3-2328M blowfish tak 64643.66k 73398.41k 75643.12k 75934.72k 76371.91k
Intel Core i3-2328M aes-128 tak 193197.85k 218585.69k 225486.85k 229195.17k 229048.32k
Intel Core i3-2328M aes-192 tak 167300.98k 185269.16k 188734.24k 190922.75k 192207.88k
Intel Core i3-2328M aes-256 tak 141999.80k 158782.19k 162644.08k 164797.56k 164743.85k

Dodatkowo udało mi się zmierzyć wydajność OpenSSLa na innych procesorach. Niestety testy przeprowadzałem w warunkach jeszcze bardziej polowych i nie miałem możliwości przetestowania tunelu OpenVPNa. Wyniki poniżej:

Procesor metoda EVP 16 bajtów 64bajty 256 bajtów 1024 bajty 8192 bajty
Intel Core i3-370M blowfish nie 79179.54k 84279.07k 85020.25k 86230.39k 86122.50k
Intel Core i3-370M aes-128 nie 69946.37k 75249.88k 76637.18k 77009.92k 77596.60k
Intel Core i3-370M aes-192 nie 52987.83k 63014.96k 64589.74k 64962.70k 64233.47k
Intel Core i3-370M aes-256 nie 51399.85k 54372.29k 55082.58k 55436.41k 55222.27k
Intel Core i3-370M blowfish tak 71905.65k 82133.90k 84635.14k 85630.03k 86417.41k
Intel Core i3-370M aes-128 tak 199711.18k 209292.14k 238668.89k 231671.47k 241628.38k
Intel Core i3-370M aes-192 tak 168509.14k 195591.96k 199047.94k 202059.43k 203473.94k
Intel Core i3-370M aes-256 tak 151062.21k 145539.39k 148601.15k 148939.43k 171442.94k
Intel Core i5-430M blowfish nie 83313.77k 88810.13k 90169.94k 90578.79k 90521.60k
Intel Core i5-430M aes-128 nie 72153.17k 78303.70k 80498.39k 80694.27k 81144.64k
Intel Core i5-430M aes-192 nie 61006.35k 65888.98k 67536.05k 67680.26k 67780.61k
Intel Core i5-430M aes-256 nie 53326.80k 56762.05k 57861.22k 57920.17k 58185.12k
Intel Core i5-430M blowfish tak 75979.35k 87297.78k 90258.94k 90369.02k 90914.76k
Intel Core i5-430M aes-128 tak 209198.84k 201503.29k 245059.67k 250484.78k 249350.83k
Intel Core i5-430M aes-192 tak 179041.03k 169074.99k 205959.85k 198640.59k 203565.74k
Intel Core i5-430M aes-256 tak 154588.26k 172672.53k 171531.82k 153086.29k 180595.37k

W przypadku Atoma i ARMa z Raspberry Pi nie ma sensu przedstawiać wyników z wykorzystaniem EVP, bo te procesory niewiele umieją i wyniki są niemal identyczne (lub nawet słabsze).

Warto by było przedstawić jeszcze sposób przeprowadzania testów.
Konfiguracja serwera: (cipher i comp-lzo ustawiane zgodnie z odpowiednim testem)

local 10.0.0.2
proto udp
port 1194
dev tap0
ca /etc/openvpn/certs/ca.pem
cert /etc/openvpn/certs/server.crt
key /etc/openvpn/certs/server.key
dh /etc/openvpn/certs/dh1024.pem
server-bridge 10.0.99.1 255.255.255.0 10.0.99.2 10.0.99.20
keepalive 10 120
max-clients 10
persist-key
persist-tun
verb 3
cipher XXX               
comp-lzo

Konfiguracja klienta:

client
dev tap
proto udp
remote 10.0.99.1
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
verb 3
comp-lzo
cipher XXX

Wyniki pochodzą z iperfa (komendy odpowiednio dla serwera i klienta):

iperf -s
iperf -c adres_IP -t 600; uptime

Najwyższy czas na bohatera niniejszego wpisu, czyli tabelkę z wynikami:

Procesor Metoda szyfrowania kompresja LZO loadavg (5 min) klienta Wynik
Atom N450 bez tunelu 0.15 94.2 Mbits/sec
Atom N450 default (BF-CBC) tak 0.92 109 Mbits/sec
Atom N450 AES-128-CBC tak 0.97 104 Mbits/sec
Atom N450 default (BF-CBC) nie 1.06 83.3 Mbits/sec
Atom N450 AES-128-CBC nie 0.98 69.0 Mbits/sec
BCM2708 bez tunelu 1.07 62.6 Mbits/sec
BCM2708 brak tak 0.93 16.6 Mbits/sec
BCM2708 brak nie 1.09 16.3 Mbits/sec
BCM2708 default (BF-CBC) tak 1.10 13.4 Mbits/sec
BCM2708 AES-128-CBC tak 0.97 13.7 Mbits/sec
BCM2708 default (BF-CBC) nie 0.95 11.7 Mbits/sec
BCM2708 AES-128-CBC nie 1.06 12.1 Mbits/sec
Intel Core i3-2328M bez tunelu 0.18 870 Mbits/sec
Intel Core i3-2328M brak tak 0.94 519 Mbits/sec
Intel Core i3-2328M brak nie 0.85 447 Mbits/sec
Intel Core i3-2328M default (BF-CBC) tak 0.87 471 Mbits/sec
Intel Core i3-2328M AES-128-CBC tak 0.91 476 Mbits/sec
Intel Core i3-2328M default (BF-CBC) nie 0.96 263 Mbits/sec
Intel Core i3-2328M AES-128-CBC nie 0.95 378 Mbits/sec

Na koniec kilka ciekawostek.

  • Laptop z Core i3 na pokładzie spędzał dużo więcej czasu na obsłudze karty sieciowej (Realtek 8169 – funkcje kernela rtl8169_poll oraz rtl8169_interrupt), niż na szyfrowaniu danych.

  • Zgodnie z informacjami, które znalazłem na stronie OpenVPNa, problemy z osiągnięciem wysokich wartość na linkach gigabitowych nie wynika z braku zasobów do szyfrowania danych, a ze sposobu, w jaki pakiety z danymi podróżują przez system.

  • Spotkałem się też z informacją, że aby włączyć EVP w OpenVPNie, trzeba dodać do konfiguracji komendę engine aes-ni.

Trackback URL: https://konrad.bechler.pl/2014/09/openvpn-benchmark/trackback/

«