經過SOFAMosn瞭解goroutine只能在必定併發量級上下降併發編程的難度(goroutine內存佔用2kb+)。 高併發的場景仍是NIO比較適合。git
GoLang 的轉發性能比起 C++ 確定是稍有遜色的,爲了儘量的提升 MOSN 的轉發性能,咱們在線程模型上進行優化,當前 MOSN 支持兩種線程模型,用戶可根據場景選擇開啓適用的模型。github
以下圖所示,使用 GoLang 默認的 epoll 機制,對每一個鏈接分配獨立的讀寫協程進行阻塞讀寫操做,proxy 層作轉發時,使用常駐 worker 協程池負責處理 Stream Event編程
以下圖所示,基於 Netpoll 重寫 epoll 機制,將 IO 和 PROXY 均進行池化,downstream connection 將自身的讀寫事件註冊到 netpoll 的 epoll/kqueue wait 協程,epoll/kqueue wait 協程接受到可讀事件,觸發回調,從協程池中挑選一個執行讀操做。api
本文整理自SOFAMosn官方文檔微信
我的微信公衆號:併發
我的github:ide
我的博客:性能