与glibc malloc相比,jemalloc的CPU和内存使用量

deb*_*deb 13 malloc cpu-usage

我最近了解了jemalloc,它是firefox使用的内存分配器.我已经尝试通过覆盖new和delete运算符并调用jemalloc等效的malloc和free即je_malloc和je_free来集成jemalloc到我的系统中.我编写了一个执行1亿次分配的测试应用程序.我已经使用glibc malloc运行应用程序jemalloc,与jemalloc一起运行花费较少的时间进行此类分配时CPU利用率相当高,而且与malloc相比,内存占用量也更大.阅读本文关于jemalloc分析 似乎jemalloc的脚印可能比malloc更大,因为它采用技术来优化速度而不是内存.但是,我没有任何关于Jemalloc的CPU使用情况的指示.我想说明我在多处理器机器上工作的细节如下.

处理器:11 vendor_id:GenuineIntel cpu系列:6型号:44型号名称:Intel(R)Xeon(R)CPU X5680 @ 3.33GHz步进:2 cpu MHz:3325.117缓存大小:12288 KB物理ID:1个兄弟:12核心ID :10个cpu核心:6个apicid:53个fpu:是fpu_exception:是cpuid等级:11个wp:是标志:fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm系统调用nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm bogomips:6649.91 clflush size:64 cache_alignment:64地址大小:40位物理,48位虚拟电源管理:[8]

我正在使用top -c -b -d 1.10 -p 24670 | awk -v time = $ TIME'{print time,",",$ 9}'用于跟踪CPU使用情况.

整合Jemlloc时有人有类似的经历吗?

谢谢!

Vit*_*lii 30

一位聪明人在CppCon上说你永远不必猜测性能.你必须改为测量它.

我尝试使用jemalloc多线程Linux应用程序.它是自定义应用程序级协议服务器(通过TCP/IP).这个C++应用程序通过JNI使用了一些Java代码(接近5%的时间它使用Java,95%的时间使用C++代码)我在生产模式下运行2个应用程序实例.每个人有150个线程.

运行72小时后,glibc一个使用了900 M内存,jemalloc一个使用了2.2 G内存.我没有看到显着的CPU使用差异.两个实例的实际性能(平均客户端请求服务时间)几乎相同.

所以,在我的测试glibc中要好得多jemalloc.当然,这是我的具体应用.

结论:如果您有理由认为应用程序内存管理由于碎片而无效,则必须进行类似于我所描述的测试.它是满足您特定需求的唯一可靠信息源.如果jemalloc总是更好glibc,glibc将使其jemalloc官方分配器.如果glibc总是更好,jemalloc将停止存在.当竞争对手长时间并存时,这意味着每个竞争对手都有自己的使用范围.

  • 有趣的观察。当谈到 Python 进程时,从 glibc 切换到 jemalloc 似乎总是一种改进,有时甚至是重大改进。也许这是由于 Python 内部内存管理的工作方式所致。 (3认同)
  • @bluenote10 请记住,我在 7 年前进行了测试,从那时起事情可能发生了变化。当然,“jemalloc”必须至少为某些用户提供优势,否则它就不可能生存。 (3认同)

小智 5

Aerospike 在我们的 NoSQL 数据库上实现了 jemalloc,并在大约一年前以 v3.3.x 公开发布了该实现。就在今天,Psi Mankoski 发表了一篇关于高可扩展性的文章,介绍了我们为什么以及如何做到这一点,以及与 GlibC malloc 相比它带来的性能改进。

我们实际上看到了 RAM 利用率的下降,因为我们能够使用 jemalloc 的调试功能来最小化 RAM 碎片。在生产环境中,服务器可用内存百分比通常是一个“尖峰图”,并且在实施 JEMalloc 之前经常飙升至 54%。实施后,您可以看到 RAM 利用率在 4 个月的分析期内有所下降。RAM % 空闲内存开始“趋于平缓”并且更加可预测,根据服务器节点在 ~22-40% 之间徘徊。

正如 Preet 所说,随着时间的推移,碎片减少了很多,这意味着 RAM 利用率降低了。Psi 的文章在这样的声明背后提供了“布丁中的证据”。


Pre*_*eti 4

这个问题可能不属于这里,因为对于现实世界的解决方案,它应该与其他人在不同的硬件/环境/使用场景中发现的内容无关。您应该在目标系统上进行测试,看看什么适合您。

至于更高的内存占用,计算机科学中最经典的性能优化之一是时间与内存的权衡。也就是说,缓存某些结果以便稍后即时查找并防止频繁重新计算。此外,由于它可能要复杂得多,因此可能会有更多的内部簿记。这种权衡应该或多或少是可以预料到的,特别是在这种低级和广泛使用的核心模块的变体之间进行选择时。您必须使性能特征适应您的使用特征,因为通常没有灵丹妙药。

您可能还想看看 google 的TCMalloc,它非常接近,尽管我相信 Jemalloc 总体上性能稍高,并且随着时间的推移产生的堆碎片也更少。