axum内存泄漏问题,更换内存分配器的后续测试

💡 原文中文,约2300字,阅读约需6分钟。
📝

内容提要

axum/hyper存在内存泄漏问题,使用MiMalloc内存分配器可以降低泄漏可能性。测试结果显示MiMalloc和JeMalloc释放内存更好,但MiMalloc性能更佳。根据测试,axum的内存不会无限增加,可以选择不更换内存分配器。MiMalloc和JeMalloc是优化内存分配的可选项。

🔎

延伸解读

内存泄漏现象与并发数的关联

测试表明,axum/hyper的内存占用在请求结束后不会立即释放,且与并发数密切相关,而非总请求数。默认分配器下,1000qps持续两小时(72万请求)后内存仍维持在55~60M,说明内存回收机制存在缺陷。但低频请求(1~100qps)可逐步释放内存,表明内存并非无限增长,而是需要触发条件才能回收。

不同内存分配器的性能对比

在10000qps下,MiMalloc内存占用约350M,JeMalloc约560M,默认分配器和Dhat约600M。压测结束后,MiMalloc内存降至9M,JeMalloc降至30M,而默认分配器和Dhat仍高达560M。MiMalloc在内存释放上表现最佳,JeMalloc次之,但JeMalloc在CPU占用上更优,适合兼顾内存与CPU的场景。

测试环境的限制与注意事项

测试在VMware虚拟机中进行,配置为8核8G,使用Ubuntu 24.04和nightly Rust。高并发下CPU爆表和端口拥堵会影响客户端,导致send error。reqwest短时最高约28000qps,但持续几秒后会出现大量错误。因此测试仅针对最高10000qps,此时各分配器吞吐性能差异不大,但CPU跑满时间不同:默认和Dhat约十几秒,MiMalloc约三十几秒,JeMalloc约八十多秒。

是否更换内存分配器的决策建议

如果生产环境的最大qps所需内存可以承受,可以不更换分配器,因为内存不会无限增长。若需优化内存释放,MiMalloc和JeMalloc是可选项:MiMalloc内存释放更好,JeMalloc CPU占用更低。若需内存预热,应通过压测提前触发内存分配,避免线上首次高并发时内存骤增。

❓

Q&A

axum/hyper的内存泄漏问题是什么原因造成的?

内存问题的成因推测与请求并发数有关,内存无法正确回收。

使用MiMalloc内存分配器有什么优势?

MiMalloc在内存释放方面表现更好,且在高并发情况下内存占用相对较低。

测试中发现的内存占用情况如何?

在1000qps和10000qps的测试中,MiMalloc的内存占用分别为35M和350M,而其他分配器则更高。

JeMalloc和MiMalloc的性能比较如何?

MiMalloc在内存释放表现上更好,而JeMalloc在兼顾内存释放的同时,CPU占用率表现更佳。

axum是否需要更换内存分配器?

根据测试,axum的内存不会无限增加,可以选择不更换内存分配器。

测试环境的配置是什么?

测试环境为ubuntu 24.04,使用最新rust版本,配置为2.6Ghz 8C 8G。

🏷️

标签

➡️

继续阅读