博客 / 詳情

返回

What’s new in Apache/dubbo-getty 1.4.10

1 概述

Dubbo-Getty 1.4.10 版本帶來了一些重要的改進和修復,旨在提高性能和穩定性,不過依然堅持 “Getty 只考慮使用 Go 語言原生的網絡接口,如果遇到網絡性能瓶頸也只會在自身層面尋找優化突破點” 【Go 語言網絡庫 getty 的那些事】。

以下是本次發佈的主要亮點和更新。

2 主要更新

2.1 Timer 優化算法禁用

2016 年開始構建 getty 網絡庫時,當時 Go 語言的 timer 實現很低效,有一個有名的 “一把全局大鎖” 的問題 (the global timers mutex),詳見 issue https://github.com/golang/go/issues/15133 。Getty 借鑑當時 fasthttp 的實現,在使用 SetReadDeadline 和 SetWriteDeadline 兩個函數時,有如下類似代碼:

    // Optimization: update read deadline only if more than 25%
    // of the last read deadline exceeded.
    // See https://github.com/golang/go/issues/15133 for details.
    currentTime = time.Now()
    if currentTime.Sub(t.rLastDeadline.Load()) > t.rTimeout.Load()>>2 {
        if err = t.conn.SetReadDeadline(currentTime.Add(t.rTimeout.Load())); err != nil {
            // just a timeout error
            return 0, perrors.WithStack(err)
        }
        t.rLastDeadline.Store(currentTime)
    }

2021 年拼多多的朋友發現這項 “優化” 會造成超時時間 “漂移” 問題,詳見 https://github.com/AlexStocks/getty/issues/14#issuecomment-972583219。

近幾年隨着 Go Timer 的性能優化,Go 1.1x 版本能做到把每個 timer 綁定多核減小鎖粒度,Go 1.2x 已經通過 “時間輪” 進一步優化,timer 已經沒有了 CPU 使用率過高的問題,詳見 https://github.com/golang/go/issues/15133#issuecomment-271571395 。

所以在 PR https://github.com/apache/dubbo-getty/pull/109 中禁用了 SetReadDeadline 和 SetWriteDeadline 優化算法。這個更改將有助於減少不必要的性能開銷,並確保應用程序能夠更高效地處理 I/O 操作。

2.2 Go 版本升級

PR https://github.com/apache/dubbo-getty/pull/112/files 將 Go 語言版本從 1.14 升級到 1.20。這個升級不僅帶來了 Go 語言的新特性和改進,還提高了整體的安全性和穩定性:

  • 使用 os.ReadFile 替換了 ioutil.ReadFile
  • 使用 net.Timeout 替換了 net. Temporary

2.3 添加網絡任務處理時先 check 連接是否關閉

當請求過多時,Getty 一直在調用 encode 或者 decode 邏輯導致 CPU 飆升,從消息和請求時間結合看的話,應該是請求過多。

在 PR https://github.com/apache/dubbo-getty/pull/108 中,在 conn close 的時候直接把相關過時的網絡請求拋掉,不做這些耗 CPU 的邏輯。

2.4 修復 TLS 死循環 bug

Getty 支持 TCP/UDP/Websocket 三種通信協議,在 TCP 之上還提供了 TLS 安全通信,近期杭州一家公司的朋友在使用 TLS 時發現一個死循環 bug:把 demo/hello/tls/server/server.go 服務跑起來,然後用 telnet 127.0.0.1 8090服務端程序就會陷入死循環,把一個 CPU 打滿。

其原因是 TLS 握手時沒有設置超時時間。這位朋友在 PR https://github.com/apache/dubbo-getty/pull/115 中修復了該 bug。

3 貢獻者

感謝以下貢獻者對 Dubbo-Getty 1.4.10 版本的支持和貢獻【排名不分先後,依據字母序列】:

  • DMwangnima
  • hongshengjie
  • Lvnszn

alexstocks/getty 作為 dubbo-getty 的上游倉庫,已經在 PR https://github.com/AlexStocks/getty/pull/79 中吸收了本次更新,將要發佈的 alexstocks/getty v1.3.3 中將會包含這些更新。

4 社區

如果你有任何疑問,歡迎加社區助手微信號 "PikiwiDB" 為好友,並備註 “dubbogo”,它會邀請你進入社區微信羣進行交流。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.