性能分析工具
Go 提供了丰富的性能分析工具,帮助开发者识别和解决性能瓶颈问题。
pprof 工具
基础用法
问题: 如何使用 pprof 进行性能分析?
回答:
点击查看完整代码实现
点击查看完整代码实现
go
package main
import (
"log"
"net/http"
_ "net/http/pprof"
"runtime"
)
func main() {
// 启动 pprof HTTP 服务器
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
// 应用程序代码
cpuIntensiveWork()
}
func cpuIntensiveWork() {
for i := 0; i < 1e8; i++ {
_ = i * i
}
}:::
访问 http://localhost:6060/debug/pprof/ 查看性能数据。
内存分析
堆内存分析
问题: 如何分析内存使用情况?
回答:
bash
# 获取堆内存快照
go tool pprof http://localhost:6060/debug/pprof/heap
# 在交互模式中常用命令
(pprof) top10 # 显示前10个内存使用大户
(pprof) list funcName # 显示函数的详细内存分配
(pprof) web # 生成可视化图表CPU 分析
CPU 性能分析
问题: 如何进行 CPU 性能分析?
回答:
bash
# 获取30秒的CPU采样
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30
# 分析CPU热点
(pprof) top10 # CPU使用率最高的函数
(pprof) peek funcName # 查看函数调用关系Goroutine 分析
协程状态分析
问题: 如何分析 goroutine 的状态?
回答:
点击查看完整代码实现
点击查看完整代码实现
go
package main
import (
"fmt"
"runtime"
"time"
)
func analyzeGoroutines() {
// 启动一些goroutine
for i := 0; i < 10; i++ {
go func(id int) {
time.Sleep(time.Hour) // 长期运行
}(i)
}
// 获取goroutine信息
fmt.Printf("活跃的goroutine数量: %d\n", runtime.NumGoroutine())
// 打印goroutine堆栈
buf := make([]byte, 1<<16)
stackSize := runtime.Stack(buf, true)
fmt.Printf("Goroutine堆栈:\n%s\n", buf[:stackSize])
}:::
阻塞分析
同步阻塞分析
问题: 如何分析程序中的阻塞情况?
回答:
点击查看完整代码实现
点击查看完整代码实现
go
package main
import (
"runtime"
"sync"
"time"
)
func blockingAnalysis() {
// 开启阻塞分析
runtime.SetBlockProfileRate(1)
var mu sync.Mutex
var wg sync.WaitGroup
// 创建竞争激烈的锁
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for j := 0; j < 100; j++ {
mu.Lock()
time.Sleep(time.Millisecond)
mu.Unlock()
}
}()
}
wg.Wait()
}:::
访问 http://localhost:6060/debug/pprof/block 查看阻塞分析。
trace 工具
执行跟踪
问题: 如何使用 trace 工具分析程序执行?
回答:
点击查看完整代码实现
点击查看完整代码实现
go
package main
import (
"os"
"runtime/trace"
)
func main() {
// 创建trace文件
f, err := os.Create("trace.out")
if err != nil {
panic(err)
}
defer f.Close()
// 开始跟踪
err = trace.Start(f)
if err != nil {
panic(err)
}
defer trace.Stop()
// 被跟踪的代码
tracedWork()
}
func tracedWork() {
// 模拟一些工作
for i := 0; i < 5; i++ {
go func() {
sum := 0
for j := 0; j < 1e6; j++ {
sum += j
}
}()
}
}:::
bash
# 生成trace后查看
go tool trace trace.out技术标签: #性能分析 #pprof #trace #调试工具难度等级: ⭐⭐⭐⭐ 面试频率: 高频
