Programeri iz Cloudflarea
Cloudflare koristi dm-crypt za šifriranje podataka na uređajima za pohranu koji se koriste za keširanje sadržaja na CDN-u. Dm-crypt radi na nivou blok uređaja i šifrira I/O zahtjeve za pisanje i dešifruje zahtjeve za čitanje, djelujući kao sloj između blok uređaja i drajvera sistema datoteka.
Za procjenu performansi dm-crypt pomoću paketa
U početku se pojavila sumnja u upotrebu neefikasnih algoritama u kriptosistemu kernela. Ali testovi su koristili najbrži algoritam, aes-xts, sa 256 ključeva za šifrovanje, čije su performanse pri pokretanju “cryptsetup benchmark” više nego dvostruko veće od rezultata dobijenog prilikom testiranja RAM diska. Eksperimenti sa dm-crypt zastavicama za podešavanje performansi nisu dali rezultate: kada se koristi zastavica “--perf-same_cpu_crypt”, performanse su čak smanjene na 136 MB/s, a kada se specificira oznaka “--perf-submit_from_crypt_cpus” samo su se povećale do 166 MB/s.
Dublja analiza operativne logike pokazala je da dm-crypt nije tako jednostavan kao što se čini - kada od FS drajvera stigne zahtjev za pisanje, dm-crypt ga ne obrađuje odmah, već ga smješta u "kcryptd" red, što se ne analizira odmah, već kada je pogodan trenutak. Iz reda čekanja, zahtjev se šalje Linux Crypto API-ju da izvrši šifriranje. Ali pošto Crypto API koristi asinhroni model izvršavanja, šifriranje se također ne izvodi odmah, već zaobilazeći drugi red čekanja. Nakon što je šifriranje završeno, dm-crypt može pokušati sortirati zahtjeve za pisanje na čekanju koristeći stablo pretraživanja
Prilikom čitanja, dm-crypt prvo dodaje zahtjev u red čekanja “kcryptd_io” za primanje podataka sa diska. Nakon nekog vremena, podaci postaju dostupni i stavljaju se u "kcryptd" red za dešifriranje.
Kcryptd šalje zahtjev Linux Crypto API-ju, koji asinhrono dešifrira informacije. Zahtjevi ne prolaze uvijek kroz sve redove, ali u najgorem slučaju, zahtjev za pisanje završava u redovima do 4 puta, a zahtjev za čitanje do 3 puta. Svaki pogodak u red čekanja uzrokuje kašnjenja, koja su ključni razlog za značajno smanjenje performansi dm-crypt.
Upotreba redova je zbog potrebe rada u uslovima u kojima dolazi do prekida. 2005. godine, kada je implementiran trenutni operativni model baziran na redu čekanja dm-crypta, Crypto API još nije bio asinhroni. Nakon što je Crypto API prebačen na asinhroni model izvršavanja, počela je da se koristi u suštini dvostruka zaštita. Redovi su također uvedeni kako bi se uštedjela potrošnja steka kernela, ali nakon njegovog povećanja 2014. godine, ove optimizacije su izgubile svoju relevantnost. Dodatni red čekanja "kcryptd_io" je uveden kako bi se prevazišlo usko grlo koje je rezultiralo čekanjem na dodjelu memorije kada stigne veliki broj zahtjeva. 2015. godine uvedena je dodatna faza sortiranja, jer su zahtjevi za šifriranje na višeprocesorskim sistemima mogli biti dovršeni van reda (umjesto sekvencijalnog pristupa disku, pristup se vršio slučajnim redoslijedom, a CFQ planer nije radio efikasno). Trenutno, kada se koriste SSD diskovi, sortiranje je izgubilo svoje značenje, a CFQ planer se više ne koristi u kernelu.
Uzimajući u obzir da su moderni diskovi postali brži i pametniji, sistem distribucije resursa u Linux kernelu je revidiran i neki podsistemi su redizajnirani, Cloudflare inženjeri
Kao rezultat toga, prilikom testiranja RAM diska, bilo je moguće više nego udvostručiti performanse dm-crypt - performanse su porasle sa 294 MB/s (2 x 147 MB/s) na 640 MB/s, što je vrlo blizu performanse gole enkripcije (696 MB/s).
Prilikom testiranja opterećenja na stvarnim serverima, nova implementacija je pokazala performanse vrlo bliske konfiguraciji koja radi bez enkripcije, a omogućavanje enkripcije na serverima sa Cloudflare keš memorijom nije imalo utjecaja na brzinu odgovora. U budućnosti, Cloudflare planira prenijeti pripremljene zakrpe na glavni Linux kernel, ali prije toga će ih trebati preraditi, jer su optimizirani za određeno opterećenje i ne pokrivaju sva područja primjene, na primjer, šifriranje na niskom -power embedded uređaji.
izvor: opennet.ru