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優化

相關文章
相關標籤/搜索