jemalloc, mmap и общая память?
Можно ли изменить jemalloc для выделения из общей памяти? Функция FreeBSD dallocx()
подразумевает, что вы можете предоставить указатель для использования при распределении, но я не вижу очевидного способа сказать jemalloc
ограничить все выделения из этой памяти (ни установить размер, и т. д.).
dallocx()
функция вызывает память, на которую ссылаетсяptr
быть доступным для будущих ассигнований.
Если нет, каков уровень усилий для такой функции? Я изо всех сил пытаюсь найти готовую схему распределения, которая может выделить из раздела общей памяти, который я предоставил.
Точно так же, может jemalloc
быть настроен для выделения из заблокированной области памяти, чтобы предотвратить подкачку?
Не стесняйтесь указывать мне на соответствующие разделы кода, которые требуют модификации, и предоставлять любые идеи или предложения.
Идея, которую я исследую, заключается в том, что вы можете создавать арены / кучи для размещения в многопоточной среде, так как jemalloc
позволяет минимизировать конкуренцию, концепция кажется масштабируемой для выделения областей разделяемой памяти в многопроцессорной среде, т.е. я создаю N областей разделяемой памяти, используя mmap()
и я хочу использовать силу jemalloc
(или любая схема распределения) для максимально эффективного распределения с минимальным конфликтом потоков из одной из этих общих областей, т. е. если потоки / процессы не обращаются к одним и тем же общим областям и аренам, вероятность конфликта минимальна, а скорость malloc
операция увеличена.
Это отличается от глобального пула, выделенного malloc()
API, поскольку обычно они требуют глобальной блокировки, эффективно сериализующей пространство пользователя. Я хотел бы избежать этого.
редактировать 2:
В идеале API, как это:
// init the alloc context to two shmem pools
ctx1 = alloc_init(shm_region1_ptr);
ctx2 = alloc_init(shm_region2_ptr);
(... bunch of code determines pool 2 should be used, based on some method
of pool selection which can minimize possibility of lock contention
with other processes allocating shmem buffers)
// allocate from pool2
ptr = malloc(ctx2, size)
1 ответ
Да. Но это было не так, когда вы задали вопрос.
Jemalloc 4 (выпущен в августе 2015 года) имеет пару mallctl
пространства имен, которые были бы полезны для этой цели; они позволяют вам указывать для каждой арены специфичные для приложения хуки распределения чанков. В частности, arena.<i>.chunk_hooks
пространство имен и arenas.extend
mallctl
варианты полезны. Существует интеграционный тест, который демонстрирует, как использовать этот API.
Что касается логического обоснования, я ожидаю, что эффективные накладные расходы на "обмен сообщениями", необходимые для понимания того, где находится конфликт в каком-либо конкретном сегменте памяти, будут аналогичны накладным расходам только на состязание, так как вы собираетесь перейти на состязание в строке кэша, чтобы обновить значение "состязания" конкретной арены.
Поскольку jemalloc уже использует ряд методов для уменьшения конкуренции, вы можете получить аналогичное поведение в многопоточной среде, создав дополнительные арены с opt.narenas
, Это уменьшит конкуренцию, так как на арене будет отображаться меньше потоков, но поскольку потоки эффективно циклически перерабатываются, возможно, вы все равно попадете в горячие точки.
Чтобы обойти это, вы можете сделать подсчет конфликтов и обнаружение горячих точек, и просто использовать thread.arena
mallctl
интерфейс для переключения потока на арену с меньшим количеством конфликтов.