Programeri iz Cloudflarea
Cloudflare koristi dm-crypt za šifriranje podataka na uređajima za pohranu koji se koriste za predmemoriju sadržaja na CDN-u. Dm-crypt radi na razini blok uređaja i šifrira I/O zahtjeve za pisanje i dekriptira zahtjeve za čitanje, djelujući kao sloj između blok uređaja i upravljačkog programa datotečnog sustava.
Za procjenu performansi dm-crypta pomoću paketa
Isprva se pojavila sumnja u korištenje neučinkovitih algoritama u kriptosustavu kernela. Ali testovi su koristili najbrži algoritam, aes-xts, s 256 ključeva za šifriranje, čija je izvedba pri pokretanju “cryptsetup benchmarka” više nego dvostruko veća od rezultata dobivenog pri testiranju RAM diska. Eksperimenti s dm-crypt zastavicama za podešavanje performansi nisu dali rezultate: pri korištenju zastavice “--perf-same_cpu_crypt” izvedba se čak smanjila na 136 MB/s, a kod određivanja zastavice “--perf-submit_from_crypt_cpus” samo se povećala do 166 MB/s.
Dublja analiza logike rada pokazala je da dm-crypt nije tako jednostavan kao što se čini - kada zahtjev za pisanje stigne od FS drajvera, dm-crypt ga ne obrađuje odmah, već ga stavlja u red čekanja “kcryptd”, što ne raščlanjuje se odmah, već u pogodnom trenutku. Iz reda čekanja zahtjev se šalje Linux Crypto API-ju za izvođenje enkripcije. Ali budući da Crypto API koristi model asinkronog izvršavanja, enkripcija se također ne izvodi odmah, već zaobilazeći drugi red čekanja. Nakon dovršetka enkripcije, dm-crypt može pokušati razvrstati zahtjeve za pisanje na čekanju pomoću stabla pretraživanja
Prilikom čitanja dm-crypt prvo dodaje zahtjev u red čekanja “kcryptd_io” za primanje podataka s pogona. Nakon nekog vremena podaci postaju dostupni i stavljaju se u "kcryptd" red čekanja za dešifriranje.
Kcryptd šalje zahtjev Linux Crypto API-ju, koji dekriptira informacije asinkrono. Zahtjevi ne prolaze uvijek kroz sve redove čekanja, ali u najgorem slučaju zahtjev za pisanje završi u redu čekanja do 4 puta, a zahtjev za čitanje do 3 puta. Svaki pogodak u red čekanja uzrokuje kašnjenja, koja su ključni razlog značajnog smanjenja performansi dm-crypta.
Korištenje čekanja je zbog potrebe rada u uvjetima u kojima dolazi do prekida. U 2005. godini, kada je implementiran trenutni operativni model dm-crypt-a temeljen na čekanju, Crypto API još nije bio asinkroni. Nakon što je Crypto API prebačen na model asinkronog izvršavanja, počela se koristiti zapravo dvostruka zaštita. Redovi čekanja također su uvedeni kako bi se uštedjela potrošnja kernel stack-a, ali nakon povećanja u 2014., te su optimizacije izgubile na važnosti. Uveden je dodatni red čekanja "kcryptd_io" kako bi se prevladalo usko grlo koje rezultira čekanjem na dodjelu memorije kada stigne veliki broj zahtjeva. U 2015. uvedena je dodatna faza sortiranja, budući da se zahtjevi za enkripciju na višeprocesorskim sustavima mogu završiti nepravilno (umjesto sekvencijalnog pristupa disku, pristup se vršio nasumičnim redoslijedom, a CFQ planer nije radio učinkovito). Trenutno, kada koristite SSD diskove, sortiranje je izgubilo svoje značenje, a CFQ planer se više ne koristi u kernelu.
S obzirom da su moderni diskovi postali brži i pametniji, sustav distribucije resursa u Linux kernelu je revidiran, a neki podsustavi redizajnirani, inženjeri Cloudflarea
Kao rezultat toga, pri testiranju RAM diska bilo je moguće više nego udvostručiti performanse dm-crypta - performanse su porasle s 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 poslužiteljima, nova implementacija pokazala je performanse vrlo bliske konfiguraciji koja radi bez enkripcije, a omogućavanje enkripcije na poslužiteljima s Cloudflare predmemorije nije imalo utjecaja na brzinu odgovora. U budućnosti Cloudflare planira prenijeti pripremljene zakrpe na glavnu jezgru Linuxa, ali će ih prije toga trebati preraditi, budući da su optimizirane za određeno opterećenje i ne pokrivaju sva područja primjene, na primjer, enkripciju na niskom nivou -napajanje ugrađenih uređaja.
Izvor: opennet.ru