我们开发了一个大型 C++ 应用程序,它可以在大型 Linux 和 Solaris 机器上的多个站点上令人满意地运行(多达 160 个 CPU 内核甚至更多)。这是一个高度多线程(1000+ 线程)、单进程架构,消耗大量内存(200 GB+)。我们正在对 Google Perftool 的 tcmalloc(或 Solaris 上的 libumem/mtmalloc)进行 LD_PRELOAD 处理,以避免内存分配性能瓶颈,通常效果良好。但是,我们开始看到内存分配/释放期间锁争用对一些较大的安装的不利影响,尤其是在进程运行了一段时间之后(这暗示了分配器的老化/碎片效应)。
我们正在考虑更改为多进程/共享内存架构(重分配/释放不会发生在共享内存中,而是在常规堆上)。
所以,最后,这是我们的问题:我们能否假设现代 Linux 内核的虚拟内存管理器能够有效地将内存分配给数百个并发进程?或者我们是否必须预期会遇到与我们在单进程/多线程环境中看到的相同类型的内存分配争用问题?我倾向于希望获得更好的整体系统性能,因为我们将不再局限于单个地址空间,并且拥有多个独立地址空间将需要更少的虚拟内存管理器锁定。有人有比较多线程与多进程内存分配的实际经验或性能数据吗?