jemalloc,mmap和共享内存?

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)

dho*_*dho 6

是的。但是当你问这个问题时,情况并非如此。

Jemalloc 4(2015 年 8 月发布)有几个mallctl命名空间可用于此目的;它们允许您指定 per-arena、特定于应用程序的块分配挂钩。特别是,arena.<i>.chunk_hooks命名空间和选项是有用的。存在一个演示如何使用此 API的集成测试arenas.extend mallctl

关于基本原理,我希望了解任何特定内存段上的争用位置所需的有效“消息传递”开销与仅争用的开销相似,因为您将降级为在缓存行上争用以准确更新特定领域的“争用”值。

由于 jemalloc 已经采用了许多技术来减少争用,因此您可以通过使用opt.narenas. 这将减少争用,因为更少的线程将被映射到一个领域,但由于线程是有效的循环,因此无论如何你都有可能到达热点。

为了解决这个问题,您可以进行争用计数和热点检测,只需使用界面将线程切换到争用较少的领域。thread.arena mallctl

  • API 在 jemalloc v5 (2017) 中发生了变化。canonware.org 链接已损坏,因为服务器已关闭,而“集成测试”链接已损坏,因为文件已丢失。我相信相关链接现在是: [`arena.&lt;i&gt;.extent_hooks`](https://jemalloc.net/jemalloc.3.html#arena.i.extent_hooks) 和 [`arena.create`,]( https://jemalloc.net/jemalloc.3.html#arenas.create) ,集成测试为 https://github.com/jemalloc/jemalloc/blob/master/test/integration/extent.c (2认同)