Dezvoltatori de la Cloudflare
Cloudflare folosește dm-crypt pentru a cripta datele de pe dispozitivele de stocare utilizate pentru a stoca în cache conținutul de pe CDN. Dm-crypt operează la nivel de dispozitiv bloc și criptează cererile de I/O de scriere și decriptează cererile de citire, acționând ca un strat între dispozitivul bloc și driverul sistemului de fișiere.
Pentru a evalua performanța dm-crypt folosind pachetul
La început, au apărut suspiciuni cu privire la utilizarea algoritmilor ineficienți în criptosistemul nucleului. Însă testele au folosit cel mai rapid algoritm, aes-xts, cu 256 de chei de criptare, a căror performanță la rularea „cryptsetup benchmark” este de peste două ori mai mare decât rezultatul obținut la testarea unui disc RAM. Experimentele cu steaguri dm-crypt pentru reglarea performanței nu au dat rezultate: atunci când se folosește steagul „--perf-same_cpu_crypt”, performanța a scăzut chiar la 136 MB/s, iar când s-a specificat steagul „--perf-submit_from_crypt_cpus” a crescut doar până la 166 MB/s.
O analiză mai profundă a logicii de operare a arătat că dm-crypt nu este atât de simplu pe cât pare - atunci când sosește o solicitare de scriere de la driverul FS, dm-crypt nu o procesează imediat, ci o plasează în coada „kcryptd”, care nu este analizat imediat, ci când este momentul convenabil. Din coadă, cererea este trimisă către API-ul Linux Crypto pentru a realiza criptarea. Dar, deoarece API-ul Crypto folosește un model de execuție asincron, nici criptarea nu este efectuată imediat, ci ocolind o altă coadă. După ce criptarea este completă, dm-crypt poate încerca să sorteze cererile de scriere în așteptare folosind un arbore de căutare
La citire, dm-crypt adaugă mai întâi o solicitare la coada „kcryptd_io” pentru a primi date de pe unitate. După ceva timp, datele devin disponibile și sunt plasate în coada „kcryptd” pentru decriptare.
Kcryptd trimite o solicitare către API-ul Linux Crypto, care decriptează informațiile în mod asincron. Solicitările nu trec întotdeauna prin toate cozile, dar în cel mai rău caz, o solicitare de scriere ajunge în cozi de până la 4 ori, iar o solicitare de citire de până la 3 ori. Fiecare accesare la coadă cauzează întârzieri, care sunt motivul cheie pentru scăderea semnificativă a performanței dm-crypt.
Utilizarea cozilor se datorează necesității de a lucra în condițiile în care apar întreruperi. În 2005, când a fost implementat actualul model de operare bazat pe cozi de aşteptare al dm-crypt, API-ul Crypto nu era încă asincron. După ce API-ul Crypto a fost transferat la un model de execuție asincron, în esență a început să fie utilizată protecție dublă. Au fost introduse și cozi pentru a economisi consumul stivei de kernel, dar după creșterea acestuia în 2014, aceste optimizări și-au pierdut relevanța. O coadă suplimentară „kcryptd_io” a fost introdusă pentru a depăși blocajul care rezultă în așteptarea alocării memoriei atunci când sosesc un număr mare de solicitări. În 2015, a fost introdusă o fază suplimentară de sortare, deoarece cererile de criptare pe sistemele multiprocesor puteau fi finalizate în afara ordinului (în loc de acces secvenţial la disc, accesul a fost efectuat în ordine aleatorie, iar planificatorul CFQ nu a funcţionat eficient). În prezent, când se utilizează unități SSD, sortarea și-a pierdut sensul, iar planificatorul CFQ nu mai este folosit în nucleu.
Având în vedere că unitățile moderne au devenit mai rapide și mai inteligente, sistemul de distribuție a resurselor din nucleul Linux a fost revizuit și unele subsisteme au fost reproiectate, inginerii Cloudflare
Ca rezultat, la testarea unui disc RAM, a fost posibil să se dubleze mai mult decât performanța dm-crypt - performanța a crescut de la 294 MB/s (2 x 147 MB/s) la 640 MB/s, ceea ce este foarte aproape de performanța criptării netede (696 MB/s).
La testarea încărcării pe servere reale, noua implementare a arătat performanțe foarte apropiate de configurația care rulează fără criptare, iar activarea criptării pe servere cu cache Cloudflare nu a avut niciun efect asupra vitezei de răspuns. În viitor, Cloudflare intenționează să transfere patch-urile pregătite pe kernel-ul principal Linux, dar înainte de aceasta vor trebui reluate, deoarece sunt optimizate pentru o anumită încărcare și nu acoperă toate domeniile de aplicație, de exemplu, criptarea la nivel scăzut. -dispozitive integrate cu putere.
Sursa: opennet.ru