可以修改jemalloc以从共享内存分配吗? FreeBSD函数dallocx()
意味着你可以提供一个用于分配的指针,但是我没有看到明显的方法告诉jemalloc
限制所有分配来自该内存(也没有设定尺寸等。)
dallocx()
函数使ptr
引用的内存可用于将来的分配。
如果没有,这种功能的努力程度是多少?我很难找到一个可以从我提供的共享内存部分分配的现成分配方案。
同样,可以将jemalloc
配置为从锁定的内存区域进行分配以防止交换吗?
请随意向我指出需要修改的相关代码部分,并提供任何想法或建议。
我正在探索的想法是 - 因为您可以创建用于在线程环境中分配的竞技场/堆,正如jemalloc
所做的那样可以最小化争用,这个概念似乎可以在多处理环境中分配共享内存区域,即我使用mmap()
创建N个共享内存区域,我想利用jemalloc
(或任何分配方案)的功能尽可能有效地分配,最小的线程争用,来自那些这些共享区域,即如果线程/进程没有访问相同的共享区域和竞技场,则争用的可能性很小,malloc
操作的速度也会提高。
这与使用malloc()
API的全局池alloc不同,因为通常这些需要全局锁有效地序列化用户空间。我想避免这种情况。
编辑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)
答案 0 :(得分:4)
是。但是当你问这个问题时,情况并非如此。
Jemalloc 4(2015年8月发布)有几个mallctl
名称空间,可用于此目的;它们允许您指定每个竞技场,特定于应用程序的块分配挂钩。特别是,arena.<i>.chunk_hooks
命名空间和arenas.extend
mallctl
选项是有用的。存在integration test,演示如何使用此API。
关于基本原理,我希望理解任何特定内存段上的争用所需的有效“消息传递”开销类似于仅仅竞争的开销,因为您将降级为在缓存上竞争准确更新特定领域的“争用”值。
由于jemalloc已经采用了许多技术来减少争用,因此您可以通过使用opt.narenas
创建其他竞技场,在高度线程化的环境中获得类似的行为。这会减少争用,因为更少的线程将被映射到竞技场,但由于线程实际上是循环的,所以无论如何你都可以进入热点。
要解决此问题,您可以进行争用计数和热点检测,只需使用thread.arena
mallctl
界面将一个线程切换到竞争较少的竞技场。