axum内存泄漏问题,更换内存分配器的后续测试
内容提要
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。