Cloudflare'i arendajad kernelis ketta krüptimise jõudluse optimeerimiseks tehtava töö kohta LinuxSelle tulemusel valmistati ette järgmised koostisosad: allsüsteemi jaoks ja Crypto API, mis võimaldas sünteetilises testis lugemis- ja kirjutamisvõimsust enam kui kahekordistada ning latentsust poole võrra vähendada. Päris riistvaraga testimisel vähenes krüptimise üldkulu peaaegu tasemele, mida täheldati ilma andmete krüptimiseta kettaga töötamisel.
Cloudflare kasutab dm-krüpti andmete krüptimiseks salvestusseadmetel, mida kasutatakse CDN-i sisu vahemällu salvestamiseks. Dm-crypt töötab plokkseadme tasemel ja krüpteerib kirjutamis-sisendi- ja dekrüpteerimistaotlused, toimides kihina plokkseadme ja failisüsteemi draiveri vahel.
Dm-crypt toimivuse hindamine paketi abil Mõõtsime RAM-is asuva RAM-ketta krüpteeritud ja krüptimata partitsioonidega töötamise kiirust, et kõrvaldada ketta jõudluse kõikumised ja keskenduda koodi jõudlusele. Krüptimata partitsioonide puhul jäi lugemise ja kirjutamise jõudlus 1126 MB/s juurde, kuid krüpteerimise lubamisel kiirus vähenes 7 aeg ja ulatus 147 MB/s-ni.
Algul tekkis kahtlus ebaefektiivsete algoritmide kasutamises tuuma krüptosüsteemis. Kuid testides kasutati kiireimat algoritmi aes-xts, 256 krüpteerimisvõtmega, mille jõudlus "cryptsetup etaloni" käivitamisel on rohkem kui kaks korda kõrgem kui RAM-ketta testimisel saadud tulemus. Katsed dm-crypt lippudega jõudluse häälestamiseks ei andnud tulemusi: lipu "--perf-same_cpu_crypt" kasutamisel langes jõudlus isegi 136 MB/s-ni ja lipu "--perf-submit_from_crypt_cpus" määramisel ainult tõusis. kuni 166 MB/s.
Loogika põhjalikum analüüs näitas, et dm-crypt pole nii lihtne, kui esmapilgul paistab. Kui failisüsteemi draiverilt tuleb kirjutamispäring, siis dm-crypt ei töötle seda kohe, vaid asetab selle "kcryptd" järjekorda, mida ei analüüsita kohe, vaid siis, kui aeg on õige. Sealt saadetakse päring aadressile Linux Krüpto API teostab krüpteerimist. Kuna krüpto API kasutab aga asünkroonset teostusmudelit, ei teostata krüpteerimist kohe, vaid möödutakse teisest järjekorrast. Pärast krüpteerimise lõpetamist saab dm-crypt proovida ootel olevaid kirjutamistaotlusi otsingupuu abil sortida. . Lõpus korjab taas eraldi kerneli lõim teatud viivitusega üles kogunenud I/O päringud ja saadab need plokkseadmete virna.
Lugemisel lisab dm-crypt esmalt järjekorda "kcryptd_io" draivilt andmete vastuvõtmise päringu. Mõne aja pärast muutuvad andmed kättesaadavaks ja asetatakse dekrüpteerimiseks kcryptd järjekorda.
Kcryptd saadab päringu aadressile Linux Krüpto API-d, mis dekrüpteerivad andmeid asünkroonselt. Päringud ei läbi alati kõiki järjekordi, kuid halvimal juhul jääb kirjutamispäring järjekordadesse kinni kuni neli korda ja lugemispäring kuni kolm korda. Iga järjekorra tabamus tekitab latentsust, mis on dm-crypti olulise jõudluse halvenemise peamine põhjus.
Järjekordade kasutamine on tingitud vajadusest töötada tingimustes, kus esineb katkestusi. 2005. aastal, kui dm-crypti praegune järjekorrapõhine töömudel rakendati, ei olnud Crypto API veel asünkroonne. Pärast seda, kui Crypto API viidi üle asünkroonsele täitmismudelile, hakati kasutama sisuliselt topeltkaitset. Järjekorrad võeti kasutusele ka kerneli virna tarbimise säästmiseks, kuid pärast selle suurenemist 2014. aastal kaotasid need optimeerimised oma tähtsuse. Täiendav järjekord "kcryptd_io" võeti kasutusele, et ületada kitsaskoht, mille tulemuseks on mälu eraldamise ootamine, kui saabub suur hulk päringuid. 2015. aastal võeti kasutusele täiendav sortimise faas, kuna mitme protsessoriga süsteemides sai krüpteerimispäringuid lõpule viia (kettale järjestikuse juurdepääsu asemel toimus juurdepääs juhuslikus järjekorras ja CFQ planeerija ei töötanud tõhusalt). Praegu on SSD-draivide kasutamisel sorteerimine oma mõtte kaotanud ja CFQ planeerijat enam tuumas ei kasutata.
Kuna tänapäevased salvestusseadmed muutuvad kiiremaks ja nutikamaks, muutub ka kerneli ressursside jaotamise süsteem. Linux vaadati üle ja mõned alamsüsteemid kujundati ümber, Cloudflare'i insenerid dm-cryptil on uus töörežiim, mis välistab tarbetute järjekordade ja asünkroonsete kõnede kasutamise. Režiimi lubab eraldi lipp "force_inline" ja see muudab dm-crypt lihtsa puhverserveri kujul, mis krüpteerib ja dekrüpteerib sissetulevad päringud. Koostoime Crypto API-ga on optimeeritud, valides selgesõnaliselt krüpteerimisalgoritmid, mis töötavad sünkroonrežiimis ja ei kasuta päringujärjekordi. Krüpto API-ga sünkroonseks töötamiseks oli olemas moodul, mis võimaldab kasutada kiirendamiseks FPU/AES-NI ja edastab otse krüpteerimis- ja dekrüpteerimistaotlused.
Selle tulemusena oli RAM-ketta testimisel võimalik dm-crypt jõudlust enam kui kahekordistada – jõudlus kasvas 294 MB/s (2 x 147 MB/s) 640 MB/s-ni, mis on väga lähedane tühja krüptimise jõudlus (696 MB / s).
Koormustestimisel reaalsetes serverites näitas uus implementatsioon jõudlust, mis oli väga lähedane krüpteerimata konfiguratsioonile, ning krüpteerimise lubamine Cloudflare'i vahemäluga serverites ei mõjutanud reageerimisaega. Cloudflare plaanib need parandused tulevikus põhiversiooni integreerida. Linux, kuid enne seda tuleb neid ümber töötada, kuna need on optimeeritud konkreetse töökoormuse jaoks ega hõlma kõiki rakendusvaldkondi, näiteks krüpteerimist väikese energiatarbega manussüsteemides.
Allikas: opennet.ru
