17

我最近了解了jemalloc,它是firefox使用的内存分配器。我尝试通过覆盖 new 和 delete 运算符并调用 malloc 和 free 的 jemalloc 等效项,即 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 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位地址大小:48位虚拟电源管理:48

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

有人在集成 Jemlloc 时有类似的经历吗?

谢谢!

4

5 回答 5

41

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

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

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

所以,在我的测试glibc中比jemalloc. 当然,这是我的应用程序特定的。

结论:如果您有理由认为您的应用程序内存管理由于碎片而无效,您必须进行类似于我描述的测试。它是满足您特定需求的唯一可靠信息来源。如果jemalloc总是更好glibcglibc将使其jemalloc正式分配。如果glibc总是更好,jemalloc将不复存在。当竞争对手长期并行存在时,这意味着每个人都有自己的使用利基。

于 2015-11-30T07:12:32.250 回答
6

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

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

正如 Preet 所说,随着时间的推移,碎片会减少很多,这意味着 RAM 利用率会降低。Psi 的文章给出了这种声明背后的“证据”。

于 2015-03-17T18:24:44.787 回答
4

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

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

您可能还想查看 google 的TCMalloc,它非常接近,尽管我相信 Jemalloc 通常性能略高一些,并且随着时间的推移创建的堆碎片更少。

于 2012-10-23T09:43:37.977 回答
2

我正在开发简单的 NoSQL 数据库。
https://github.com/nmmmnu/HM4

jemalloc 与标准 malloc

当我使用 jemalloc 时,性能会下降,但内存“碎片”也会减少。Jemalloc 似乎也在峰值使用较少的内存,但差异是 5-6%。

我对内存碎片的意思如下。

  • 首先我分配了很多键值对(5-7 GB 内存)
  • 然后我看看内存使用情况。
  • 然后我释放所有对和我的可执行文件使用的任何其他内存。分配顺序与解除分配顺序相同。
  • 最后我再次检查内存使用情况。

在标准 malloc 中,使用情况几乎就像在高峰期一样。(我特别检查了 mmap 内存,但没有)。

使用 jemalloc 使用最少。


奖金信息 - tcmalloc

上次我检查 tcmalloc 时,它真的非常快 - 可能比标准 malloc 改进了 10%。

在高峰期,它消耗的内存比标准 malloc 少,但比 jemalloc 多。

我不记得内存碎片,但它与 jemalloc 结果相去甚远。

于 2017-08-05T13:03:35.803 回答
2

本文研究了不同内存分配器的性能。

在这里分享一些结论:

在此处输入图像描述 在此处输入图像描述

图 1 显示了不同分配策略对比例因子为 100 的 TPC-DS 的影响。我们在 4 插槽英特尔至强服务器上使用我们的多线程数据库系统测量内存消耗和执行时间。在这个实验中,我们的 DBMS 使用所有可用的核心按顺序执行查询集。即使是这种相对简单的工作负载也已经导致显着的性能和内存使用差异。jemalloc与将其与glibc2.23的标准 malloc 链接相比,我们链接的数据库可以将执行时间减少到 1/2。

于 2020-04-06T09:21:07.570 回答