Krótki test wydajności OpenVPNa
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.