Skip to content

性能分析工具

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 #调试工具难度等级: ⭐⭐⭐⭐ 面试频率: 高频

正在精进