Puszta szoftveres optimalizálással 100 terabájtnyi memóriát szabadított fel globális szerverhálózatán a Cloudflare. A népszerű 1.1.1.1 DNS-szolgáltatás mögött álló infrastruktúra frissítésével egyetlen fizikai memóriamodul hozzáadása vagy cseréje nélkül értek el látványos megtakarítást.
A hálózati szolgáltató Big Pineapple néven ismert DNS-architektúrája nem csupán az 1.1.1.1 lakossági feloldót szolgálja ki, hanem a vállalati Gateway DNS és a DNS Firewall rendszereket is. Egy adott pillanatban a hálózat több mint 250 milliárd gyorsítótárazott DNS-bejegyzést tárol a memóriában. Ilyen léptéknél a matematika drasztikussá válik: ha egyetlen bejegyzésnél mindössze egyetlen fölösleges bájt marad a memóriában, az a teljes szerverpark szintjén több mint 250 gigabájt elvesztegetett RAM-ot jelent.
Öt alacsony szintű Rust-optimalizálás a gyorsítótárban
A mérnökök nem új hardverek vásárlásával orvosolták a növekvő memóriaigényt, hanem a kód mélyére nyúltak. Sebastiaan Neuteboom, a vállalat rendszermérnöke részletesen ismertette azt az öt Rust nyelvű módosítást, amellyel az egyes gyorsítótár-elemek méretét 953 bájtról 420 bájtra csökkentették. Ez a bejegyzésenkénti 56 százalékos zsugorítás tette lehetővé a hálózati szintű memórianyereséget.
A finomhangolási folyamat során a fejlesztők átalakították a memóriában tárolt adatszerkezeteket:
- Változó méretű adatszerkezetek kiváltása: A dinamikusan növekvő Vec és String típusokat fix méretű Box szeletekre cserélték. Mivel a DNS-válaszok a gyorsítótárazás után már nem változnak, a foglalási kapacitás-adatok tárolása felesleges volt, így bejegyzésenként 64 bájtot takarítottak meg, ami önmagában 15 terabájt nyereséget hozott.
- Listák összevonása egyetlen pufferbe: A DNS-válaszok három különálló szekcióját korábban külön mutatókkal kezelték. Ezt egyetlen egybefüggő adatblokkra cserélték, amelyet kis méretű, 2 bájtos eltolási értékekkel indexelnek.
- Redundáns tartománynevek elhagyása: A válaszokban ismétlődő tulajdonosneveket nem tárolják le újra, hanem a kiolvasás során építik fel őket a lekérdezett domainnév alapján.
- Nyers hálózati formátum használata: A rekordadatokat hosszelőtaggal ellátott nyers bájtos formában tárolják. Korábban egy apró, 4 bájtos A rekord ugyanannyi memóriát foglalt, mint a jóval ritkább, 144 bájtos NAPTR rekord.
- Enum variánsok kiszervezése: A ritkán használt, nagy méretű enum típusváltozókat pointerek mögé szervezték, így az alapértelmezett objektumok mérete drasztikusan lecsökkent.
A RAM megtakarítása mellett a teljesítmény is nőtt
Az efféle rendszerszintű memóriakarcsúsítások során gyakori kompromisszum, hogy az adatszerkezetek tömörítése növeli a processzor terhelését és a válaszidőt. A Cloudflare esetében azonban a tömör adatszerkezet jobb CPU-gyorsítótár-kihasználást eredményezett, ami meglepő módon a sebesség növekedéséhez vezetett.
A mérések alapján a gyorsítótárba történő beszúrási sebesség 43 százalékkal nőtt, míg a lekérdezési késleltetés 19 százalékkal csökkent. A szerverek úgynevezett rezidens memóriahasználatának 99. percentilise 9,3 gigabájtról 5,3 gigabájtra esett vissza, ami 43 százalékos csökkenést jelent a csúcsterhelés során.
A felszabadított 100 terabájtnyi memóriakapacitás nagyjából 130 darab legújabb generációs, 768 gigabájt RAM-mal szerelt Cloudflare szerver teljes memóriájának felel meg. Egy olyan időszakban, amikor a szerveri DDR5 RAM-ok ára a piacon folyamatosan emelkedik, a tiszta szoftveres hatékonyságnövelés komoly pénzügyi előnyt biztosít a cég számára.