第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Go 如何以及何時(shí)為有界隊(duì)列通道分配內(nèi)存?

Go 如何以及何時(shí)為有界隊(duì)列通道分配內(nèi)存?

Go
偶然的你 2022-07-25 10:33:08
我正在使用 Go 的 pprof 工具來(lái)調(diào)查我的服務(wù)的內(nèi)存使用情況。幾乎所有的內(nèi)存使用都來(lái)自一個(gè)設(shè)置多個(gè)有界隊(duì)列通道的函數(shù)。我對(duì) pprof 在這里告訴我的內(nèi)容有些困惑:$ go tool pprof ~/pprof/pprof.server.alloc_objects.alloc_space.inuse_objects.inuse_space.007.pb.gzFile: serverType: inuse_spaceTime: Dec 21, 2020 at 10:46am (PST)Entering interactive mode (type "help" for commands, "o" for options)(pprof) list fooTotal: 102.73MBROUTINE ======================== github.com/******/foo in ***.go   79.10MB    79.10MB (flat, cum) 77.00% of Total         .          .    135:         .          .    136:func foo() {         .          .    137:       14.04MB    14.04MB    138:    chanA := make(chan chanAEntry, bufferSize)         .          .    139:    defer close(chanA)         .          .    140:         .          .    141:       19.50MB    19.50MB    142:    chanB := make(chan chanBCEntry, bufferSize)         .          .    143:    defer close(chanB)         .          .    144:         .          .    145:       27.53MB    27.53MB    146:    chanC := make(chan chanBCEntry, bufferSize)         .          .    147:    defer close(chanC)         .          .    148:         .          .    149:        7.92MB     7.92MB    150:    chanD := make(chan chanDEntry, bufferSize)         .          .    151:    defer close(chanD)         .          .    152:看起來(lái)第 142 行負(fù)責(zé) 19.50MB 的分配,第 146 行負(fù)責(zé) 27.53MB,但這些行做的是同樣的事情——它們創(chuàng)建具有相同輸入類型和相同容量的緩沖通道。這是 pprof 進(jìn)行隨機(jī)抽樣這一事實(shí)的產(chǎn)物嗎?Go 是否會(huì)延遲分配通道(fwiw,在讓服務(wù)運(yùn)行幾天后,這些值最終會(huì)均衡)?pprof 是否報(bào)告了沿通道發(fā)送的對(duì)象所需的內(nèi)存以及通道本身所需的內(nèi)存?
查看完整描述

1 回答

?
ITMISS

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊

好的,我相信我已經(jīng)想通了。看起來(lái) Go 急切地分配并且差異只是由于 Go 內(nèi)存分析器采樣的方式。

Go 急切地分配通道內(nèi)存

承諾的文檔_make

通道的緩沖區(qū)使用指定的緩沖區(qū)容量進(jìn)行初始化。

我查看了makechan的代碼,它在make(chan chantype, size). 它總是直接調(diào)用mallocgc- 沒(méi)有懶惰。

查看mallocgc的代碼,我們可以確認(rèn)其中沒(méi)有惰性mallocgc(除了文檔注釋沒(méi)有提到惰性,直接mallocgc調(diào)用c.alloc)。

pprof 在堆分配級(jí)別采樣,而不是在調(diào)用函數(shù)級(jí)別

在環(huán)顧四周mallocgc時(shí),我發(fā)現(xiàn)了分析代碼。在每次mallocgc調(diào)用中,Go 都會(huì)檢查是否滿足其采樣條件。如果是這樣,它會(huì)調(diào)用mProf_Malloc將記錄添加到堆配置文件中。我無(wú)法確認(rèn)這是 使用的配置文件pprof,但該文件中的注釋表明它是。

采樣條件基于自上次采樣以來(lái)分配的字節(jié)數(shù)(它從指數(shù)分布中抽取樣本,平均而言,在每個(gè)runtime.MemProfileRate字節(jié)分配后)。

這里的重要部分是每次調(diào)用mallocgc都有一定的抽樣概率,而不是每次調(diào)用foo. 這意味著如果對(duì) 的調(diào)用對(duì)foo進(jìn)行多次調(diào)用mallocgc,我們預(yù)計(jì)只會(huì)對(duì)部分mallocgc調(diào)用進(jìn)行采樣。

把它們放在一起

每次我的函數(shù)foo運(yùn)行時(shí),它都會(huì)急切地為 4 個(gè)通道分配內(nèi)存。在每次內(nèi)存分配調(diào)用中,Go 都有機(jī)會(huì)記錄堆配置文件。平均而言,Go 將每 512kB 記錄一次堆配置文件(runtime.MemProfileRate 的默認(rèn)值)。由于這些通道的總大小為 488kB,平均而言,我們預(yù)計(jì)每次foo調(diào)用只記錄一個(gè)分配。我上面分享的配置文件是在服務(wù)重啟后相對(duì)較快的,所以分配字節(jié)數(shù)的差異是純統(tǒng)計(jì)差異的結(jié)果。讓服務(wù)運(yùn)行一天后,配置文件穩(wěn)定下來(lái),顯示第 142 行和第 146 行分配的字節(jié)數(shù)相等。


查看完整回答
反對(duì) 回復(fù) 2022-07-25
  • 1 回答
  • 0 關(guān)注
  • 80 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)