我正在优化Go程序的性能。在查看互斥量分析时,我得到了
> go tool pprof -seconds 30 -ignore .*Shopify.* http://HOST/debug/pprof/mutex
(pprof) top 20
Active filters:
ignore=.*Shopify.*
Showing nodes accounting for 3.08mins, 91.03% of 3.39mins total
Dropped 82 nodes (cum <= 0.02mins)
flat flat% sum% cum cum%
3.08mins 91.03% 91.03% 3.08mins 91.03% sync.(*Mutex).Unlock
0 0% 91.03% 0.06mins 1.75% ....func2
0 0% 91.03% 0.06mins 1.75% ....func3
代码段为
. . 502: w.mu.Lock()
. . ... some calculation
. 5.02mins 510: w.mu.Unlock()
. . 511:
. . 512: return nil
. . 513:}
我不明白的是:
flat
的时间,其余所有时间都是0
?Lock
,则可能意味着计算时间太长,但是当它显示正在等待Unlock
时又意味着什么呢? 答案 0 :(得分:2)
要回答您的第二个问题,互斥锁配置文件始终在 Unlock
路径上显示结果,而从不在 Lock
[1] 上显示。您的个人资料表明大多数争用发生在 w.mu
。
This document 包含更多细节。
[1] 实现细节:原因是Unlock
将锁交给下一个等待的locker,此时争用记录在profile中。因此堆栈跟踪似乎位于 Unlock
路径中。