tre*_*ger 13 c memory memory-management shared-memory
可以jemalloc被修改以从共享存储器分配?FreeBSD函数dallocx()
意味着你可以提供一个用于分配的指针,但是我没有看到明显的方法jemalloc
来限制来自该内存的所有分配(也没有设置大小等).
该
dallocx()
函数使引用的内存ptr
可用于将来的分配.
如果没有,这种功能的努力程度是多少?我很难找到一个可以从我提供的共享内存部分分配的现成分配方案.
同样,可以jemalloc
配置为从锁定的内存区域分配以防止交换?
请随意向我指出需要修改的相关代码部分,并提供任何想法或建议.
我正在探索的想法是 - 因为你可以创建用于在线程环境中分配的竞技场/堆,就像jemalloc
最小化争用一样,这个概念似乎可以扩展到在多处理环境中分配共享内存的区域,即我创建共享内存的N个区域使用mmap()
,并且我想利用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)
Run Code Online (Sandbox Code Playgroud)
是的。但是当你问这个问题时,情况并非如此。
Jemalloc 4(2015 年 8 月发布)有几个mallctl
命名空间可用于此目的;它们允许您指定 per-arena、特定于应用程序的块分配挂钩。特别是,arena.<i>.chunk_hooks
命名空间和选项是有用的。存在一个演示如何使用此 API的集成测试。arenas.extend
mallctl
关于基本原理,我希望了解任何特定内存段上的争用位置所需的有效“消息传递”开销与仅争用的开销相似,因为您将降级为在缓存行上争用以准确更新特定领域的“争用”值。
由于 jemalloc 已经采用了许多技术来减少争用,因此您可以通过使用opt.narenas
. 这将减少争用,因为更少的线程将被映射到一个领域,但由于线程是有效的循环,因此无论如何你都有可能到达热点。
为了解决这个问题,您可以进行争用计数和热点检测,只需使用界面将线程切换到争用较少的领域。thread.arena
mallctl