Go開發團隊公布在最新1.19版本的Runtime,添加了一個軟性記憶體限制功能,讓開發者可以控制應用程式所使用的記憶體容量,使Runtime在應用程式負載尖峰時仍可以維持穩定運作。

記憶體限制是一個Go社群長期要求的功能,過去Go的垃圾回收只有一個調校參數GOGC,GOGC供用戶調整Go垃圾回收GPU和記憶體額外開銷的權衡,官方解釋,他們過去之所以不願意在Go Runtime添加新的控制旋鈕,是因為每一個旋鈕都代表,在測試和維護的配置空間永遠增加一個新維度,這也會帶給Go開發人員額外的理解和使用負擔,因此他們傾向在Go Runtime盡量保持最少的配置。

但現在Go團隊決定在Go 1.19版本的Runtime添加記憶體限制功能,他們解釋,記憶體不像是CPU時間可以替代,開發者可以稍待片刻以獲得更多的CPU時間,記憶體容量固定且有限。而記憶體限制可以解決兩個主要問題,第一,當應用程式的記憶體使用峰值不可預測時,原本的GOGC無法保護系統免於記憶體不足的風險,僅使用GOGC,Go Runtime無法確定目前有多少記憶體可以使用。

但透過配置記憶體限制,Runtime可以掌握需要積極減少記憶體開銷的時機,因此可以更強健穩定的度過瞬間負載峰值期。

第二個原因是,要避免在不使用記憶體限制的情況出現記憶體不足的錯誤,GOGC需要根據記憶體峰值進行調校,這代表Runtime要以較低的記憶體花費執行垃圾回收,就需要花費更多的CPU開銷,即便應用程式並未處在記憶體峰值期間,或是當時還有許多記憶體可供使用。

而這個情況之所以會在容器化的應用中受到關注,因為程式會被放置在特定且隔離,事先預留記憶體的沙盒中執行,因此記憶體限制反而可以利用這個機制,提供負載峰值保護,使GOGC在CPU花費方面進行更積極的調整。

Go團隊以容易使用和強健性,作為設計記憶體限制功能的核心思想,能夠限制應用程式中Go部分的所有記憶體占用,而非只是Go堆(Heap),因此用戶不用擔心Go Runtime的執行時開銷,同時Runtime也會根據記憶體限制調整記憶體清理政策,更主動地將記憶體還給作業系統,以回應記憶體壓力。

但開發團隊提醒開發者,雖然記憶體限制是一個強大的工具,但仍必須謹慎使用,因為可能會讓應用程式出現垃圾回收不穩的情況,當應用程式花費太多的時間執行垃圾回收,導致沒有足夠的時間花在真正有意義的程序上,像是當記憶體限制太低,而無法滿足應用程式實際所需的記憶體量,Go應用程式便可能發生崩潰。

在記憶體限制使用上,開發者需要考慮更多部分,可以參考官方新發布的垃圾回收指南,進一步了解垃圾回收成本以及操作辦法。

熱門新聞

Advertisement