SOFAMosn 如何提升 GoLang 的转发性能

经过SOFAMosn了解goroutine只能在必定并发量级上下降并发编程的难度(goroutine内存占用2kb+)。 高并发的场景仍是NIO比较适合。git

GoLang 的转发性能比起 C++ 确定是稍有逊色的,为了尽量的提升 MOSN 的转发性能,咱们在线程模型上进行优化,当前 MOSN 支持两种线程模型,用户可根据场景选择开启适用的模型。github

模型一

以下图所示,使用 GoLang 默认的 epoll 机制,对每一个链接分配独立的读写协程进行阻塞读写操做,proxy 层作转发时,使用常驻 worker 协程池负责处理 Stream Event编程

  • 此模型在 IO 上使用 GoLang 的调度机制,适用于链接数较少的场景,例如:mosn 做为 sidecar、与 client 同机部署的场景

模型二

以下图所示,基于 Netpoll 重写 epoll 机制,将 IO 和 PROXY 均进行池化,downstream connection 将自身的读写事件注册到 netpoll 的 epoll/kqueue wait 协程,epoll/kqueue wait 协程接受到可读事件,触发回调,从协程池中挑选一个执行读操做。api

  • 使用自定义 Netpoll IO 池化操做带来的好处是:
    • 当可读事件触发时,从协程池中获取一个 goroutine 来执行读处理,而不是新分配一个 goroutine,以此来控制高并发下的协程数量
    • 当收到连接可读事件时,才真正为其分配 read buffer 以及相应的执行协程。这样 GetBytes() 能够下降由于大量空闲连接场景致使的额外协程和 read buffer 开销
  • 此模型适用于链接数较多、可读链接数量受限的状况,例如:mosn 做为 api gateway 的场景

本文整理自SOFAMosn官方文档微信

博主

我的微信公众号:并发

我的github:ide

github.com/jiankunking高并发

我的博客:性能

jiankunking.com优化

相关文章
相关标签/搜索