METABYTE
Inapoi la articole

mimalloc: Microsoft reinventează roata, dar de data asta e pătrată și foarte rapidă

Microsoft a lansat mimalloc — un alocator de memorie rapid și scalabil, care poate accelera codul fără dansuri cu tamburina.

15 mai 20263 min de citit
mimalloc: Microsoft reinventează roata, dar de data asta e pătrată și foarte rapidă

Echipa Microsoft Research a lansat un nou alocator de memorie numit mimalloc, care promite să fie rapid, scalabil și gata pentru sarcinile moderne. Dacă credeai că malloc și prietenii săi sunt deja suficient de buni, pregătește-te să fii surprins — sau să ridici din sprâncene cu scepticism, ca de obicei.

Ce este și cu ce se mănâncă?

mimalloc (prescurtare de la 'microsoft memory allocator' — da, le plac numele lungi) se poziționează ca înlocuitor pentru alocatorii standard în aplicațiile multi-thread. Utilizează tehnica 'free list sharding' (împărțirea listelor de memorie liberă) și optimizări speciale pentru sistemele NUMA. Pe scurt: dacă programul tău alocă și eliberează frecvent memorie în diferite fire de execuție, mimalloc poate reduce overhead-ul și îmbunătăți performanța.

Dezvoltatorii susțin că mimalloc depășește alocatori precum jemalloc, tcmalloc și chiar standardul glibc malloc, în special în scenarii cu acces concurent ridicat. Au testat pe aplicații reale (Redis, MariaDB, Apache) și au obținut o creștere a performanței între 5% și 30%, în funcție de sarcină. Sună a marketing? Poate. Dar au benchmark-uri, așa că nu ne grăbim cu concluziile.

Cum funcționează (pe scurt pentru cei care nu vor să citească 50 de pagini de documentație)

  • Free list sharding: în loc de o singură listă globală de blocuri libere, mimalloc folosește mai multe liste locale pentru fiecare fir, reducând contention-ul.
  • Unire leneșă: blocurile de memorie nu sunt returnate imediat în pool-ul global, ci rămân în cache-urile locale, accelerând realocarea.
  • NUMA-aware: alocatorul ține cont de topologia memoriei, încercând să aloce memorie pe același nod unde rulează firul.

Toate acestea amintesc de abordările din jemalloc, dar cu unele îmbunătățiri — în special, mimalloc folosește gestionare 'page-based' și are un footprint mic.

Merită să treci?

Dacă aplicația ta suferă de probleme de performanță a memoriei (de exemplu, un procent mare de timp în malloc/free), merită să încerci. mimalloc este deja folosit în unele proiecte, inclusiv .NET Core și Azure. Și da, este open source (licența MIT), așa că poți înlocui alocatorul standard prin LD_PRELOAD sau legare statică. Dar amintește-ți: diavolul este în detalii, și nu toate modelele de lucru cu memoria sunt optimizate la fel.

Comentariul studioului METABYTE: Și nouă ne place să urmărim performanța, dar de obicei începem cu profilarea, nu cu înlocuirea alocatorului. Totuși, mimalloc este un instrument excelent pentru cei care vor să stoarcă ultimele cadre pe secundă din motorul lor de joc sau serverul cu încărcare mare. Important este să testați pe date reale, nu doar pe benchmark-uri sintetice, altfel riscați să obțineți 'accelerare' în teste și încetinire în producție.

URMATORUL PAS

Ti-a placut abordarea?

Aplicam aceleasi principii in proiectele clientilor: AI, automatizari, produse care nu se sting dupa lansare.