0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Go運行時:4年之后

jf_WZTOguxH ? 來源:InfoQ ? 作者:Michael Knyszek ? 2022-11-30 16:21 ? 次閱讀

自 2018 年以來,Go GC,以及更廣泛的 Go 運行時,一直在穩(wěn)步改進(jìn)。近日,Go 社區(qū)總結(jié)了 4 年來 Go 運行時的一些重要變化。

這些重要變化主要是:

sync.Pool 是一種 GC 感知的重用內(nèi)存的工具,具有較低的延遲影響,并且能夠比之前更有效地回收內(nèi)存。(Go 1.13)

Go 運行時能夠更主動地將不需要的內(nèi)存返回給操作系統(tǒng),減少了內(nèi)存消耗和出現(xiàn)內(nèi)存不足的可能性。這將減少最高 20% 的空閑內(nèi)存消耗。(Go 1.13 和 1.14)

在許多情況下,Go 運行時能夠更容易地?fù)屨?goroutine,最高可減少 90% 的 stop-the-world 延遲。(Go 1.14)

Go 運行時能夠比以前更有效地管理計時器,特別是在擁有多核 CPU 的機(jī)器上。(Go 1.14)

在大多數(shù)情況下,現(xiàn)在使用 defer 語句的函數(shù)調(diào)用的開銷與常規(guī)函數(shù)調(diào)用一樣少。點擊這里觀看 Gophercon 2020 的相關(guān)演講。(Go 1.14)

內(nèi)存分配器的慢路徑對 CPU 核心的伸縮性更好,將吞吐量提升了最多 10%,并將尾部延遲降低了最多 30%,特別是在高度并行的程序中。(Go 1.14 和 1.15)

Go 內(nèi)存統(tǒng)計數(shù)據(jù)現(xiàn)在可以通過更細(xì)粒度、更靈活、更高效的 API(runtime/metrics 包)來訪問。這將獲取運行時統(tǒng)計信息的延遲減少了兩個數(shù)量級(從毫秒到微秒)。(Go 1.16)

Go 調(diào)度器在尋找新任務(wù)時花費的 CPU 時間減少了 30%。(Go 1.17)

Go 代碼現(xiàn)在在 amd64、arm64 和 ppc64 上遵循基于寄存器的調(diào)用約定,將 CPU 效率提升了最多 15%。(Go 1.17 和 1.18)

Go GC 的內(nèi)部審計和調(diào)度已經(jīng)進(jìn)行了重新設(shè)計,解決了長期存在的各種與效率和健壯性相關(guān)的問題。對于 goroutine 占內(nèi)存使用很大一部分的應(yīng)用程序來說,這顯著降低了應(yīng)用程序的尾部延遲(最高達(dá) 66%)。(Go 1.18)

Go GC 現(xiàn)在在應(yīng)用程序空閑時會限制自己的 CPU 使用。這將空閑應(yīng)用程序的 GC 周期的 CPU 使用降低了 75%,從而減少可能導(dǎo)致作業(yè)調(diào)度器混淆的 CPU 峰值。(Go 1.19)

這些變化對用戶來說大多是看不見的——他們只需要升級 Go,就可以看到他們所熟悉和喜愛的 Go 代碼運行得更好了。

一個新的“旋鈕”Go 1.19 帶來了一個期待已久的特性,使用這個特性需要做一些額外的工作,但它具備很大的潛力:Go 運行時的軟內(nèi)存限制。

多年來,Go GC 只有一個調(diào)優(yōu)參數(shù)——GOGC。GOGC 允許用戶在 CPU 開銷和內(nèi)存開銷之間做出權(quán)衡。多年來,這個“旋鈕”為 Go 社區(qū)提供了很好的服務(wù),被用在各種各樣的場景中。

Go 運行時團(tuán)隊一直不愿意在 Go 運行時中添加新的旋鈕,他們的理由很充分——每個新的旋鈕代表了配置空間中的一個新的維度,我們需要對其進(jìn)行測試和維護(hù),而且可能要永遠(yuǎn)持續(xù)下去。旋鈕的激增也給 Go 開發(fā)人員增加了理解和使用它們的負(fù)擔(dān),隨著旋鈕的增多,情況會變得愈加困難。因此,Go 運行時總是傾向于用最小配置實現(xiàn)合理的行為。

那么為什么要添加內(nèi)存限制旋鈕呢?

內(nèi)存不像 CPU 時間那么具有可互換性。對于 CPU 時間,如果稍等片刻,將來總會得到更多的 CPU 時間。但對于內(nèi)存,你所擁有的總是有限的。

內(nèi)存限制解決了兩個問題。

首先,當(dāng)應(yīng)用程序的內(nèi)存使用峰值不可預(yù)測時,僅靠 GOGC 幾乎無法防止內(nèi)存被耗盡。如果只使用 GOGC,Go 運行時根本不知道它有多少可用的內(nèi)存。通過設(shè)置內(nèi)存限制,運行時能夠意識到什么時候需要更努力地工作以減少內(nèi)存開銷,從而使運行時能夠健壯地應(yīng)對瞬時的、可恢復(fù)的負(fù)載峰值。

第二是為了避免不使用內(nèi)存限制時出現(xiàn)的內(nèi)存不足。我們必須根據(jù)內(nèi)存峰值調(diào)優(yōu) GOGC,而為了保持較低的內(nèi)存開銷會導(dǎo)致更高的 GC CPU 開銷,即使應(yīng)用程序沒有處于內(nèi)存使用峰值且有足夠的可用內(nèi)存。這在容器化的環(huán)境中尤其重要。在容器化的環(huán)境中,程序被部署在具有獨立預(yù)留內(nèi)存的容器中。設(shè)置內(nèi)存限制可以為峰值負(fù)載提供保護(hù),并可以針對 CPU 開銷更主動地調(diào)優(yōu) GOGC。

內(nèi)存限制的設(shè)計旨在易用性和健壯性。例如,它是對應(yīng)用程序中 Go 部分的整個內(nèi)存占用的限制,而不僅僅是 Go 的堆,因此用戶不需要額外計算 Go 運行時的開銷。運行時還會根據(jù)內(nèi)存限制調(diào)整其內(nèi)存清除策略,以便在內(nèi)存出現(xiàn)壓力時更主動地將內(nèi)存返回給操作系統(tǒng)。

雖然內(nèi)存限制是一個強(qiáng)大的工具,但在使用時仍然要謹(jǐn)慎。其中一個需要注意的地方是,它會讓你的程序陷入 GC 抖動狀態(tài)——在這種狀態(tài)下,程序運行 GC 的時間過多,導(dǎo)致沒有足夠的時間來處理其他任務(wù)。例如,如果內(nèi)存限制設(shè)置得比程序?qū)嶋H需要的內(nèi)存少,Go 程序可能會崩潰。以前不太可能出現(xiàn) GC 抖動,除非顯式對 GOGC 進(jìn)行了大量調(diào)優(yōu)。我們選擇讓內(nèi)存耗盡而不是陷入抖動狀態(tài),因此作為一種緩解措施,運行時將 GC 限制為總 CPU 時間的 50%,即使這樣會超過內(nèi)存限制。

所有這些都需要慎重考慮,因此,作為這項工作的一部分,我們發(fā)布了一個新的 GC 指南,其中包含了交互式可視化的圖表,以幫助你們理解 GC 成本以及如何操作它們。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10769

    瀏覽量

    210420
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2942

    瀏覽量

    73727
  • Go
    Go
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    12233

原文標(biāo)題:Go 運行時:4 年之后

文章出處:【微信號:AI前線,微信公眾號:AI前線】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    C2000?MCU的運行時堆棧大小監(jiān)測

    電子發(fā)燒友網(wǎng)站提供《C2000?MCU的運行時堆棧大小監(jiān)測.pdf》資料免費下載
    發(fā)表于 09-11 09:30 ?0次下載
    C2000?MCU的<b class='flag-5'>運行時</b>堆棧大小監(jiān)測

    三菱plc累計運行時間怎么編程

    具有重要意義。本文將詳細(xì)介紹如何使用三菱PLC編程實現(xiàn)累計運行時間的統(tǒng)計功能。 一、概述 累計運行時間是指設(shè)備或系統(tǒng)在一定時間內(nèi)的總運行時間。在工業(yè)生產(chǎn)中,對設(shè)備的累計運行時間進(jìn)行統(tǒng)計
    的頭像 發(fā)表于 06-20 11:31 ?1768次閱讀

    變頻器帶動電機(jī)運行時發(fā)抖的原因及處理方法

    變頻器作為現(xiàn)代工業(yè)控制領(lǐng)域的重要設(shè)備,廣泛應(yīng)用于電機(jī)調(diào)速控制中。然而,在實際應(yīng)用中,有時會遇到變頻器帶動電機(jī)運行時產(chǎn)生抖動的問題。這種抖動不僅影響電機(jī)的正常運行,還可能對生產(chǎn)效率和設(shè)備壽命造成
    的頭像 發(fā)表于 05-31 14:43 ?4692次閱讀

    stm32cubeIDE代碼運行時間如何查看?

    stm32cubeIDE 代碼運行時間,如何查看?就如 keil 調(diào)試時候那樣,可以測試代碼的運行時間。但是在stm32cubeIDE 中,一直沒有找到這個功能,不知道哪位高人可以提示下在哪里查看的?
    發(fā)表于 04-16 08:10

    如何在運行時擦除/編程UCB?

    我有一個項目需要在現(xiàn)場更新 SOTA。 這需要在運行時更新必要的 UCB 值。 我已經(jīng)看過擦除/編程 PFLASH 和 DFLASH 的示例代碼,但我還沒有找到任何特定于 UCB 內(nèi)存的代碼。 我
    發(fā)表于 01-22 07:18

    變壓器空載運行時功率因數(shù)很低是什么原因?

    變壓器空載運行時功率因數(shù)很低是什么原因? 變壓器空載運行時功率因數(shù)很低的原因有多種可能,以下將逐一介紹這些可能性。 1. 磁化電流造成的功率因數(shù)低:當(dāng)變壓器空載運行時,變壓器的鐵芯需要維持磁通的運動
    的頭像 發(fā)表于 01-19 13:58 ?3628次閱讀

    變頻電機(jī)低速運行時,轉(zhuǎn)速變化大嗎?詳解轉(zhuǎn)速變化的影響因素

    變頻電機(jī)低速運行時,轉(zhuǎn)速變化大嗎?詳解轉(zhuǎn)速變化的影響因素? 變頻電機(jī)低速運行時,轉(zhuǎn)速變化較小的原因有多個。下面將從電機(jī)結(jié)構(gòu)、電機(jī)參數(shù)、負(fù)載特性等方面詳細(xì)解釋這些影響因素。 1. 電機(jī)結(jié)構(gòu) 變頻電機(jī)
    的頭像 發(fā)表于 12-21 10:50 ?1005次閱讀

    jvm管理的內(nèi)存包括哪幾個運行時數(shù)據(jù)內(nèi)存

    JVM(Java虛擬機(jī))是Java程序的運行環(huán)境,它提供了內(nèi)存管理機(jī)制來管理Java程序所需的運行時數(shù)據(jù)內(nèi)存。這些運行時數(shù)據(jù)內(nèi)存包括堆內(nèi)存、棧內(nèi)存、方法區(qū)(元數(shù)據(jù)區(qū))、程序計數(shù)器和本地方法棧。下面將
    的頭像 發(fā)表于 12-05 14:09 ?470次閱讀

    jvm運行時內(nèi)存區(qū)域劃分

    JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫,它是Java編程語言的運行環(huán)境。JVM的主要功能是將Java源代碼轉(zhuǎn)換為機(jī)器代碼,并且在運行時管理Java程序的內(nèi)存。JVM
    的頭像 發(fā)表于 12-05 14:08 ?470次閱讀

    西門子SCL編程50臺電機(jī)運行時間累計方法

    當(dāng)RUN信號為TRUE時,開始計時,為FALSE時停止計時,單次運行時間清零,長按RESET為5秒時,單次和總運行時間都清零。
    發(fā)表于 11-27 09:59 ?1672次閱讀
    西門子SCL編程50臺電機(jī)<b class='flag-5'>運行時</b>間累計方法

    如何在 CFD 設(shè)計中利用網(wǎng)格維護(hù)幾何形狀并減少運行時間?

    如何在 CFD 設(shè)計中利用網(wǎng)格維護(hù)幾何形狀并減少運行時間?
    的頭像 發(fā)表于 11-24 17:07 ?444次閱讀
    如何在 CFD 設(shè)計中利用網(wǎng)格維護(hù)幾何形狀并減少<b class='flag-5'>運行時</b>間?

    MES如何幫助增加機(jī)器正常運行時

    ? ? ? ?實施制造執(zhí)行系統(tǒng)(MES)的好處很多。其中,MES軟件可以通過多種方式幫助增加機(jī)器的正常運行時間。正常運行時間是指制造機(jī)械或設(shè)備的效率和可用性。每當(dāng)機(jī)器停機(jī)(無論原因如何)時,制造商
    發(fā)表于 11-14 15:28 ?2次下載

    如何保證它們?nèi)萜?b class='flag-5'>運行時的安全?

    緊密耦合的容器運行時繼承了主機(jī)操作系統(tǒng)的安全態(tài)勢和攻擊面。運行時或主機(jī)內(nèi)核中的任何漏洞及其利用都會成為攻擊者的潛在切入點。
    的頭像 發(fā)表于 11-03 15:24 ?596次閱讀

    AUTOSAR CP運行時環(huán)境與應(yīng)用軟件

    運行時環(huán)境(RTE) AUTOSAR CP運行時環(huán)境(RTE)是AUTOSAR架構(gòu)中的核心組件,它實現(xiàn)了AUTOSAR虛擬功能總線(VFB)的接口,并提供了通信基礎(chǔ)設(shè)施和訪問基礎(chǔ)軟件組件(如操作系統(tǒng)
    的頭像 發(fā)表于 10-27 15:44 ?1223次閱讀
    AUTOSAR CP<b class='flag-5'>運行時</b>環(huán)境與應(yīng)用軟件

    MDK中怎么看程序的運行時間?

    如何才能觀察一段程序的運行時
    發(fā)表于 10-25 08:08