Zhvilluesit e kompanisë Cloudflare për punën e realizuar në optimizimin e performancës së enkriptimit të disqeve në bërthamën Linux. Si rezultat, u përgatitën për nën-sistemin dhe Crypto API, që lejuan që në testin sintetik kapaciteti për lexim dhe shkruajtur u rrit më shumë se dyfish, si dhe vonesat u ulën gjithashtu në dyfish. Gjatë testimit në pajisje reale, kostot e enkriptimit arritën të ulen praktikisht në nivelin e vërejtur kur punohet me disk pa përdorimin e të dhënave të enkriptuara.
Cloudflare përdor dm-crypt për enkriptimin e të dhënave në pajisjet që përdoren për memorizimin e përmbajtjes në rrjetin CDN. Dm-crypt funksionon në nivelin e pajisjeve bllok dhe kryen enkriptimin e kërkesave të input/ output për shkruaj dhe dekriptimin e kërkesave për lexim, duke vepruar si një shtresë midis pajisjes bllok dhe drajverit të sistemit të skedarëve.
Për të vlerësuar performancën e dm-crypt me paketën u bë një matje e shpejtësisë së punës me seksionet e enkriptuara dhe ato të enkriptuara jo në një RAM-disk, i vendosur në RAM për të përjashtuar fluktuacionet e performancës së disqeve dhe për t'u fokusuar në performancën e kodit. Për seksionet e enkriptuara jo, performanca e leximit dhe shkruajturit u mbajt në 1126 MB/s, por me aktivizimin e enkriptimit, shpejtësia u ul 7 herë dhe arriti në 147 MB/s.
NĂ« fillim, ngjalli dyshime pĂ«r pĂ«rdorimin e algoritmeve tĂ« paefektshĂ«m nĂ« sistemin kriptografik tĂ« bĂ«rthamĂ«s. Por nĂ« testime u pĂ«rdor algoritmi mĂ« i shpejtĂ« aes-xts me njĂ« çelĂ«s 256 bitĂ«sh, performanca e tĂ« cilit gjatĂ« ekzekutimit tĂ« "cryptsetup benchmark" ishte mĂ« shumĂ« se dyfish mĂ« e lartĂ« se rezultati i arritur nga testimi i RAM-diskut. Eksperimentet me flamujt dm-crypt pĂ«r optimizimin e performancĂ«s nuk dhanĂ« rezultate: duke pĂ«rdorur flamurin "âperf-same_cpu_crypt", performanca u ul deri nĂ« 136 MB/s, ndĂ«rsa me flamurin "âperf-submit_from_crypt_cpus" arriti vetĂ«m deri nĂ« 166 MB/s.
Një analizë më e thellë e logjikës së funksionimit tregoi se dm-crypt nuk është aq e thjeshtë sa duket - kur merr një kërkesë për shkruarje nga drejtuesi i sistemit të skedarëve, dm-crypt nuk e përpunon menjëherë, por e vendos në radhë "kcryptd", e cila nuk përpunon menjëherë, por kur arrin një moment të përshtatshëm. Nga radhë, kërkesa dërgohet në Linux Crypto API për ekzekutimin e enkriptimit. Por pasi Crypto API përdor një model ekzekutiv asinkron, enkriptimi gjithashtu nuk kryhet menjëherë, duke anashkaluar një radhë tjetër. Pasi përfundon enkriptimi, dm-crypt mund të përpiqet të kryejë renditjen e kërkesave të pritura për shkruarje, duke përdorur një pemë kërkimi. . Në fund, një rrjedhë e veçantë e bërthamës, përsëri me një vonesë të caktuar, merr kërkesat e mbledhura të hyrjes/daljes dhe i dërgon ato në shkakun e pajisjes bllokuese.
Kur lexohet, fillimisht dm-crypt shton në radhë "kcryptd_io" kërkesën për marrjen e të dhënave nga disku. Pas një kohe, të dhënat bëhen të disponueshme dhe vendosen në radhë "kcryptd" për dekriptim.
Kcryptd dĂ«rgon kĂ«rkesĂ«n nĂ« Linux Crypto API, i cili dekrypton informacionin nĂ« njĂ« mĂ«nyrĂ« asinkrone. KĂ«rkesat nuk kalojnĂ« gjithmonĂ« nĂ« tĂ« gjitha radhĂ«t, por nĂ« skenarin mĂ« tĂ« keq, njĂ« kĂ«rkesĂ« pĂ«r shkrim mund tĂ« mbetet nĂ« radhĂ« deri nĂ« 4 herĂ«, ndĂ«rsa njĂ« kĂ«rkesĂ« pĂ«r lexim deri nĂ« 3 herĂ«. Ădo herĂ« qĂ« kalon nĂ« radhĂ«, ndodhin vonesa, qĂ« janĂ« shkaku kryesor i uljes sĂ« konsiderueshme tĂ« performancĂ«s sĂ« dm-crypt.
Përdorimi i radhëve është i nevojshëm për të punuar në kushte kur ndodhin ndërprerje. Në vitin 2005, kur u zbatua modeli aktual i funksionimit dm-crypt bazuar në radhë, Crypto API nuk ishte ende asinkron. Pas kalimit të Crypto API në një model asinkron, u zbatua praktikisht një mbrojtje e dyfishtë. Radhët gjithashtu u futën për të kursyer konsumimin e stack-ut të bërthamës, por pas rritjes së tij në vitin 2014, këto optimizime humbën rëndësinë. Një radhë shtesë "kcryptd_io" u fut për të përballuar ngushticën që shkakun për pritjen e alokimit të memories kur arrin një numër i madh kërkesash. Në vitin 2015, u fut gjithashtu një fazë renditjeje, pasi kërkesat për enkriptim në sisteme me shumë procese mund të përfundonin pa respektuar rendin e dërgimit (në vend të një qasjeje sekondare në disk, bëhej qasje në mënyrë të rastësishme, dhe gjithashtu planifikuesi CFQ nuk punonte në mënyrë efikase). Aktualisht, me përdorimin e SSD-ve, renditja ka humbur kuptimin, dhe planifikuesi CFQ tashmë nuk përdoret në bërthamë.
Duke marrë parasysh se magazinat moderne kanë become më të shpejta dhe më të zgjuara, sistemi i shpërndarjes së burimeve në bërthamën Linux është rishikuar dhe disa nën-sisteme janë ripunuar, inxhinierët e Cloudflare në dm-crypt ka një modalitet të ri, i cili është çliruar nga përdorimi i radhëve të tepërta dhe thirrjeve asinkrone. Modaliteti aktivizohet me një flamur të veçantë "force_inline" dhe e bën dm-crypt një formë thjesht proxy, që enkripton dhe dekripton kërkesat që vijnë. Ndërveprimi me Crypto API është optimizuar me zgjedhjen e qartë të algoritmeve të enkriptimit, që punojnë në modalitetin sinkron dhe nuk përdorin radhë kërkesash. Për punën sinkrone me Crypto API ishte një modul, që lejon përdorimin e FPU/AES-NI për përshpejtim dhe kalon drejtpërdrejt kërkesat e enkriptimit dhe dekriptimit.
Si rezultat, gjatĂ« testimit tĂ« diskut RAM, arritĂ«m tĂ« rrisim performancĂ«n e dm-crypt mĂ« shumĂ« se dyfish â performanca u rrit nga 294 MB/s (2 x 147 MB/s) nĂ« 640 MB/s, qĂ« Ă«shtĂ« shumĂ« afĂ«r performancĂ«s sĂ« enkriptimit tĂ« pastĂ«r (696 MB/s).
Gjatë testimit të ngarkesës në serverat realë, implementimi i ri tregoi një performancë shumë të afërt me konfigurimin që punon pa enkriptim, ndërsa aktivizimi i enkriptimit në serverat me memorie cache të Cloudflare nuk ndikoi në shpejtësinë e përgjigjes. Në të ardhmen, Cloudflare planifikon të transferojë patches e përgatitura në bërthamën kryesore të Linux, por para kësaj do të nevojitet ripërpunimi i tyre, pasi ato janë optimizuar për një ngarkesë të veçantë dhe nuk mbulojnë të gjitha fushat e aplikimit, për shembull, enkriptimin në pajisje të vogla të integruara.
Burimi: opennet.ru
