Компания Google нова версия на системата за разпределение на памет , която се използва в много вътрешни проекти на Google. Кодът на TCMalloc е написан на C++ и под лицензия Apache. За работа е необходим компилатор, който поддържа C++17 за C++ и C11 за C (gcc 9.2+ или clang 9.0+). От операционните системи само Linux (x86, PPC).
Важно е да се отбележи, че от 2005 г. съществува още една версия на tcmalloc, която като част от пакета (Google Performance Tools). Това са два проекта с общи корени. Новият TCMalloc е по-скоро опит да се отвори кодът на актуалните вътрешни разработки на Google, но той все още не е насочен към предоставяне на стабилен ABI и поддръжка на широк спектър от операционни системи. Поддръжката на стария tcmalloc от gperftools ще продължи, но новите функции, като свързването на кеша с CPU, няма да бъдат пренесени.
TCMalloc включва реализация на C функцията malloc() и C++ оператора «new», оптимизирани за постигане на висока производителност и приложение в многопоточни приложения. TCMalloc предоставя и възможности за интроспекция и профилиране, позволяващи на приложението да получи подробна информация за използването на паметта в купчината. В кода са приложени оптимизации на базата на съвременните възможности на C++, като
оператора delete с от C++14 и алокация на памет с от C++17.
TCMalloc от три компонента: преден край с кеш за бързо разпределение и освобождаване на памет, междинен слой за запълване на кеша на предния край и бекенд, който извършва операции като получаване на памет от операционната система, управление на големи парчета неизползвана памет и връщане на излишната памет обратно в ОС. Кешът е освободен от блокировки и работи с привързване към ядрото на CPU, но се откача на модел на кеширане с привързване към нишки в случай на отсъствие на необходимата функционалност в ядрото на ОС (привързването на кеша към CPU работи само в нови ядра на Linux). Бекендът поддържа работа както с обикновени страници памет, така и със страници с увеличен размер (hugepage).
Основни характеристики на TCMalloc:
- Бързо задействане и освобождаване на паметта чрез кеширане. Повечето операции по заделяне на памет не изискват блокиране, което осигурява добра скалируемост за многопоточни приложения с висока паралелизираност;
- Гъвкаво използване на паметта, позволяващо повторно използване на освободените области за обекти с различен размер или връщане на паметта на операционната система;
- Ниски разходи на обект благодарение на заделянето на страници с еднакъв размер и ефективно представяне на малки обекти. Поддържат се логически страници с размери 4KiB, 8KiB, 32KiB и 256KiB. Например, при заявка за блокове от 512 байта памет, ще бъде заделена цяла страница от 4KiB за 512-байтови обекти, в която ще могат да се поберат 8 такива обекта;
- Възможна е прецизна настройка чрез определения на размера на кеша и параметри за интензивността на връщане на памет в ОС;
- Предоставяне на подробна информация за анализ на използването на паметта от приложението.
Източник: opennet.ru
