Как работает jemalloc? Каковы преимущества?

В Firefox 3 появился новый распределитель: jemalloc.

Я слышал в нескольких местах, что этот новый распределитель лучше. Лучшие результаты Google не дают никакой дополнительной информации, хотя я заинтересован в том, как именно она работает.

Ответ 1

jemalloc впервые появился для FreeBSD, детищем одного "Джейсона Эванса", отсюда "je". Я бы высмеял его за то, что он был эгоистичным, если бы я ни разу не написал операционную систему под названием paxos: -)

Подробнее см. этот PDF. Это технический документ, в котором подробно описывается, как работают алгоритмы.

Основным преимуществом является масштабируемость в многопроцессорных и многопоточных системах, достигнутых, частично, с использованием нескольких арен (куски необработанной памяти, из которых сделаны выделения).

В однопоточных ситуациях нет реальной выгоды для нескольких арен, поэтому используется одна арена.

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

Это означает, что конфликт блокировок может быть уменьшен, поскольку, хотя несколько потоков могут вызывать malloc или free одновременно, они будут бороться только в том случае, если они разделяют одну и ту же арену. Две нити с разными аренами не будут влиять друг на друга.

Кроме того, jemalloc пытается оптимизировать локальность кэша, поскольку действие извлечения данных из ОЗУ происходит намного медленнее, чем использование данных, уже находящихся в кэшах ЦП (принципиально не отличается от разницы между быстрой выборкой из ОЗУ по сравнению с медленной выборкой с диска). С этой целью сначала он пытается минимизировать использование памяти, так как это скорее всего гарантирует, что весь рабочий набор приложения находится в кеше.

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

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

Ответ 3

Что касается преимуществ jemalloc, внесенных в mozilla, за http://blog.pavlov.net/2008/03/11/firefox-3-memory-usage/ (также первый результат google для mozilla + jemalloc):

[...] пришел к выводу, что jemalloc дал нам наименьшее количество фрагментации после работы в течение длительного периода времени. [...] Наши автоматизированные тесты в Windows Vista показали снижение использования памяти на 22%, когда мы включили jemalloc.

Ответ 4

Aerospike внедрил jemalloc в частный филиал в 2013 году. В 2014 году он был включен в Aerospike 3.3. Psi Mankoski только что написал о внедрении Aerospike, плюс, когда и как эффективно использовать jemalloc, для Высокая масштабируемость.

jemalloc действительно помог Aerospike использовать современные многопоточные многопроцессорные многоядерные компьютерные архитектуры. Существуют также очень важные возможности отладки, встроенные в jemalloc для управления аренами. Отладка позволила Psi быть в состоянии сказать, например, то, что было настоящей утечкой памяти, в сравнении с тем, что было результатом фрагментации памяти. Psi также обсуждает, как поток кэша и распределение по потокам обеспечивали улучшение производительности (скорости).