我用 Rust 重写(并重新设计)了 frp,性能和资源占用有很大改善

2022-01-04 18:53:16 +08:00
 rapiz

rathole - 安全、稳定、高性能的内网穿透工具,用 Rust 语言编写。


先博一下眼球,让各位有兴趣继续看下去:

如果你对性能和内存的测试数据感兴趣,可以直接拉到帖子下面的图表感受一下

你可以先看看 README ,其中介绍了特性、配置和用法


下面写写我为什么要做这个工具,和我开发的时候在想什么。

frp 是优秀的基于内网穿透反向代理工具,方便易用,集成了很多功能。

但我对一个内网穿透工具的期望不太一样,我相信一个工具应该专注做一件事,通过简单优雅的设计接口来提供扩展能力。

我仔细思考了如何设计这样一个工具,它应该:

相比于 frp ,除了数据上的优势,rathole 还有更多的可能性:

未来

rathole 已经持续开发了一段时间,必要的特性已经趋于完善和稳定。我觉得是时候发布出来,让大家体验使用和反馈。

目前已经决定的开发计划有 HTTP API (或其他形式的 API )。API 实现后,能够支持 Dashboard 和复杂动态管理需求的开发。

最后,如果你还没有查看 项目 README ,这里是一个方便的链接

性能测试

测试的具体数字随机器变化,测试方法见此,主要用 iperf3 测试 TCP/UDP 吞吐量, vegeta + nginx 测试 HTTP 吞吐量,同时检测内存占用

22898 次点击
所在节点    分享创造
117 条回复
unique
2022-01-04 18:59:36 +08:00
star 先献上
ch2
2022-01-04 19:03:10 +08:00
frp 的场景不太可能有很高的并发的,中转损失很大
chotow
2022-01-04 19:03:41 +08:00
大佬甲:用 Rust 重写了 frp
大佬乙:用 UE5 制作了英雄联盟
我:什么时候过年放假
rapiz
2022-01-04 19:07:19 +08:00
@ch2 你说的对,但工具总是可以打磨的,对于路由器这种设备来说意义尤其大。并且我相信大家总有种想省常驻服务的 CPU/内存占用的冲动吧。高性能另一面其实也意味着低负载下的低占用
adrianzhang
2022-01-04 19:14:17 +08:00
@rapiz 的确在路由上应用很广阔
laincat
2022-01-04 19:20:45 +08:00
clash-rust 是不是指日可待了?
jackchenly
2022-01-04 19:31:55 +08:00
开发了多长时间
ScepterZ
2022-01-04 19:41:38 +08:00
不了解 rust 现在支不支持路由器那些平台,建议在那些上边测测
FightPig
2022-01-04 19:42:38 +08:00
支持啊,rust 果然重写一切,哈哈
rapiz
2022-01-04 19:43:30 +08:00
@jackchenly 快一个月吧,开发强度比较大。开始的时间要比 git init 要早
rapiz
2022-01-04 19:44:51 +08:00
@FightPig 是的,常驻系统的服务,原来又是用 Go 写的,很难抵制住用 Rust 重写这类软件的诱惑!这是 Rust 擅长的领域。
tinkerer
2022-01-04 19:45:23 +08:00
其他都好,就是 rathole 这名起得...
Reficul
2022-01-04 19:46:29 +08:00
Rust 在 IO 密集型应用上能比 Go 有这个差距还是比较意外的,话说有分析之前 FRP 的瓶颈在哪咩?
chenset
2022-01-04 19:49:05 +08:00
@Reficul GC .. 哈哈哈哈
rapiz
2022-01-04 19:56:05 +08:00
@Reficul 简单说一个吧,你可以看看 frp 转发 udp 部分的代码,服务端先把 udp 字节转成 base64 放到 string 里,string 放到一个结构体里,结构体序列化成 json ,经过 chan 在服务端内部传输,然后发给客户端,客户端再进行反序列化等等。抓 frp 转发 udp 的包看看,就能发现他传输的是 json 包 base64 。别的不说,就是带宽就肯定浪费了,base64 要比字节流长 1/4
mxT52CRuqR6o5
2022-01-04 19:56:06 +08:00
@Reficul
楼主说 [连接延迟和 frp 基本相同,但能承载更高并发]
就是说高并发时,CPU 成瓶颈了,变成 CPU 密集了
Reficul
2022-01-04 19:56:33 +08:00
@chenset 说 GC 我是不太信的...
rapiz
2022-01-04 19:56:50 +08:00
@tinkerer Rust nAT HOLE 我本来的意思是,😂
Reficul
2022-01-04 19:59:41 +08:00
@rapiz 没研究过 FRP 的协议,如果是 JSON 的话,那慢很合理....

Go 的 JSON 库默认会把[]byte 转换到 Base64 后放进 JSON ,而且 JSON 本来就巨慢...
Rrrrrr
2022-01-04 20:03:32 +08:00
居然输在名字,哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/826182

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX