The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Доступна библиотека управления памятью jemalloc 5.3.1

14.04.2026 11:33 (MSK)

Спустя 4 года после публикации прошлого обновления доступен релиз библиотеки управления памятью jemalloc 5.3.1, предлагающей альтернативную реализацию функций malloc, оптимизированную для снижения фрагментации и работы на многопроцессорных системах. Для решения проблем с блокировками на многоядерных системах в jemalloc для каждого ядра CPU используется своя изолированная область распределения памяти, что позволяет добиться линейной масштабируемости при росте числа потоков.

В июне 2025 года автор проекта прекратил сопровождение и перевёл репозиторий jemalloc в архивный режим, но месяц назад разработку возобновила компания Meta, применяющая jemalloc в своей инфраструктуре. Изначально библиотека была разработана для FreeBSD и используется в данной ОС по умолчанию с 2005 года. Код библиотеки написан на Си и распространяется под лицензией BSD.

Среди изменений:

  • Реализована функция pvalloc, которая может оказаться полезной при замене аллокатора памяти libc.
  • В отладочных сборках включён режим обнаружения двойного вызова функции free(). Для настройки размера стека, в рамках которого выполняется сканирование, добавлен параметр debug_double_free_max_scan.
  • Добавлена сборочная опция "--enable-pageid" для выставления тегов при маппинге памяти, используя prctl с флагом PR_SET_VMA. После включения маппинг можно отслеживать через /proc/<pid>/maps.
  • Добавлен параметр "prof_bt_max", позволяющая выставить максимальную глубину стека для профилирования.
  • Добавлена сборочная опция "--enable-force-getenv" для использования в коде обычной функции getenv() вместо защищённой secure_getenv().
  • Добавлена сборочная опция "--disable-dss" для отключения использования функции sbrk().
  • Добавлен параметр "tcache_ncached_max" для ограничения числа элементов в кэше потоков.
  • Добавлен параметр "calloc_madvise_threshold" для настройки использования механизма ядра madvise или функции memset для обнуления памяти, выделяемой через функцию calloc.
  • Добавлена сборочная опция "--disable-user-config" для отключения загрузки настроек из файла /etc/malloc.conf или переменной окружения MALLOC_CONF.
  • Добавлен параметр "process_madvise_max_batch" для ограничения числа блоков памяти для каждой batch-операции madvise.
  • Добавлен параметр "disable_large_size_classes" для отключения нового алгоритма расчёта размера выделяемой памяти, снижающего накладные расходы при выделении блоков, размером более 4 страниц памяти.
  • В утилиту mallctl добавлены опции: opt.prof_bt_max, arena.<i>.name, thread.tcache.max, thread.tcache.ncached_max.write, thread.tcache.ncached_max.read_sizeclass, arenas.hugepage и approximate_stats.active.


  1. Главная ссылка к новости (https://github.com/jemalloc/je...)
  2. OpenNews: Facebook возобновил разработку библиотеки управления памятью jemalloc
  3. OpenNews: Прекращена разработка библиотеки управления памятью jemalloc
  4. OpenNews: Google опубликовал новый вариант системы распределения памяти TCMalloc
  5. OpenNews: Miсrosoft открыл код системы распределения памяти mimalloc
  6. OpenNews: Менеджер распределения памяти jemalloc выпущен в виде отдельной библиотеки
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/65201-jemalloc
Ключевые слова: jemalloc, malloc
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (36) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Жироватт (ok), 15:06, 14/04/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Я бы даже не стал шутить про "отставить разврат - закопать стюардессу! отставить разврат - откопать стюардессу", но реально, в чем профит использовать конкретно этот аллокатор?
     
     
  • 2.2, Аноним (2), 15:34, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    для каждого ядра CPU используется своя изолированная область распределения памяти, что позволяет добиться линейной масштабируемости при росте числа потоков
     
     
  • 3.4, Жироватт (ok), 15:50, 14/04/2026 Скрыто ботом-модератором     [к модератору]
  • –1 +/
     
  • 3.5, Аноним (5), 16:37, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • –2 +/
    >своя изолированная область

    А как же общий буфер, общее адресное пространство процесса?

     
     
  • 4.8, Аноним (8), 16:46, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Общее адресное пространство никуда не делось, но в многопоточной среде эффективнее выделять из thread-local арен.
     
     
  • 5.10, Аноним (5), 17:01, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    >thread-local

    это понятно. Значит ли это что есть изолированная общая область памяти в дополнение к поточным?

     
     
  • 6.18, Аноним (18), 20:18, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Нет.

    Адресное пространство общее. Но мы внутри процесса принимаем конвенцию, что для каждого потока есть выделенная область памяти, из которой он аллоцирует. Ядро и MMU об этом "ничего не знают", адресное пространство общее, просто процесс, использующий данный аллокатор, так работает со своей памятью.

     
  • 6.19, Аноним (8), 20:26, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Там нет и не может быть ничего "изолированного". Память выделенная на thread-local арене доступна всем потокам, и освобождается из любого, просто при выделении мы меньше ходим в shared state и ждём на локах.

    Есть ли не привязанная к потокам арена - скорее всего да: для достаточно больших аллокаций и арены будут большие, а держать большие арены для каждого потока расточительно. Наверняка есть общая арена для больших аллокаций, она же раздаёт память в попоточные арены.

     
     
  • 7.25, Аноним (5), 23:27, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Спасибо. Вроде понятно. Понятое изложил ниже.
     
  • 6.22, Аноним83 (?), 20:56, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Нет.

    Значит что за каждым потоком закреплён "пул памяти" откуда именно этот поток получает куски памяти при каждом malloc()/realloc()/calloc().
    Когда другой поток для такой памяти делает free() - то это в звисимости от опций и реализации может быть какой то lockless механизм который кусок памяти помещает в очередь на освобождение в пул того потока из которого но выделено. И оно там висит пока поток не потрогает апи аллокатора.
    "пул памяти" - нечто виртуальное, можешь считать что это некоторая структура, вероятно со списками и массивами. Типа как экземпляр класса на крестах.

    В общем вариантов много как и что можно с этим делать чтобы потоки друг другу не мешались выделяя/свобождая память.

     
     
  • 7.24, Аноним (5), 23:26, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Понятно. При создание потока ему передается указатель на структуру, через которую управляющий jemalloc выделил ему память (вроде this). Для прозрачности его теневым образом можно передавать функциям *alloc из этого потока. Владельцем структуры, отвечающей за память потока, остается поток "родивший" этот поток. Использующий структуру может только пометить кусок на удаление (или автоматически помечается на выходе). В асме я встречал инструкции работающие с сегментными регистрами на x64 (это и защищает приватную память потока).
    Для общей памяти должны быть, тогда, "статические" функции аллоцирования.  
     
     
  • 8.26, Аноним (8), 23:28, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Нет никакой приватной памяти потока ... текст свёрнут, показать
     
     
  • 9.28, Аноним (5), 23:36, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    В асме встречаются обращения к ячейкам памяти через сегментный регистр на x64 И... текст свёрнут, показать
     
  • 9.29, Аноним (5), 23:39, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Я дам этому потоку смещенную базу и он будет наращивать потребление относительно... текст свёрнут, показать
     
  • 9.30, Аноним (5), 23:44, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Возможно Вы мыслите в абстракциях Я стараюсь мыслить в асм реализации ... текст свёрнут, показать
     
     
  • 10.39, Аноним (39), 01:19, 15/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Очень плохо, потому что x86 не единственная и уже даже не основная архитектура ... текст свёрнут, показать
     
  • 8.27, Аноним (5), 23:30, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Тогда суть в том что упор делается на поточный пул и разнобой общей памяти от по... текст свёрнут, показать
     
  • 8.32, Аноним83 (?), 00:19, 15/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Как то так так Есть TLS Thread Local Storage Это как бы массив, когда ты туда... текст свёрнут, показать
     
     
  • 9.35, Аноним (5), 00:36, 15/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    pthread_key_create - регистрируем ID1 первого потока у диспетчера pthread_set... текст свёрнут, показать
     
     
  • 10.37, Аноним83 (?), 01:05, 15/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Нет static pthread_key_t tp_tls_key_tpt static int tp_tls_key_tpt_error EAGA... текст свёрнут, показать
     
  • 7.31, Аноним (5), 00:01, 15/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    >за каждым потоком закреплён "пул памяти" откуда именно этот поток получает куски памяти при каждом malloc()/realloc()/calloc().

    malloc(xxx) вызывается на самом деле malloc(this_thread,xxx). В дальнейшем менеджер предложит потоку указатель смещенный относительно первого на размер предыдущего (ххх). Легко освободить разом всё память, предоставленную потоку и освободить большой кусок памяти а не "черезполосицу" с другими потоками.

     
     
  • 8.33, Аноним83 (?), 00:25, 15/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Может в какой то реализации так и есть, я таких не видел да и смысла не понимаю ... текст свёрнут, показать
     
     
  • 9.36, Аноним (5), 00:41, 15/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Идея - диспетчер узнает поток - прилепливает к выданному этому потоку - выдае... текст свёрнут, показать
     
     
  • 10.38, Аноним83 (?), 01:05, 15/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Удачи в реализации ... текст свёрнут, показать
     
  • 3.6, Аноним (5), 16:38, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Меньшая фрагментация за счет изолированных областей? А внутри области такая же дефрагментация?
     
     
  • 4.9, Аноним (8), 16:46, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    > Меньшая фрагментация за счет изолированных областей?

    Не фрагментация, а lock contention.

     
     
  • 5.11, Аноним (5), 17:03, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Прожорливый поток может залочить себе всю память?
     
     
  • 6.17, Аноним (8), 20:16, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Нет, потоки будут бороться за доступ к shared структурам аллокатора.
     
  • 2.7, Аноним (8), 16:44, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > в чем профит использовать конкретно этот аллокатор?

    Он один из самых эффективных.

     
  • 2.14, Аноним (14), 17:50, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    > в чем профит использовать конкретно этот аллокатор?
    > месяц назад разработку возобновила компания Meta, применяющая jemalloc в своей инфраструктуре

    Это не тут спрашивать надо, это на https://engineering.fb.com спрашивать надо.

     
  • 2.23, Noname (??), 21:10, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Naprimer dlya mysql/mariadb
    https://www.mydbops.com/blog/troubleshooting-mariadb-memory-leaks
     

  • 1.12, Аноним (12), 17:07, 14/04/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Кстати, раз речь пошла о аллокаторах, что использовать вместе с musl? Сабж или в интернете ещё другие нахваливают?
     
     
  • 2.15, Аноним (15), 17:51, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > вместе с musl

    * Вместо musl.

    Glibc.

     
  • 2.16, Аноним (16), 18:38, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • –1 +/
    странный вопрос, есть "стандарт", который по сути есть компромис среди множества архитектур и альтернатив аля glibc, то есть работает не идеально, но приемлемо, чего достаточно для большенства задач, но если вам не достаточно, то надо отталкиваться от архитектуры и особенностей проекта, можно попробовать для начала и сабж, но musl скорее про эндебер и там будет скорее хуже, а значит писать свое под свою задачу, хотя, если проект один, проще это решать на уровне проекта чтобы не плодить сущности. Резервировать кусок памяти и в нем уже чтото делать, создавать обьекты и удалять не возвращая память системе, тем самым избавившись от всяких дабл-фри бай дизайн, это сложный путь, но один раз его пройдя можно попутно решить все "проблемы", в том числе с выходом за границы буфера, юз-афтер-фри, и прочие за которые хейтят сечас си, и восхваляют раст, в котором это гвоздями прибито, и никаких шагов влево вправо не дозволяется.
     
     
  • 3.20, Аноним (8), 20:42, 14/04/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Резервировать кусок памяти и в нем уже чтото делать, создавать обьекты и удалять не возвращая память системе, тем самым избавившись от всяких дабл-фри бай дизайн, это сложный путь

    А чего сложного? Сделать no-op free() совсем несложно.

    > но один раз его пройдя можно попутно решить все "проблемы"

    Как же никто раньше не догадался, можно же решить все проблемы, всего-то нужно не возвращать память системе.

    > в том числе с выходом за границы буфера

    Double free и use after free, допустим, действительно решим, отказавшись от free. Но интересно, как это поможет от выхода за границы буфера?

    > и восхваляют раст, в котором это гвоздями прибито, и никаких шагов влево вправо не дозволяется.

    В rust, который ты, конечно, в глаза не видел, ничего гвоздями не прибито. Там есть и упомянутые bump аллокаторы, которые можно использовать как глобально так и по месту, и контролируемую утечку памяти можно устроить даже без unsafe, превратив любое динамически выделенное значение в &'static, а машинерии для жонглирования слайсами там столько что скоро его за перегруженность как плюсы будут ругать. Но DF/UAF на ровном месте, действительно, не сделать. Расскажи, почему это плохо.

     

  • 1.21, Аноним83 (?), 20:52, 14/04/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    --disable-dss - это уже давным давно было.
    В остальном больше гонева было что оно там самосгнило без свежих коммитов.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2026 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру