Mutex 分析器
Go 中的互斥锁分析器基于 pprof 包开发。 它会跟踪 sync.Mutex 和 sync.RWMutex 的争用事件,显示 goroutine 在等待获取锁时所花费的时间。 在 GoLand 中,这些数据通过 Go 内置的 runtime/pprof 机制收集,并以火焰图、调用树和方法列表的形式进行可视化展示。
互斥锁分析
互斥锁分析器有助于识别由于多个 goroutine 争用共享资源而导致的锁争用问题。 它显示 goroutine 在等待获取互斥锁时被阻塞的频率和持续时间。
示例程序
以下示例模拟多个 goroutine 增加由互斥锁保护的共享计数器。 由于所有 goroutine 都尝试锁定同一个互斥锁,争用很快加剧:
虽然该函数正确地计数至 n ,但共享互斥锁上的严重争用在多个 goroutine 同时运行时会显著降低性能。
创建用于分析的测试
为了测量 goroutine 等待互斥锁的时间,请创建一个单元测试:
运行互斥锁分析器
请打开 _test.go 文件。
点击测试函数旁边边距中的 运行 图标。
请选择 使用 Mutex Profiler 分析。

分析互斥锁分析结果
GoLand 以三种视图呈现互斥锁分析数据:
火焰图 :显示函数调用及 goroutine 等待(未运行)所花费的时间。 每个块表示调用堆栈中的一个函数。 Y 轴显示堆栈深度(自下而上),X 轴显示按升序排序的堆栈分析结果——可按延迟次数(选择 争用 )或总等待时间(选择 延迟 )排序。
在 火焰图 选项卡中,将鼠标悬停在任意块上以查看详细信息。
调用树 :可视化函数调用及其延迟统计数据——按延迟次数(选择 争用 )或按总等待时间(选择 延迟 )显示。 数据按降序排列,以突出显示最具阻塞性的函数。 若要配置或筛选 调用树 视图,请使用 表示设置 按钮
。
方法列表 :按竞争次数对所有方法进行排序。 反向跟踪 选项卡显示所选方法被调用的位置, 合并的被调用方 选项卡显示源自该方法的调用轨迹。 被调用方列表 是汇总调用层次结构中所有方法的方法列表。
优化并比较结果
为降低争用,您可以使用原子操作或将工作负载分散到多个锁上。 以下版本使用原子计数器代替单个互斥锁:
当您重新运行互斥锁分析器时,火焰图中几乎不再显示阻塞活动,这表明使用原子操作消除了锁争用并提升了吞吐量。

基准测试与对比
添加基准测试,以测量互斥锁版本与原子操作版本之间的性能差异。
运行基准测试
打开基准测试 _test.go 文件。
右键点击测试文件并导航至 运行 | gobench。 或者,您也可以使用终端:
go test -bench . -benchmem。
预期结果:原子操作版本通常完成速度更快,内存分配更少,在高争用环境下表现出更高的吞吐量。 具体数值因计算机和 n 而异。