日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

提升您的 Go 應(yīng)用性能的六種方法

來源: 責(zé)編: 時間:2023-11-07 17:16:57 258觀看
導(dǎo)讀優(yōu)化您的 Go 應(yīng)用程序1. 如果您的應(yīng)用程序在 Kubernetes 中運行,請自動設(shè)置 GOMAXPROCS 以匹配 Linux 容器的 CPU 配額Go 調(diào)度器 可以具有與運行設(shè)備的核心數(shù)量一樣多的線程。由于我們的應(yīng)用程序在 Kubernetes 環(huán)境中

優(yōu)化您的 Go 應(yīng)用程序

1. 如果您的應(yīng)用程序在 Kubernetes 中運行,請自動設(shè)置 GOMAXPROCS 以匹配 Linux 容器的 CPU 配額

Go 調(diào)度器 可以具有與運行設(shè)備的核心數(shù)量一樣多的線程。由于我們的應(yīng)用程序在 Kubernetes 環(huán)境中的節(jié)點上運行,當(dāng)我們的 Go 應(yīng)用程序開始運行時,它可以擁有與節(jié)點中的核心數(shù)量一樣多的線程。由于許多不同的應(yīng)用程序在這些節(jié)點上運行,因此這些節(jié)點可能包含相當(dāng)多的核心。04928資訊網(wǎng)——每日最新資訊28at.com

通過使用 https://github.com/uber-go/automaxprocs,Go 調(diào)度器使用的線程數(shù)量將與您在 k8s yaml 中定義的 CPU 限制一樣多。04928資訊網(wǎng)——每日最新資訊28at.com

示例:04928資訊網(wǎng)——每日最新資訊28at.com

應(yīng)用程序 CPU 限制(在 k8s.yaml 中定義):1 核心 節(jié)點核心數(shù)量:6404928資訊網(wǎng)——每日最新資訊28at.com

通常情況下,Go 調(diào)度器會嘗試使用 64 個線程,但如果我們使用 automaxprocs,它將僅使用一個線程。04928資訊網(wǎng)——每日最新資訊28at.com

我觀察到在我實施這個方法的應(yīng)用程序中有相當(dāng)大的性能提升。約 60% 的 CPU 使用率,約 30% 的內(nèi)存使用率和約 30% 的響應(yīng)時間。04928資訊網(wǎng)——每日最新資訊28at.com

04928資訊網(wǎng)——每日最新資訊28at.com

2. 對結(jié)構(gòu)體字段進行排序

結(jié)構(gòu)體中字段的順序直接影響您的內(nèi)存使用情況。04928資訊網(wǎng)——每日最新資訊28at.com

例如:04928資訊網(wǎng)——每日最新資訊28at.com

type testStruct struct { testBool1  bool    // 1 byte testFloat1 float64 // 8 bytes testBool2  bool    // 1 byte testFloat2 float64 // 8 bytes}

您可能會認為這個結(jié)構(gòu)體將占用 18 字節(jié),但實際上不會。04928資訊網(wǎng)——每日最新資訊28at.com

func main() { a := testStruct{} fmt.Println(unsafe.Sizeof(a)) // 32 bytes}

這是因為在 64 位架構(gòu)中內(nèi)部內(nèi)存對齊的工作方式。04928資訊網(wǎng)——每日最新資訊28at.com

04928資訊網(wǎng)——每日最新資訊28at.com

many boxes showing 8 bytes of testbool1, testFIoat1, testbool2, testFIoat204928資訊網(wǎng)——每日最新資訊28at.com

我們?nèi)绾谓档蛢?nèi)存使用?我們可以根據(jù)內(nèi)存填充來對字段進行排序。04928資訊網(wǎng)——每日最新資訊28at.com

type testStruct struct { testFloat1 float64 // 8 bytes testFloat2 float64 // 8 bytes testBool1  bool    // 1 byte testBool2  bool    // 1 byte}func main() { a := testStruct{} fmt.Println(unsafe.Sizeof(a)) // 24 bytes}

04928資訊網(wǎng)——每日最新資訊28at.com

我們并不總是需要手動排序這些字段。您可以使用諸如 fieldalignment 等工具來自動對結(jié)構(gòu)體進行排序。04928資訊網(wǎng)——每日最新資訊28at.com

fieldalignment -fix ./... 

3. 垃圾回收調(diào)優(yōu)

在 Go 1.19 之前,我們只能使用 GOGC(runtime/debug.SetGCPercent) 來配置垃圾回收周期;然而,在某些情況下,我們可能會超出內(nèi)存限制。隨著 Go 1.19 的到來,我們現(xiàn)在擁有了 GOMEMLIMIT。GOMEMLIMIT 是一個新的環(huán)境變量,允許用戶限制 Go 進程可以使用的內(nèi)存量。這個功能提供了更好的控制 Go 應(yīng)用程序內(nèi)存使用的方式,防止它們使用過多的內(nèi)存導(dǎo)致性能問題或崩潰。通過設(shè)置 GOMEMLIMIT 變量,用戶可以確保其 Go 程序在系統(tǒng)上平穩(wěn)高效地運行,而不會對系統(tǒng)造成不必要的壓力。04928資訊網(wǎng)——每日最新資訊28at.com

它并不替代 GOGC,而是與之配合使用。您還可以禁用 GOGC 百分比配置,只使用 GOMEMLIMIT 來觸發(fā)垃圾回收。04928資訊網(wǎng)——每日最新資訊28at.com

04928資訊網(wǎng)——每日最新資訊28at.com

GOGC 設(shè)為 100 和內(nèi)存限制為 100MB04928資訊網(wǎng)——每日最新資訊28at.com

04928資訊網(wǎng)——每日最新資訊28at.com

GOGC 設(shè)為關(guān)閉(off)并且內(nèi)存限制為 10004928資訊網(wǎng)——每日最新資訊28at.com

在減少垃圾回收的運行量方面有明顯的效果,但在應(yīng)用此設(shè)置時需要小心。如果您不了解應(yīng)用程序的極限,請不要將 GOGC=off。04928資訊網(wǎng)——每日最新資訊28at.com

4. 使用 unsafe 包進行字符串 <-> 字節(jié)轉(zhuǎn)換而不進行復(fù)制

在字符串與字節(jié)之間進行轉(zhuǎn)換時,我們通常會進行變量的復(fù)制。但在 Go 內(nèi)部,這兩種類型通常使用 StringHeader 和 SliceHeader 值。我們可以在這兩種類型之間進行轉(zhuǎn)換,而不進行額外的分配。04928資訊網(wǎng)——每日最新資訊28at.com

// For Go 1.20 and higherfunc StringToBytes(s string) []byte { return unsafe.Slice(unsafe.StringData(s), len(s))}func BytesToString(b []byte) string { return unsafe.String(unsafe.SliceData(b), len(b))}// For lower versions// Check the example here// https://github.com/bcmills/unsafeslice/blob/master/unsafeslice.go#L116

諸如 fasthttp 和 fiber 等庫也在其內(nèi)部使用這種結(jié)構(gòu)。04928資訊網(wǎng)——每日最新資訊28at.com

注意: 如果您的字節(jié)或字符串值可能會在后續(xù)發(fā)生更改,請不要使用此特性。04928資訊網(wǎng)——每日最新資訊28at.com

5. 使用 jsoniter 替代 encoding/json

我們通常在代碼中使用 Marshal 和 Unmarshal 方法來進行序列化或反序列化。04928資訊網(wǎng)——每日最新資訊28at.com

Jsoniter 是 encoding/json 的 100% 兼容的替代品。04928資訊網(wǎng)——每日最新資訊28at.com

以下是一些性能基準(zhǔn):04928資訊網(wǎng)——每日最新資訊28at.com

04928資訊網(wǎng)——每日最新資訊28at.com

將其替換為 encoding/json 非常簡單:04928資訊網(wǎng)——每日最新資訊28at.com

import "encoding/json"json.Marshal(&data)json.Unmarshal(input, &data)import jsoniter "github.com/json-iterator/go"var json = jsoniter.ConfigCompatibleWithStandardLibraryjson.Marshal(&data)json.Unmarshal(input, &data)

6. 使用 sync.Pool 來減少堆分配

對象池背后的主要概念是避免重復(fù)創(chuàng)建和銷毀對象的開銷,這可能會對性能產(chǎn)生負面影響。04928資訊網(wǎng)——每日最新資訊28at.com

緩存先前分配但未使用的項目有助于減輕垃圾回收器的負擔(dān),并允許稍后重新使用它們。04928資訊網(wǎng)——每日最新資訊28at.com

以下是一個示例:04928資訊網(wǎng)——每日最新資訊28at.com

type Person struct { Name string}var pool = sync.Pool{ New: func() any {  fmt.Println("Creating a new instance")  return &Person{} },}func main() { person := pool.Get().(*Person) fmt.Println("Get object from sync.Pool for the first time:", person) person.Name = "Mehmet" fmt.Println("Put the object back in the pool") pool.Put(person) fmt.Println("Get object from pool again:", pool.Get().(*Person)) fmt.Println("Get object from pool again (new one will be created):", pool.Get().(*Person))}//Creating a new instance//Get object from sync.Pool for the first time: &{}//Put the object back in the pool//Get object from pool again: &{Mehmet}//Creating a new instance//Get object from pool again (new one will be created): &{}

通過使用 sync.Pool,我解決了 New Relic Go Agent 中的內(nèi)存泄漏問題。以前,它為每個請求創(chuàng)建一個新的 gzip writer。我創(chuàng)建了一個池,以便代理程序可以使用該池中的 writer,而不是為每個請求創(chuàng)建新的 gzip writer 實例,從而大大減少了堆使用,并因此減少了系統(tǒng)的垃圾回收次數(shù)。這個改進大約將我們應(yīng)用程序的 CPU 使用率降低了約 40%,內(nèi)存使用率降低了約 22%。04928資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-17553-0.html提升您的 Go 應(yīng)用性能的六種方法

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Angular 發(fā)布新文檔、新 Logo

下一篇: Python:求求按規(guī)范寫我

標(biāo)簽:
  • 熱門焦點
  • 多線程開發(fā)帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結(jié)束訪問某一數(shù)據(jù)期間,該數(shù)據(jù)被其他的線程所修改,那么對于當(dāng)前線程而言,該線程
  • 猿輔導(dǎo)與新東方的兩種“歸途”

    作者|卓心月 出品|零態(tài)LT(ID:LingTai_LT)如何成為一家偉大企業(yè)?答案一定是對&ldquo;勢&rdquo;的把握,這其中最關(guān)鍵的當(dāng)屬對企業(yè)戰(zhàn)略的制定,且能夠站在未來看現(xiàn)在,即使這其中的
  • 一條抖音4億人圍觀 ! 這家MCN比無憂傳媒還野

    作者:Hiu 來源:互聯(lián)網(wǎng)品牌官01 擦邊少女空降熱搜,幕后推手曝光被網(wǎng)友譽為&ldquo;純欲天花板&rdquo;的女網(wǎng)紅井川里予,近期因為一組哥特風(fēng)照片登上熱搜,引發(fā)了一場互聯(lián)網(wǎng)世界關(guān)于
  • 年輕人的“職場羞恥感”,無處不在

    作者:馮曉亭 陶 淘 李 欣 張 琳 馬舒葉來源:燃次元&ldquo;人在職場,應(yīng)該選擇什么樣的著裝?&rdquo;近日,在網(wǎng)絡(luò)上,一個與著裝相關(guān)的帖子引發(fā)關(guān)注,在該帖子里,一位在高級寫字樓亞洲金
  • 華為Mate 60保護殼曝光:碩大后置相機模組 凸起程度有驚喜

    這段時間以來,關(guān)于華為新旗艦的爆料日漸密集。據(jù)此前多方爆料,今年華為將開始恢復(fù)一年雙旗艦戰(zhàn)略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • iQOO Neo8 Pro評測:旗艦雙芯加持 最強性能游戲旗艦

    【Techweb評測】去年10月,iQOO推出了一款Neo7手機,該機搭載了聯(lián)發(fā)科天璣9000+,配備獨顯芯片Pro+,帶來了同價位段最佳的游戲體驗,一經(jīng)上市便受到了諸多用
  • 回歸OPPO兩年,一加贏了銷量,輸了品牌

    成為OPPO旗下主打性能的先鋒品牌后,一加屢創(chuàng)佳績。今年618期間,一加手機全渠道銷量同比增長362%,憑借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
  • 英特爾Xe-HP項目終止,將專注Xe-HPC/HPG系列顯卡

    據(jù)10 月 31 日消息報道,英特爾高級副總裁兼加速計算系統(tǒng)和圖形事業(yè)部總經(jīng)理 表示,Xe-HP“ Arctic Sound” 系列服務(wù)器 GPU 已經(jīng)應(yīng)用于 oneAPI devcloud 云服
  • onebot M24巧系列一體機采用輕薄機身設(shè)計,現(xiàn)已在各平臺開售

    onebot M24 巧系列一體機目前已在線上線下各平臺同步開售。onebot M24 巧系列采用一體化輕薄機身設(shè)計,最薄處為 10.15mm,擁有寶石紅、午夜藍、石墨綠、雅致
Top 主站蜘蛛池模板: 长丰县| 嘉定区| 南丹县| 崇信县| 祥云县| 青浦区| 淅川县| 凤山市| 沾益县| 永济市| 聂拉木县| 保德县| 阳东县| 车致| 孝义市| 石狮市| 龙川县| 监利县| 宣威市| 会同县| 龙州县| 湘潭市| 平和县| 绩溪县| 德化县| 南宫市| 宁夏| 当涂县| 鄱阳县| 绩溪县| 陕西省| 潮安县| 惠安县| 石台县| 云林县| 恩平市| 通渭县| 广德县| 巨野县| 吉木萨尔县| 阿拉善右旗|