Can jemalloc http://www.canonware.com/jemalloc/修改为从共享内存分配? FreeBSD 的功能dallocx() http://www.unix.com/man-page/freebsd/3/dallocx/意味着您可以提供一个用于分配的指针,但我没有看到明显的方法来告诉jemalloc
限制all从该内存分配(也不设置大小等)。
The dallocx()
函数导致内存引用ptr
可用于未来的分配。
如果没有,那么为实现这样的功能付出了多少努力?我正在努力寻找一种现成的分配方案,可以从我提供的共享内存部分进行分配。
同样,可以jemalloc
是否配置为从锁定的内存区域进行分配以防止交换?
请随时向我指出需要修改的相关代码部分并提供任何想法或建议。
我正在探索的想法是 - 因为您可以创建用于在线程环境中分配的竞技场/堆,如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)
是的。但当你问这个问题时,事实并非如此。
Jemalloc 4(2015 年 8 月发布)有几个mallctl
对此目的有用的命名空间;它们允许您指定每个竞技场、特定于应用程序的块分配挂钩。特别是,arena.<i>.chunk_hooks http://www.canonware.com/download/jemalloc/jemalloc-latest/doc/jemalloc.html#arena.i.chunk_hooks命名空间和arenas.extend http://www.canonware.com/download/jemalloc/jemalloc-latest/doc/jemalloc.html#arenas.extend mallctl
选项是有用的。一个集成测试 https://github.com/jemalloc/jemalloc/blob/master/test/integration/chunk.c存在演示如何使用此 API。
关于基本原理,我预计了解任何特定内存段上的争用位置所需的有效“消息传递”开销将与仅争用的开销类似,因为您将降级为缓存行上的争用以准确地进行竞争。更新特定竞技场的“争用”值。
由于 jemalloc 已经采用了多种技术来减少争用,因此您可以通过使用以下命令创建额外的区域,从而在高度线程环境中获得类似的行为opt.narenas http://www.canonware.com/download/jemalloc/jemalloc-latest/doc/jemalloc.html#opt.narenas。这会减少争用,因为映射到竞技场的线程会减少,但由于线程实际上是循环的,因此无论如何您都有可能到达热点。
为了解决这个问题,您可以进行争用计数和热点检测,并且只需使用thread.arena http://www.canonware.com/download/jemalloc/jemalloc-latest/doc/jemalloc.html#thread.arena mallctl
将线程切换到争用较少的区域的接口。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)