PDA

Просмотр полной версии : Google опубликовал новый вариант системы распределения памяти TCMalloc


Suicide
14.02.2020, 20:04
Компания Google представила (https://abseil.io/blog/20200212-tcmalloc) новый вариант системы распределения памяти TCMalloc (https://google.github.io/tcmalloc/), которая используется во многих внутренних проектах Google. Код TCMalloc написан на С++ и распространяется (https://github.com/google/tcmalloc) под лицензией Apache. Для работы требуется наличие компилятора с поддержкой C++17 для языка C++, и C11 для языка Си (gcc 9.2+ или clang 9.0+). Из операционных систем поддерживается (https://github.com/google/tcmalloc/blob/master/docs/platforms.md) только Linux (x86, PPC).

Примечательно, что с 2005 года существует ещё один вариант tcmalloc, который поставлялся (https://github.com/gperftools/gperftools/blob/master/src/tcmalloc.cc) в составе пакета gperftools (https://github.com/gperftools/gperftools/) (Google Performance Tools). Это два разных (https://github.com/gperftools/gperftools/issues/1169#issuecomment-585321782) проекта, имеющих общие корни. Новый TCMalloc является скорее попыткой открыть код актуальных внутренних наработок Google, но он пока не нацелен на предоставление стабильного ABI и поддержку широкого спектра операционных систем. Сопровождение старого tcmalloc из gperftools будет продолжено, но новые возможности, такие как привязка кэша к CPU, в него переносить не планируется.

TCMalloc включает реализацию Си-функции malloc() и С++ оператора "new", оптимизированных для достижения высокой производительности и применения в многопоточных приложениях. TCMalloc также предоставляет возможности интроспекции и профилирования, позволяющие приложению получить подробные сведения об использовании памяти в куче. В коде применяются оптимизации на основе современных возможностей языка C++, таких как оператор delete с указанием размера (https://isocpp.org/files/papers/n3778.html) из C++14 и выделение памяти с выравниванием (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0035r1.html) из C++17.

TCMalloc состоит (https://google.github.io/tcmalloc/design) из трёх компонентов: фронтэнда с кэшем для быстрого выделения и освобождения памяти, прослойки для наполнения кэша фронтэнда и бэкенда, выполняющего такие операции, как получение памяти от операционной системы, управления большими кусками неиспользованной памяти и возвращение лишней памяти обратно в ОС. Кэш избавлен от блокировок и работает в привязке к ядрам CPU, но откатывается на модель кэширования в привязке к потокам в случае отсутствия необходимой функциональности в ядре ОС (привязка кэша к CPU работает только в свежих ядрах Linux). Бэкенд поддерживает работу как с обычными страницами памяти, так и со страницами увеличенного размера (hugepage).

https://www.opennet.ru/opennews/pics_base/0_1581618690.png (https://google.github.io/tcmalloc/images/tcmalloc_internals.png)

Основные особенности TCMalloc:


Быстрое выделение и освобождение памяти с использованием кэширования. Большинство операций выделения памяти не требуют блокировки, что обеспечивает хорошую масштабируемость для многопоточных приложений с высоким параллелизмом выполнения работ;

Гибкое использование памяти, позволяющее повторно использовать освобождённые области памяти для объектов различного размера или возвращать память операционной системе;

Низкие накладные расходы на каждый объект за счёт выделения страниц объектов одинакового размера и эффективного представления мелких объектов. Поддерживаются логические страницы, размером 4KiB, 8KiB, 32KiB и 256KiB. Например, при запросе блоков в 512 байт памяти, будет выделена целая страница 4KiB под 512-байтовые объекты, в которой сможет уместиться 8 таких объектов;

Возможна тонкая настройка через определения размера кэша и параметров интенсивности возвращения памяти в ОС;

Предоставление детальной информации для анализа использования памяти приложением.
13.02.2020

http://www.opennet.ru/opennews/art.shtml?num=52364​