AES-NI у OpenSSL-у или пребацивање у кернел: шта вам треба?
Одвојте подршку процесорских инструкција од места где се обрађују пакети: проверите крипто позадину, договорену шифру и активну путању пре подешавања.
Две ознаке користе се као да су исто: хардверски убрзано и пребачено у кернел. Прва описује које инструкције извршава AES рутина неке библиотеке, друга описује где се одвија обрада пакета. VPN може имати прву без друге, другу без прве или обе заједно. Свака одлука о перформансама мора почети именовањем тога коју од две заиста мењате.
Две осе, а не један резултат
Прва оса је имплементација: усмерава ли се код који ради AES-256-GCM на верзију која користи наменске инструкције процесора или на преносиву рутину која их извршава као обичну аритметику. Тај избор живи унутар криптографске библиотеке и доноси се при њеној иницијализацији.
Друга оса је смештај: пролази ли пакет кроз трансформациону путању кернела или демон у корисничком простору чита са тунелског уређаја, шифрује и пише назад.
Ниједна оса не ограничава другу. VPN у корисничком простору на процесору са AES инструкцијама може их користити све време, а путања кроз кернел на процесору без њих враћа се на софтверску имплементацију. Ознаке у материјалима добављача ретко праве ту разлику, и зато савети за подешавање копирани између две ситуације тако често не раде ништа.
Оса један: који код обавља шифровање
OpenSSL открива карактеристике процесора током иницијализације и користи резултат за избор оптимизованих путања кода, како описује документација о могућностима x86. AES-NI је једна од документованих могућности иза тог усмеравања. Ништа од тога не захтева да библиотека постане компонента кернела.
Проверите да ли је карактеристика видљива процесу пре него што претпоставите да се користи брза путања. На Linux-у је извор поље flags у /proc/cpuinfo, а унутар госта оно одражава оно што хипервизор излаже, а не назив модела физичког хоста.
grep -m1 '^flags' /proc/cpuinfo | grep -o '\baes\b'
openssl list -providers -verboseДруга наредба именује провајдере учитане у том билду. Не говори вам коју је библиотеку повезао VPN сервис, а један хост може носити две инсталације OpenSSL-а док покренути процес користи само једну од њих.
Оса два: где ради путања пакета
Смештај у кернелу значи да се трансформација одвија у кернеловом сопственом IPsec механизму или унутар тунелског драјвера у кернелу, па пакети не требају повратно путовање кроз процес у корисничком простору за сваку серију. То може смањити копирања и промене контекста те распоредити посао по језгрима на начин који једнонитни демон не може. Премешта и бројаче и трагове које ћете читати кад пропусност падне, јер се посао сада одвија са друге стране границе коју не контролишете. Третирајте то као трошак отклањања грешака, не само као одлуку о перформансама.
Оно не ствара подршку за инструкције, не конфигурише шифру и не оспособљава постојећу руту.
Виртуализација додаје набор и на овој оси. Госту се може дати маскирани модел процесора који скрива карактеристике које хост има, а угњеждени гост може видети још мање. Читајте преглед могућности из унутрашњости окружења у којем VPN заиста ради, а не са конзоле хипервизора.
Шта који избор купује и шта не може
Практично питање је камо одлази време. Ако пропусност ограничава једна заузета нит, поновљена копирања међусмедника или системски позив по пакету, премештање трансформације на путању која уклања те трошкове може помоћи, под условом да кернел имплементира трансформацију која вам је потребна.
Ако је ограничење загущена улазна веза, путања са губицима, дуго време кружења, засићена одредишна услуга или једна нит прикована за једно језгро, смештај не мења ништа важно. Исто важи и за избор инструкција: AES на наменском хардверу не може поправити путању која недостаје и неће помоћи ако тунел мирује јер разрешавање имена не успева.
Где важи обоје, они се допуњују. Путања кроз кернел може користити исто усмеравање на нивоу инструкција унутар кернеловог крипто API-ја, а путања у корисничком простору са добро одабраном библиотеком то већ користи. Одлука није која је бржа у апстрактном смислу; одлука је за који трошак имате доказ.
Запишите четири чињенице пре него што било шта промените
Запишите сервисну бинарну датотеку и криптографску библиотеку са којом је повезана, јер оне одређују прву осу. Затим забележите договорену заштиту података, јер се шифра без наменске инструкцијске путање понаша другачије од оне са њом, а скуп бирају обе стране.
Затим преглед могућности из унутрашњости покренутог окружења и на крају активна путања пакета са доказом да је режим који сматрате укљученим заиста такав. Учитан модул није доказ да га профил користи, а конфигурацијска линија није доказ да га је кернел прихватио.
Промените једну ствар, па упоредите са доследним радним оптерећењем са истим крајњим тачкама и истим смером преноса. Тврдња о брзини коју нисте измерили вреди мање од белешке да позадина никада није била под сумњом.