В чем разница между tcmalloc/jemalloc и пулом памяти
tcmalloc/jemalloc - улучшенные распределители памяти, и пул памяти также введен для лучшего распределения памяти. Так в чем же разница между ними и как их выбрать в моем приложении?
3 ответа
В этом блоге есть ссылки на подробное описание всех популярных malloc.
И эта статья цитирует одно критическое различие между tcmalloc
а также jemalloc
и советует, какой выбрать.
И эта статья полностью описывает алгоритм jemalloc
Резюме из этого документа
Tcmalloc
tcmalloc — это библиотека управления памятью, исходный код которой открыт для Google в качестве альтернативы glibc malloc. Он использовался в известном программном обеспечении, таком как Chrome и Safari. Согласно официальному отчету об испытаниях, ptmalloc требуется около 300 наносекунд для выполнения malloc и освобождения на машине P4 с частотой 2,8 ГГц (для небольших объектов). Версия TCMalloc выполняет ту же операцию примерно за 50 наносекунд.
- Распределение малых объектов
- tcmalloc выделяет локальный ThreadCache для каждого потока. Небольшая память выделяется из ThreadCache. Кроме того, есть центральная куча (CentralCache). Когда ThreadCache недостаточно, он получит место из CentralCache и поместит его в ThreadCache.
- Небольшие объекты (<=32 КБ) выделяются из ThreadCache, а большие объекты выделяются из CentralCache. Пространство, выделенное крупными объектами, выравнивается по страницам 4k, а несколько страниц также можно разрезать на несколько мелких объектов и разделить на ThreadCache.
- Управление выделением CentralCache
- Большие объекты (>32 КБ) сначала выравниваются по 4 КБ, а затем выделяются из CentralCache.
- Когда в связанном списке страниц наилучшего соответствия нет свободного места, пространство страницы всегда больше. Если все 256 связанных списков пройдены, выделение все равно не будет успешным. Используйте sbrk, mmap,/dev/mem для выделения из системы.
- Смежные страницы, управляемые tcmalloc PageHeap, называются span. Если span не выделен, span является элементом связанного списка в PageHeap.
- Перерабатывать
- Когда объект свободен, номер страницы вычисляется по адресному выравниванию, а затем через центральный массив находится соответствующий диапазон.
- Если это небольшой объект, span сообщит нам класс его размера, а затем вставит объект в ThreadCache текущего потока. Если в это время ThreadCache превысит значение бюджета (по умолчанию 2 МБ), механизм сборки мусора будет использоваться для перемещения неиспользуемых объектов из ThreadCache в центральные списки свободных объектов CentralCache.
- Если это большой объект, span сообщит нам диапазон номеров страниц, на которых объект заблокирован. Предполагая, что этот диапазон равен [p,q], сначала найдите диапазон, в котором расположены страницы p-1 и q+1. Если эти соседние диапазоны также свободны, объедините их с диапазоном, в котором находится [p, q], а затем переработайте этот диапазон в PageHeap.
- Центральные свободные списки CentralCache аналогичны FreeListThreadCache, но добавляют структуру первого уровня.
- Распределение малых объектов
Джемаллок
jemalloc был запущен facebook и впервые реализован libc malloc от freebsd. В настоящее время он широко используется в различных компонентах серверов firefox и facebook.
- управление памятью
- Подобно tcmalloc, каждый поток также использует локальный кеш потока без блокировки, если он меньше 32 КБ.
- Jemalloc использует следующие классы размеров для 64-битных систем: Small: [8], [16, 32, 48, …, 128], [192, 256, 320, …, 512], [768, 1024, 1280, …, 3840] Большой: [4 КиБ, 8 КиБ, 12 КиБ, …, 4072 КиБ] Огромный: [4 МиБ, 8 МиБ, 12 МиБ, …]
- Маленьким/большим объектам требуется постоянное время для поиска метаданных, а поиск огромных объектов осуществляется за логарифмическое время по глобальному красно-черному дереву.
- Виртуальная память логически разделена на куски (по умолчанию 4 МБ, 1024 страницы по 4 КБ), и поток приложения выделяет арены на первом malloc с помощью алгоритма циклического перебора. Каждая арена независима друг от друга и поддерживает свои собственные фрагменты. Чанк разрезает страницы на маленькие/большие объекты. Память функции free() всегда возвращается на место, которому она принадлежит, независимо от того, какой поток вызывает функцию free().
- управление памятью
Сравнивать
- Самым большим преимуществом jemalloc является его мощная возможность многоядерного/многопоточного распределения. Чем больше ядер у ЦП, тем больше программных потоков и тем быстрее выделяет jemalloc
- При выделении большого количества небольшой памяти места для записи метаданных jemalloc будет немного больше, чем tcmalloc.
- При выделении больших выделений памяти также будет меньше фрагментации памяти, чем у tcmalloc.
- Jemalloc более точно классифицирует гранулярность распределения памяти, что приводит к меньшему конфликту блокировок, чем ptmalloc.
Это зависит от требований вашей программы. Если ваша программа имеет больше распределений динамической памяти, вам нужно выбрать распределитель памяти из доступных распределителей, который обеспечит наиболее оптимальную производительность вашей программы.
Для хорошего управления памятью необходимо как минимум соответствовать следующим требованиям:
- Убедитесь, что в вашей системе достаточно памяти для обработки данных.
- Вы должны выделить из доступной памяти?
- Возврат использованной памяти / освобожденной памяти в пул (программу или операционную систему)
Способность хорошего менеджера памяти можно проверить на основе (как минимум) его эффективности в извлечении / распределении и возврате / передаче памяти. (Есть еще много условий, таких как расположение кеша, управление накладными расходами, среды виртуальных машин, небольшие или большие среды, многопоточная среда и т. Д.)
Что касается tcmalloc и jemalloc, есть много людей, которые проводили сравнения. Применительно к одному из сравнений:
tcmalloc превосходит все остальные с точки зрения количества циклов процессора на выделение, если количество потоков меньше. jemalloc очень близок к tcmalloc, но лучше, чем ptmalloc (реализация std glibc).
С точки зрения накладных расходов на память лучше всего подходит jemalloc, за ним следует ptmalloc, за которым следует tcmalloc.
В целом можно сказать, что jemalloc превосходит другие. Вы также можете узнать больше о jemalloc здесь:
Я только что цитировал результаты тестов, проведенных и опубликованных другими людьми, и не тестировал их сам. Я надеюсь, что это может стать для вас хорошей отправной точкой и использовать ее для тестирования и выбора наиболее оптимального для вашего приложения.