逛知乎发现一个新回答:
可以选,但是别用Axum这个库,这个库会内存泄漏,也不咋稳定。你可以压测一下,结果是流量打完之后内存不释放,我找了GitHub,这个库把这个issue推给hyper直接不管了,确实是hyper这个库的问题,但是人家直接不理你,说让换个全局内存分配器,issue好多反馈不管用。rocket和actix-web我测了,这俩没有。总之rust有很多坑要踩,初创公司如果没有钱或者硬实力,还是挺麻烦的,因为开发效率还是对初创很重要的,当然也看公司做什么业务。
但这个回答的评论区里,有大佬表示生产环境没啥问题,论坛的各位大佬对这回答有啥看法?
hyper最近的相关issue,不过都已经关闭了。
1
共 11 条评论, 1 页
评论区
写评论actix-web有没有听说问题?
(我记得actix原作者分裂之前闹过unsafe风波,但记不清有没有内存泄露了)
--
👇
我心飞翔: 这个锅确实不是 axum 和 hyper 的问题,是linux gun libc 的问题,如果对内存敏感,可以使用 musl 方式进行编译,也可以使用三方的内存分配器
这个锅确实不是 axum 和 hyper 的问题,是linux gun libc 的问题,如果对内存敏感,可以使用 musl 方式进行编译,也可以使用三方的内存分配器;
看axum版本号及API变动就知道,这玩意目前还不该用于生产.
actix-web 不香么,已经有N多线上经验的产品.
不但不影响性能,还能提高内存分配性能,放心使用
--
👇
lithbitren: 会影响性能吗?
--
👇
lsk569937453: 这个问题我复现过,换成MiMalloc确实会好很多。
楼主可以试一下调 malloc_trim 有没有效果,如果有很大效果那估计就是 malloc (当要申请的内存大小 < M_MMAP_THRESHOLD 时)用 brk 申请的堆内存没有被 malloc 释放导致的,malloc_trim 可以把堆顶上未被使用的内存一次性归还给系统。我记得 malloc_trim 虽然可以被 malloc 自动调用,但条件很苛刻。
可以用这个分配器测试一下 https://docs.rs/dhat/latest/dhat/
在axum/hyper里具体使用mimalloc的正确姿势是啥,完整代码是咋样的
--
👇
lsk569937453: 这个问题我复现过,换成MiMalloc确实会好很多。
直接看原始issue,到现在也没找到泄漏原因 https://github.com/hyperium/hyper/issues/1790
只能说用MiMalloc能解决泄漏
会影响性能吗?
--
👇
lsk569937453: 这个问题我复现过,换成MiMalloc确实会好很多。
这个问题我复现过,换成MiMalloc确实会好很多。
人家不是告诉你了换个全局内存分配器再测, 有些内存分配器释放后并不会立刻归还给系统,方便后续分配的时候快速复用。这种情况下观察到程序没有新请求进来了但是内存没有降到启动时的值。 或者测试的时候先进行预热跑一段时间之后再测。