Go 1.12最新特性 - 實際項目爲背景的詳解

做者:lni (https://github.com/lni)git

Go 1.12帶來了正式的Go module支持、初步的TLS 1.3支持、runtime和標準庫作了各項提升,工具也有所改進,trace方面引入minimum mutator utilization圖的支持方便GC性能的調校。github

本文經過近期發佈的高性能分佈式共識庫Dragonboat爲背景,從實際項目角度詳解各新特性。golang

Go Module支持算法

上個Go發佈版本的初步Go module支持是默認關閉的,這暗示了它留有不少實現問題,事實上當時replace的支持連module、package、import path三個最基本概念都是含混的。Go 1.12中這些問題都獲得瞭解決,Go module的正式發佈又關閉了一條無腦噴Go的路徑,真正的Go用戶能夠更安心方便的使用Go。安全

Dragonboat爲例,對普通用戶,下列兩行的一個go.mod就完整定義了Dragonboat庫的依賴狀況。服務器

module github.com/lni/dragonboat

require github.com/golang/protobuf v1.2.0

Dragopnboat所用的Monkey Test須要Drummer包,它的額外依賴中含有golang.org下的數個包。咱們須要用位於github.com上的官方鏡像來代替它們。Go module的replace支持能夠經過在go.mod文件中增長下列替換條目,將受影響的import path進行替換。示例以下:分佈式

replace (
  golang.org/x/build => github.com/golang/build v0.0.0-20190215225244-0261b66eb045
  golang.org/x/text => github.com/golang/text v0.3.0
)

更低的STW延遲函數

Go 1.12版的STW停頓較1.11版又有明顯的縮短。下圖是Dragonboat在每秒處理超過800萬次16字節的Proposals時由runtime.ReadMemStats報告的120個連續GC週期的STW停頓值,1.12與1.11對比,STW明顯降低,由350微秒降至250微秒左右。工具

Minimum Mutator Utilization圖的支持性能

Mutator Utilization衡量的是GC耗費的資源外應用究竟得到了多少CPU資源。Minimum Mutator Utilization圖則是在不一樣的時間窗口上呈現應用至少能夠得到多少CPU資源。Go 1.12的trace工具加入了Minimum Mutator Utilization圖的支持,它能夠及其方便的發現GC性能受限的狀況。

下圖是Dragonboat在處理16字節的proposals時候的Minimum Mutator Utilization圖。圖上可見,在時間窗口小於250微秒的時候,應用最壞狀況下得不到任何CPU,這是由於STW的長度基本就是250微秒。而當時間窗口不斷放大,Minimum Mutator Utilization快速上升並趨向於100%並最後基本穩定於98%左右。這表示從整個trace的執行週期看(最大時間窗口),最壞狀況下應用能夠保證獲得98%的CPU時間。可見,本例沒有任何針對GC優化的價值了。

Dragonboat在處理1024字節的proposals時候的Minimum Mutator Utilization圖則展示了另一個局面。在1.3毫秒內,應用最壞狀況能夠得到的CPU資源都是0,暗示此時STW比16字節時高一個數量級。而隨着時間窗口的擴大,Minimum Mutator Utilization逐漸逼近並穩定於90%左右,從整個trace的執行週期看,最壞狀況下應用能夠保證獲得90%的CPU時間。更高的STW、更多的GC所佔用的CPU資源都清楚顯示在此場景下繼續作內存使用的優化是必定預期收益的,Minimum Mutator Utilization至關直觀方便。

初步的TLS 1.3支持

Go 1.12較爲及時的提供了初步的TLS 1.3支持。TLS 1.3淘汰了DES、MD五、RC四、SHA1之類的博物館級別的老舊且有明確安全隱患的算法,支持一個RTT完成所需準備創建安全連接。

Go 1.12內建的TLS 1.3性能跑分來看,TLS 1.3的跑分性能和1.2差異不大,將來也還有必定優化空間。有興趣的能夠在本身的目標服務器上測試跑分性能:

go test -v crypto/tls -run=$^ -bench BenchmarkThroughput

TLS 1.3的0-RTT特性還沒有提供支持,該功能自己的安全隱患的討論,與Go這種通用語言的標準庫實現並沒有太大關係,這裏不展開。

其它各項改進

Dragonboat這樣的高性能、分佈式系統庫相關的一些改進還有:

  • Timer與Deadline的性能獲得了優化,connection上的deadline設置的代價下降了
  • TCP KeepAlive默認啓用
  • os包開始提供UserHomeDir函數,再也不須要用第三方庫來跨平臺支持了
  • macOS的上調用File.Sync並不能確保實際落盤的問題獲得瞭解決

具體全部的改進和變動能夠看1.12文檔

最後,感謝閱讀,並請訪問Dragonboat的github頁面點star支持。謝謝!

相關文章
相關標籤/搜索