AES-NI u OpenSSL-u naspram prebacivanja u kernel: šta vam treba?
Odvojite podršku procesorskih instrukcija od mjesta na kojem se obrađuju paketi: provjerite kripto backend, dogovoreni šifar i aktivnu putanju prije podešavanja.
Dvije oznake koriste se kao da su ista stvar: hardverski ubrzano i prebačeno u kernel. Prva opisuje koje instrukcije izvršava AES rutina neke biblioteke, a druga opisuje gdje se odvija obrada paketa. VPN može imati prvu bez druge, drugu bez prve ili obje istovremeno. Svaka odluka o performansama mora početi tako što ćete imenovati koju od te dvije zapravo mijenjate.
Dvije ose, a ne jedan rezultat
Prva os je implementacija: da li se kod koji radi AES-256-GCM usmjerava na verziju koja koristi namjenske instrukcije procesora ili na prenosivu rutinu koja ih izvodi kao običnu aritmetiku. Taj izbor živi unutar kriptografske biblioteke i donosi se pri njenom inicijaliziranju.
Druga os je smještaj: prolazi li paket kroz kernelovu putanju transformacije ili demon u korisničkom prostoru čita s tunelskog uređaja, šifrira i zapisuje natrag.
Nijedna os ne ograničava drugu. VPN u korisničkom prostoru na procesoru s AES instrukcijama može ih koristiti sve vrijeme, a kernelova putanja na procesoru bez njih pada natrag na softversku implementaciju. Oznake u materijalima dobavljača rijetko prave tu razliku, zbog čega savjeti za podešavanje kopirani između dvije situacije tako često ne rade ništa.
Prva os: koji kod obavlja šifriranje
OpenSSL otkriva karakteristike procesora tokom inicijalizacije i koristi rezultat za odabir optimiziranih putanja koda, kao što opisuje dokumentacija o mogućnostima x86. AES-NI je jedna od dokumentiranih mogućnosti iza tog usmjeravanja. Ništa od toga ne zahtijeva da biblioteka postane kernel komponenta.
Provjerite je li karakteristika vidljiva procesu prije nego pretpostavite da se koristi brza putanja. Na Linuxu je izvor polje flags u /proc/cpuinfo, a unutar gosta ono odražava ono što hipervizor izlaže, a ne naziv modela fizičkog hosta.
grep -m1 '^flags' /proc/cpuinfo | grep -o '\baes\b'
openssl list -providers -verboseDruga naredba imenuje providere učitane u tom buildu. Ona vam ne govori koju je biblioteku povezao VPN servis, a host može nositi dvije OpenSSL instalacije dok pokrenuti proces koristi samo jednu od njih.
Druga os: gdje radi putanja paketa
Smještaj u kernelu znači da se transformacija odvija u kernelovom vlastitom IPsec mehanizmu ili unutar tunelskog drajvera u kernelu, pa paketi ne trebaju kružno putovanje kroz proces u korisničkom prostoru za svaku seriju. To može smanjiti kopiranja i prebacivanja konteksta i rasporediti posao po jezgrima na način koji jednonični demon ne može. Također premješta brojače i tragove koje ćete čitati kada propusnost padne, jer se posao sada odvija s druge strane granice koju ne kontrolirate. Tretirajte to kao trošak otklanjanja grešaka, a ne samo kao odluku o performansama.
Ono ne stvara podršku za instrukcije, ne konfiguriše šifru i ne čini postojeću rutu funkcionalnom.
Virtualizacija dodaje nabor i na ovu os. Gostu se može dati maskirani model procesora koji skriva karakteristike koje host ima, a ugniježđeni gost može vidjeti još manje. Čitajte pregled mogućnosti iz unutrašnjosti okruženja u kojem VPN zaista radi, a ne s konzole hipervizora.
Šta svaki izbor kupuje i šta ne može
Praktično pitanje je gdje odlazi vrijeme. Ako propusnost ograničava jedna zauzeta nit, ponovljena kopiranja bafera ili obrazac sistemskog poziva po paketu, premještanje transformacije na putanju koja uklanja te troškove može pomoći, pod uslovom da kernel implementira transformaciju koja vam je potrebna.
Ako je ograničenje zagušena uzlazna veza, putanja s gubicima, dugo vrijeme kruženja, zasićena odredišna usluga ili jedna nit prikovana za jedno jezgro, smještaj ne mijenja ništa važno. Isto vrijedi i za odabir instrukcija: AES na namjenskom hardveru ne može popraviti rutu koja nedostaje i neće pomoći ako tunel miruje jer razrješavanje imena ne uspijeva.
Gdje vrijedi oboje, oni se slažu. Kernelova putanja može koristiti isto usmjeravanje na razini instrukcija unutar kernelovog kripto API-ja, a putanja u korisničkom prostoru s dobro odabranom bibliotekom to već koristi. Odluka nije koja je brža u apstraktnom smislu; odluka je za koji trošak imate dokaz.
Zapišite četiri činjenice prije nego što bilo šta promijenite
Zapišite servisni binarni fajl i kriptografsku biblioteku s kojom je povezan, jer oni određuju prvu os. Zatim zabilježite dogovorenu zaštitu podataka, jer se šifra bez namjenske instrukcijske putanje ponaša drugačije od one s njom, a skup biraju obje strane.
Zatim pregled mogućnosti iz unutrašnjosti pokrenutog okruženja i na kraju aktivna putanja paketa s dokazom da je režim koji mislite da je uključen zaista takav. Učitan modul nije dokaz da ga profil koristi, a konfiguracijska linija nije dokaz da ga je kernel prihvatio.
Promijenite jednu stvar, pa uporedite s dosljednim radnim opterećenjem s istim krajnjim točkama i istim smjerom prijenosa. Tvrdnja o brzini koju niste izmjerili vrijedi manje od bilješke da backend nikada nije bio pod sumnjom.