我最近了解了jemalloc,它是firefox使用的内存分配器。我已经尝试通过覆盖new和delete运算符并调用jemalloc等效的malloc和free即je_malloc和je_free来集成jemalloc到我的系统中。我编写了一个执行1亿次分配的测试应用程序。我已经使用glibc malloc运行应用程序jemalloc,与jemalloc一起运行花费较少的时间进行此类分配时CPU利用率相当高,而且与malloc相比,内存占用量也更大。在jemalloc analysis上阅读本文档后 似乎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 身份证:1 兄弟姐妹:12 核心ID:10 cpu核心:6 apicid:53 fpu:是的 fpu_exception:是的 cpuid等级:11 wp:是的 flags: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 syscall 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尺寸:64 cache_alignment:64 地址大小:40位物理,48位虚拟 电源管理:[8]
我正在使用 top -c -b -d 1.10 -p 24670 | awk -v time = $ TIME'{print time,“,”,$ 9}'以跟踪CPU使用情况。
有人在整合Jemlloc时有类似的经历吗?
谢谢!
答案 0 :(得分:28)
一位聪明的家伙在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
将停止存在。当竞争对手长时间并存时,意味着每个竞争对手都有自己的使用范围。
答案 1 :(得分:3)
这个问题可能不属于这里,因为对于现实世界的解决方案,它应该与其他人在不同的硬件/环境/使用场景中找到的内容无关。您应该在目标系统上进行测试,看看哪些适合您。
对于更高的内存占用,计算机科学中最经典的性能优化之一是时间 - 内存权衡。也就是说,缓存某些结果以便稍后立即查找并防止频繁重新计算。此外,由于它可能要复杂得多,因此可能会有更多的内部簿记。应该或多或少地预期这种权衡,特别是在这种低级别和广泛使用的核心模块的变体之间进行选择时。你必须满足你的使用特性的性能特征,因为通常没有银弹。
你可能还想看看google的TCMalloc这个非常接近,虽然我相信Jemalloc的性能稍微高一些,并且随着时间的推移会产生更少的堆碎片。
答案 2 :(得分:3)
Aerospike在我们的NoSQL数据库上实现了jemalloc,并在大约一年前用v3.3.x公开发布了该实现。就在今天,Psi Mankoski发表了an article on High Scalability关于我们为什么以及如何做到这一点,以及它与GlibC malloc相比的性能改进。
我们实际上看到了RAM利用率的降低,因为我们能够使用jemalloc的调试功能来最小化RAM碎片。在生产环境中,服务器%Free Memory通常是一个尖锐的图形,"并且在实施JEMalloc之前经常飙升高达54%。实施后,您可以看到4个月分析期内RAM利用率的下降。 RAM%可用内存开始" flatline"并且更加可预测,根据服务器节点的不同,悬停在~22-40%之间。
正如Preet所说,随着时间的推移,碎片会少得多,这意味着RAM利用率会降低。 Psi的文章给出了布丁中的证明"这样的声明背后。
答案 3 :(得分:1)
我正在开发简单的NoSQL数据库 (https://github.com/nmmmnu/HM4)
当我使用jemalloc时,性能下降,但内存“碎片”也会减少。 Jemalloc似乎也在峰值上使用较少的记忆,但差异是5-6%。
我对内存碎片的意思如下。
在标准的malloc中,使用情况几乎与峰值相似。 (我特别检查了mmap内存,但没有。)
使用jemalloc很少。
上次我使用tcmalloc查看时,它确实非常快 - 比标准malloc提升了10%。
在高峰期,它比标准malloc消耗更少的内存,但比jemalloc更多。
我不记得内存碎片,但它远非jemalloc结果。
答案 4 :(得分:1)
此paper研究了不同内存分配器的性能。
在这里分享一些结论:
图1显示了比例因子为100的不同分配策略对TPC-DS的影响。我们使用4插槽Intel Xeon服务器上的多线程数据库系统来测量内存消耗和执行时间。在此实验中,我们的DBMS使用所有可用的内核依次执行查询集。即使是这种相对简单的工作负载,也已经导致显着的性能和内存使用差异。与
jemalloc
链接的数据库相比,将其与glibc
2.23的标准malloc。