-
Notifications
You must be signed in to change notification settings - Fork 797
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
MOSN On High Performance Network #1563
Comments
Looks promising! 🚀🚀🚀 |
coooool |
高性能的网络扩展层 与 Nginx,Envoy 等是怎么交互的? |
MOSN 的高性能网络扩展层和 Nginx,Envoy etc 之间是使用的 CGO 交互进行的,另外 MOSN 和 Nginx 等这些组件是在同一个进程的,减轻了夸进程的通信成本。PS: 上面的架构图已经更新了下,增加了相关请求响应的数量流向。 |
Yeah. We will also make this solution a standard when it is subsequently mature. This will enable more users to benefit. Welcome to build together. |
@ALL Now, We have been supported Quic start dynamic route sampleInstall mosn network on envoy image
Start mosn network on envoy container
Test dynamic route sampleIn this sample, after set Envoy as a network extension for MOSN , then Envoy's dynamic routing feature can be implemented by developing a stream filter on the MOSN side using the GoLang language. For example, requests with Then we could see the route rules at work by making a request via
|
golang 通过cgo具体怎么和nginx交互的,需要额外开发nginx c模块? |
Nginx 侧需要开发一个 filter 模块(用于引入 GoLang Network SDK,该 SDK 是暴露了和 GoLang 代码交互的 C API ),通过在 Nginx 侧调用相关 API 封装原始请求数据后,然后把其作为输入调用相关 API 传送到 GoLang 即可运行起来。另外当前我们已经在 Envoy 侧有一个实现案例,如果感兴趣的话,你也可以参与进来适配 Nginx。 |
高性能网络库是否考虑纯 go ?如果考虑,自荐下:
可定制、扩展的挺多的,不挨个列举了 这几天把 go 1.6 std 的 crypto/tls copy 了一份,重写了一点、支持了异步网络库的 tls server-side、server-side |
@lesismal 我们自己也是支持纯的epoll模型的,不知道和你的有什么区别,可以简单说说? |
再提一下我们很欢迎有纯Go的高性能网络库来加强我们的性能,正如QA所述,用户可以自由选择纯Go版本和CGO版本。 @lesismal 一些实现细节可以邮件细聊 linuxty@gmail.com |
好的,邮件我先收藏了 |
@lesismal 我们是用easygo库做的扩展,看起你这个是要高级不少,欢迎来一个pr支持你的库, 可以对比一下效果 😄 |
好的,我闲了先学习下MOSN,有档期了试试 |
最近几个月魔改标准库或者从头手撸实现了异步流解析器,支持了 tls/http1.x/websocket, websocket 通过了 Autobahn Test Suite 也对 nbio 的 tls/http 1.x/websocket 内存池做了大量优化,比较费肝。 内存池优化后测试 10w tls websocket 连接(详情请见这个PR)envos: vmware ubuntu test code
gorilla/websocket, 标准库方案qps: 1-12w,平均大概6、7w,运行不稳定,stw应该会比较严重,占用 top | grep server
# output
34454 root 20 0 6221912 3.3g 1584 R 264.9 42.5 3:47.88 server nbio
top | grep server
# output
34945 root 20 0 3883844 1.3g 6808 S 300.0 16.4 6:31.23 server 另外,异步库性能并不是一定强于标准库,连接数较少时标准库响应可能更快,影响的点比较多,比如:
fasthttp那种仍然是一个连接对应一个协程,它不管是小对象还是内存buffer,用池优化都相对容易,异步框架Pool优化的难度大很多 总归来讲,异步方案对于海量并发,至少协程数量的节约、内存的节约、运行的稳定性是非常明显的,连接数量达到一个阈值后可节省的调度成本也能让异步库性能优势更强 另外,easygo的性能比较一般,nbio选了一些代表性的异步库进行对比: 海量业务用异步库应该可以节约不少硬件成本。mosn的代码比较庞大,不敢随便PR,如果各位大佬有计划使用异步网络库替换标准库方案,欢迎使用、交流 |
@lesismal 给老哥点赞 👍 |
之前没关注到,我去学习下,感谢推荐 |
原来就是之前两个帖子里说的 KRPC 那个,应该是他们帖子里说的内核定制过的那个,如果是内核定制过的,应该性能更高,nbio可能不低于或者略好于gnet,看字节这个主页上的benchmark报告的图,他们这个比gnet还高出很多,如果benchmark数据可靠、那应该会比nbio性能更强 我抽空跑个测试看看 |
不确定我的测试代码是否正确,上手先来10000连接跑下试试,nbio和netpoll是用的同一个虚拟机、同一个控制台,没有环境配置差异: 10000 connectionsnbio# go run ./client.go -c=10000
2021/07/16 22:40:58.975 [INF] Gopher[NB] start
2021/07/16 22:40:58 loat test for 10000 connections, buffer size: 64
2021/07/16 22:41:00 10000 clients connected, used: 1.708351955 s, 170835 ns/op
2021/07/16 22:41:00 warm up for 5s...
2021/07/16 22:41:05 warm up over, start io statistics
2021/07/16 22:41:35 30s, total read: 296.21 M, total write: 296.21 M
2021/07/16 22:41:35.790 [INF] Gopher[NB] stop netpoll# go run ./client.go -c=10000
2021/07/16 22:41:45.204 [INF] Gopher[NB] start
2021/07/16 22:41:45 loat test for 10000 connections, buffer size: 64
# 建立10000连接阻塞了,并且。。。死机了。。。 没办法,重启了虚拟机,然后按他们文档中的图,进行100连接数的并发测试 100 connectionsnbio# go run ./client.go -c=100
2021/07/16 22:36:55.020 [INF] Gopher[NB] start
2021/07/16 22:36:55 loat test for 100 connections, buffer size: 64
2021/07/16 22:36:55 100 clients connected, used: 0.055832512 s, 558325 ns/op
2021/07/16 22:36:55 warm up for 5s...
2021/07/16 22:37:00 warm up over, start io statistics
2021/07/16 22:37:30 30s, total read: 455.84 M, total write: 455.84 M
2021/07/16 22:37:30.080 [INF] Gopher[NB] stop netpoll# go run ./client.go -c=100
2021/07/16 22:40:05.398 [INF] Gopher[NB] start
2021/07/16 22:40:05 loat test for 100 connections, buffer size: 64
2021/07/16 22:40:05 100 clients connected, used: 0.077546192 s, 775461 ns/op
2021/07/16 22:40:05 warm up for 5s...
2021/07/16 22:40:10 warm up over, start io statistics
2021/07/16 22:40:41 30s, total read: 1040.48 M, total write: 1040.48 M
2021/07/16 22:40:42.031 [INF] Gopher[NB] stop netpoll 100并发确实很猛,64 byte buffer 30s总读写量是nbio的2倍还多 然后又试了下netpoll 10000连接,再次死机。。。 他们文档中的benchmark图也只有两种:
10000连接建连失败和死机的原因还不清楚,他们文档没有提供更高并发连接数的数据,文档中的benchmark repo链接也已经失效,等我闲了去issue或者学习下他们代码再看 |
好像不只是10000连接,刚才又试了下100连接,也把我虚拟机干死了,可能因为性能过高cpu全跑满了导致死机,纳尼?。。。 |
@taoyuanyuan 代码改为使用 connection.Next 后行为应该是正常了,但是性能只有 nbio/gnet 的一半左右,比 easygo 还慢。。。并且 netpoll 的内存占用也高太多了, nbio/gnet 做这种压测内存占用都只有十几兆到二十几兆的范围,netpoll 2-3 G,这应该是比 java 还猛了吧。 另外发现他们的这个 connection.Next/Peed 相当于读,并且缓冲区没有足够数据时是tryRead用 chan 控制的阻塞的,这样的话。。。我又开了新的 issue 给他们: issue 13 - block read? 还有一个问题,压测10000连接,每个连接建立成功后就立刻发送数据,然后后面的建立连接非常慢,大量 issue 链接我就不引用了免得他们跑到这来了,各位大佬如果有空可以一块去瞅瞅 |
mosn有计划采用cloudwego的netpoll作为底层的网络库么? |
目前没有计划,你们目前的痛点是啥,是目前go runtime的性能不行吗? |
是的,我们压测了下,目前发现性能相比netpoll差很多,而且mosn的pprof上显示耗时最长的是gc。 |
你们什么场景呢,多少长连接压测? |
500长连接,自定义协议解析,比较耗cpu,tps基本在1.5W吧,同样的功能,在netpoll下压测可达到3.8W |
你可以分别发两个火焰图出来,我们对比看看,我理解这么点连接数,netpoll也发挥不出来优势。 Line 37 in 07be2d0
|
请问这个目前已经实现了么? 有测试效果么? |
https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/golang_filter |
背景介绍
MOSN 在 Service Mesh 领域作为东西向 RPC 服务治理网络转发组件已经在社区很多公司都得到了一定实践,为了进一步节省研发运维等相关成本,目前业界也有很多公司在考虑把东西向和南北向数据转发面统一。MOSN 在作为东西 Sidecar 场景当前性能足以,但在作为南北向网关会有一定性能上限(比如单机百万级长连接、高并发等场景)。
解决方案(草案)
为 MOSN 在 Network 层做一个高性能的网络扩展层,使其可以和高性能网络库结合使用(如Nginx、Envoy、OpenResty 等),使其底层网络具备高性能处理的同时,又能复用 MOSN Stream Filter 等能力。
如上图所示,MOSN 通过扩展一个标准的 GOHPNF(Golang On High Performance Network Framework) 适配层和底层的高性能网络组件(如 Nginx、Envoy、Openresty 等)生态打通。使得其底层网络具备 C 同等的处理能力的同时,又能使上层业务可高效复用 MOSN 的处理能力及 GoLang 的高开发效率。
注:MOSN 和 高性能网络库是运行在一个进程空间的,高性能网络库(如 Envoy、Nginx)是通过使用 CGO 的方式来驱动 MOSN 的代码运行的,不存在跨进程通信和数据 COPY。
相关问题
Q0 MOSN 为什么要支持底层网络库的扩展能力?
A0 一方面是使得 MOSN 具备作为南北向数据面时需要的极致性能,另一方面可以让 MOSN 和其他高性能网络库生态(如 Nginx、Envoy、OpenResty 等)有更多的结合,在实现高性能的同时又具备了 GoLang 的开发效率。
Q1 高性能底层网络组件是 C/C++ 实现的,后续排查问是否会困难?
A1 底层网络扩展模块会做成一个轻量级的(成熟后基本上不用修改),另外也会完善其周边相关 Debug 调试工具。
Q2 MOSN 在支持高性能底层网络扩展后,其 MOSN 的开发流程是否有变化?
A2 没有变化,和之前 MOSN Stream Filter 开发流程一样。另外 MOSN 底层高性能网络扩展是可选择,用户可以根据自身业务场景选择是否开启。
Q3 目前计划是准备使用那些高性能网络库?
A3 还没明确,会先抽象一个 GOHPNF (GoLang On High Performance Network Framework) 适配层,然后只需在相关高性能网络库调用 GOHPNF 提供的 SDK 就可以和 MOSN 结合了。
现在,我们已经支持把 Envoy 作为一个 MOSN 的七层网络扩展,欢迎大家试用。这是相关使用文档。
动态路由事例
如下事例是通过把 MOSN 的网络扩展层设置为 Envoy 后,通过在 MOSN 侧使用 GoLang 语言开发一个 stream filter 就可以实现 Envoy 的动态路由能力:
根据用户请求 header 的
uid
字段做路由,比如将uid
范围在[1, 100]
的请求路由到应用的s1
站点,将uid
范围在[101, 200]
的请求路由到s2
站点,将其它范围uid
请求路由到s3
站点, 如果没有uid
则将轮训转发到s1
、s2
、s3
。步骤1(安装 mosn network on envoy 镜像)
步骤2(启动 mosn network on envoy 容器)
当容器正常启动后,就可以使用
curl
命令发起对应的请求,然后就可以看到上述事例路由规则的工作效果:欢迎大家讨论和共建 !
Background introduction
MOSN has been adopted by many companies in the community as their East-West RPC service networks data plane. To further save R&D, as well as reducing operation and maintenance overheads, many companies are considering converging their East-West and North-South data plane into one production. Currently, MOSN's performance is sufficient for East-West Sidecar scenario, yet insufficient for the North-South gateway scenario (e.g., C1000K, high concurrency, etc.).
Solution(draft)
We propose a high-performance network extension machism for MOSN, so that it can be used to combine with other high-performance network libraries (e.g. Nginx, Envoy, OpenResty, etc.). So that the network has high-performance processing and can reuse MOSN Stream Filter and other features.
As shown in the above figure, MOSN uses a standard GOHPNF (Golang On High Performance Network Framework) shim layer to connect with the underlaying high-performance network components (such as Nginx, Envoy, Openresty, etc) ecosystem. This proposal allows MOSN to increase network processing performance, while reserving Golang's high development efficiency.
Note: MOSN and the High Performance Network library run in the same process. The High Performance Network library (e.g. Envoy, Nginx) runs by calling MOSN code using CGO, and there is no cross-process communication or data COPY.
Q&A
Now, We have been supported Envoy as a Layer 7 network extension for MOSN, welcome to try it. Here is the documentation about it.
Quic start dynamic route sample
In this sample, after set Envoy as a network extension for MOSN , then Envoy's dynamic routing feature can be implemented by developing a stream filter on the MOSN side using the GoLang language.
For example, requests with
uid
range[1, 100]
will be routed totest
app sites1
, requests withuid
range[101, 200]
will be routed to sites2
, requests with otheruid
ranges will be routed to sites3
, and if there is nouid
header, the request will be round robin tos1
,s2
, ands3
.Step 1(Install mosn network on envoy image)
Step 2(Start mosn network on envoy container)
Then we could see the route rules at work by making a request via
curl
in another terminal:Welcome to discuss and build together!
The text was updated successfully, but these errors were encountered: