Společnost Google nová verze systému přidělování paměti , která se používá v mnoha interních projektech Google. Kód TCMalloc je napsán v C++ a pod licencí Apache. Pro provoz je nutné mít kompilátor s podporou C++17 pro jazyk C++ a C11 pro jazyk C (gcc 9.2+ nebo clang 9.0+). Z operačních systémů pouze Linux (x86, PPC).
Je zajímavé, že od roku 2005 existuje ještě jedna varianta tcmalloc, která je součástí balíčku (Google Performance Tools). Tyto dva projekty mají společné kořeny. Nový TCMalloc je spíše pokusem otevřít kód aktuálních interních prací Googlu, ale zatím není zaměřen na poskytování stabilního ABI a podporu široké škály operačních systémů. Údržba starého tcmalloc z gperftools bude pokračovat, ale nové funkce, jako je přiřazení cache k CPU, do něj přenášet neplánujeme.
TCMalloc zahrnuje implementaci funkce malloc() v C a operátoru „new“ v C++, optimalizovaných pro dosažení vysokého výkonu a použití v vícero procesorových aplikacích. TCMalloc také poskytuje možnosti introspekce a profilování, které aplikaci umožňují získat podrobné informace o využívání paměti v haldě. V kódu se používají optimalizace založené na moderních vlastnostech jazyka C++, jako jsou
operátor delete s z C++14 a přidělování paměti s z C++17.
TCMalloc sestává ze tří komponent: frontend s cache pro rychlé přidělování a uvolňování paměti, mezivrstvy pro naplnění front-endové cache a backendu, který provádí operace jako získání paměti od operačního systému, řízení velkých částí nevyužité paměti a vracení nadbytečné paměti zpět do OS. Cache je zbavena zámků a pracuje v vazbě na jader CPU, ale přechází na model cachování v vazbě na vlákna, pokud je v jádře OS nedostatečná funkcionalita (přiřazení cache k CPU funguje pouze v nových jádrech Linuxu). Backend podporuje práci jak s běžnými stránkami paměti, tak s stránkami zvýšené velikosti (hugepage).
Hlavní vlastnosti TCMalloc:
- Rychlá alokace a uvolnění paměti pomocí cachingu. Většina operací alokace paměti nevyžaduje zamykání, což zajišťuje dobrou škálovatelnost pro vícetržní aplikace s vysokým paralelismem zpracování úloh.
- Flexibilní využití paměti, které umožňuje opětovné použití uvolněných oblastí paměti pro objekty různé velikosti nebo vracení paměti operačnímu systému.
- Nízké režijní náklady na každý objekt díky alokaci stránek objektů stejné velikosti a efektivnímu ztvárnění malých objektů. Podporovány jsou logické stránky o velikosti 4KiB, 8KiB, 32KiB a 256KiB. Například při žádosti o bloky o velikosti 512 bytů paměti bude alokována celá stránka 4KiB pro 512-úbytek objekty, do níž se vejde 8 takových objektů.
- Možné jemné ladění prostřednictvím definice velikosti cache a parametrů intenzity vracení paměti do OS.
- Poskytování podrobných informací pro analýzu využití paměti aplikací.
Zdroj: opennet.ru
