V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  yongbozou  ›  全部回复第 1 页 / 共 1 页
回复总数  3
2022-10-28 16:10:37 +08:00
回复了 sadfQED2 创建的主题 Go 编程语言 V200,找大佬帮忙看个 BUG,不够我加钱
http 库里面有个 sync.Pool 来复用 textproto.Reader ,减少 gc 。
2022-10-28 16:08:15 +08:00
回复了 sadfQED2 创建的主题 Go 编程语言 V200,找大佬帮忙看个 BUG,不够我加钱
https://cs.opensource.google/go/go/+/refs/tags/go1.18.3:src/sync/pool.go;l=213

能看下 5w 个 goroutinues 卡住的应该有两种类型:
1. 第一种是 allPoolsMu.Lock() 卡住了。
2. 第二种就是持有锁的那个 goroutine 了,可以搜下 pinSlow 所有的 gouroutine ,是否有不同于 allPoolsMu.Lock() 的。再顺着这个 goroutine ,看它为什么卡住

func (p *Pool) pinSlow() (*poolLocal, int) {
// Retry under the mutex.
// Can not lock the mutex while pinned.
runtime_procUnpin()
allPoolsMu.Lock()
defer allPoolsMu.Unlock()
pid := runtime_procPin()
// poolCleanup won't be called while we are pinned.
s := p.localSize
l := p.local
if uintptr(pid) < s {
return indexLocal(l, pid), pid
}
if p.local == nil {
allPools = append(allPools, p)
}
// If GOMAXPROCS changes between GCs, we re-allocate the array and lose the old one.
size := runtime.GOMAXPROCS(0)
local := make([]poolLocal, size)
atomic.StorePointer(&p.local, unsafe.Pointer(&local[0])) // store-release
runtime_StoreReluintptr(&p.localSize, uintptr(size)) // store-release
return &local[pid], pid
}
欢迎有意向的同学联系我,岗位还算比较核心部门的业务。
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1931 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 12ms · UTC 00:41 · PVG 08:41 · LAX 16:41 · JFK 19:41
Developed with CodeLauncher
♥ Do have faith in what you're doing.