Jemalloc, mmap и общая память?

Может ли jemalloc изменить выделение из разделяемой памяти? Функция FreeBSD dallocx() подразумевает, что вы можете предоставить указатель на использование для выделения, но я не вижу очевидного способа сказать jemalloc ограничить все распределения из этой памяти (а также не устанавливать размер и т.д.).

Функция dallocx() заставляет память, на которую ссылается ptr, быть доступной для будущих распределений.

Если нет, каков уровень усилий для такой функции? Я изо всех сил пытаюсь найти схему готового размещения, которая может выделяться из раздела разделяемой памяти, который я предоставил.

Аналогично, может ли jemalloc быть настроен на выделение из заблокированной области памяти для предотвращения обмена?

Не стесняйтесь указывать мне соответствующие разделы кода, которые требуют изменения и предоставляют любые идеи или предложения.

Идея, которую я изучаю, - это то, что вы можете создавать arenas/heaps для выделения в потоковой среде, поскольку jemalloc делает для минимизации конкуренции, концепция кажется масштабируемой для распределения областей общей памяти в многопроцессорной среде, то есть я создайте N областей разделяемой памяти с помощью mmap(), и я хочу использовать возможности jemalloc (или любой схемы распределения) для максимально эффективного распределения с минимальным конфликтом потоков из одной из этих разделяемых областей, то есть если потоки/процессы не имеют доступа к тем же общим областям и аренам, вероятность конкуренции минимальна, а скорость операции malloc увеличивается.

Это отличается от глобального распределения пула с помощью malloc() API, поскольку обычно для этого требуется глобальная блокировка, эффективно сериализирующая пространство пользователя. Я бы хотел этого избежать.

edit 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, которые были бы полезны для этой цели; они позволяют вам указывать per-arena, специфичные для приложения куски. В частности, пространство имен arena.<i>.chunk_hooks и arenas.extend mallctl. Существует интеграционный тест, который демонстрирует, как использовать этот API.

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

Поскольку jemalloc уже использует ряд методов для сокращения конкуренции, вы можете получить аналогичное поведение в среде с высокой степенью потоковой передачи, создав дополнительные арены с помощью opt.narenas. Это уменьшило бы конкуренцию, так как меньшее количество потоков было бы сопоставлено с ареной, но так как потоки эффективно округлены, возможно, вы все равно попадете в горячие точки.

Чтобы обойти это, вы можете сделать свой подсчет голосов и обнаружение точек доступа и просто использовать thread.arena mallctl интерфейс для переключите нить на арену с меньшим количеством соперников.