1. pprof
- 获取锁争用情况:
- 首先在代码中导入
runtime/pprof
和runtime/trace
包。
- 然后在代码中添加如下代码来收集锁争用信息:
import (
"log"
"runtime/pprof"
"runtime/trace"
)
func main() {
f, err := os.Create("trace.out")
if err != nil {
log.Fatal(err)
}
defer f.Close()
err = trace.Start(f)
if err != nil {
log.Fatal(err)
}
defer trace.Stop()
var mu sync.RWMutex
// 模拟锁争用场景
go func() {
mu.Lock()
defer mu.Unlock()
// 模拟一些工作
}()
go func() {
mu.Lock()
defer mu.Unlock()
// 模拟一些工作
}()
pprof.LockProfileRate = 1
// 等待一段时间让程序运行
time.Sleep(2 * time.Second)
f, err = os.Create("lock.prof")
if err != nil {
log.Fatal(err)
}
defer f.Close()
err = pprof.WriteHeapProfile(f)
if err != nil {
log.Fatal(err)
}
}
- 运行程序后,使用`go tool pprof lock.prof`命令进入交互式界面,通过`list`命令查看锁争用相关代码,或者使用`web`命令生成可视化界面查看锁争用情况。
- 获取读写操作耗时:可以结合
time
包,在获取锁前记录开始时间,释放锁后记录结束时间,计算差值得到耗时。例如:
var mu sync.RWMutex
start := time.Now()
mu.RLock()
defer mu.RUnlock()
elapsed := time.Since(start)
fmt.Printf("Read operation took %s\n", elapsed)
2. go-torch
- 获取锁争用情况:
- 安装
go-torch
:go install github.com/uber/go-torch@latest
。
- 在程序中添加获取锁争用信息的代码(类似pprof方式设置
LockProfileRate
):
import (
"runtime"
)
func main() {
runtime.SetMutexProfileFraction(1)
// 程序逻辑,包含RWMutex的使用
}
- 运行程序后,使用`go-torch`命令并指定程序二进制文件路径,如`go-torch./your_binary`,它会生成一个SVG文件,展示锁争用的热点信息。
- 获取读写操作耗时:同pprof方式,利用
time
包记录开始和结束时间来计算读写操作耗时。