【go 语言】PProf 的使用——协程(goroutine)和锁(mutex)分析(三)

简介: 【go 语言】PProf 的使用——协程(goroutine)和锁(mutex)分析(三)

正文


一、Goroutine Profiling:


1. 源代码:


package main
import (
    "net/http"
    _ "net/http/pprof"
    "runtime"
    "sync"
)
func init() {
    runtime.SetMutexProfileFraction(1)
    runtime.SetBlockProfileRate(1)
}
func main() {
    var m sync.Mutex
    var datas = make(map[int]struct{})
    for i := 0; i < 999; i++ {
        go func(i int) {
            m.Lock()
            defer m.Unlock()
            datas[i] = struct{}{}
        }(i)
    }
    _ = http.ListenAndServe("0.0.0.0:2022", nil)
}


12.webp.jpg


2. 协程(goroutine)分析


项目更目录下执行 go tool pprof http://127.0.0.1:2022/debug/pprof/goroutine,结束之后会默认进入 PProf 的命令行交互模式,接着执行 traces,如下图,


15.webp.jpg


  • 在查看 goroutine 时可以使用 traces 命令,这个命令会打印出对应的所有调用栈,以及指标信息。通过这个命令我们可以很方便地查看整个调用链路有什么,分别在哪里使用了多少个 goroutine,并且通过分析可以知道谁才是真正的调用方。


  • 调用栈的展示顺序是自下而上的,也就是说,runtime.main 方法调用了 main.main 方法,而 main.main 方法又调用了 net/http.ListenAndServe 方法,这里对应的就是我们使用的示例代码了,非常方便。


  • 每个调用栈信息都用 ------- 分隔,函数方法前的是指标数据。例如,Goroutine Profiling 展示的是该方法占用的 goroutine 的数量,而 Heap Profiling 展示的是占用的内存大小。


3. 锁(mutex)分析


项目更目录下执行 go tool pprof http://127.0.0.1:2022/debug/pprof/mutex,结束之后会默认进入 PProf 的命令行交互模式,接着执行 top,如下图,


16.webp.jpg

接着执行 list main (list 命令,查看指定函数的代码情况(包含特定的指标小心,如耗时)。若函数名不明确,则默认会对函数名进行模糊匹配),如下图

17.webp.jpg


从输出的分析中可以比较准确地看到引起互斥锁的函数,以及锁开销的位置(在本例中是第 23 行)。


4. 阻塞(block)分析


项目更目录下执行 go tool pprof http://127.0.0.1:2022/debug/pprof/block,结束之后会默认进入 PProf 的命令行交互模式,接着依次执行 toplist main,如下图,

18.webp.jpg


list main 命令的输出结果来看,程序在第 22 行阻塞。

目录
相关文章
|
8天前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
28 4
|
8天前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
18 4
Golang语言goroutine协程篇
|
11天前
|
监控 Devops 测试技术
|
11天前
|
Go 调度
Goroutine:Go语言的轻量级并发机制
【8月更文挑战第31天】
18 0
|
16天前
|
NoSQL Unix 编译器
Golang协程goroutine的调度与状态变迁分析
文章深入分析了Golang中goroutine的调度和状态变迁,包括Grunnable、Gwaiting、Grunning和Gsyscall等状态,以及它们之间的转换条件和原理,帮助理解Go调度器的内部机制。
26 0
|
3月前
|
Go Python
使用python实现一个用户态协程
【6月更文挑战第28天】本文探讨了如何在Python中实现类似Golang中协程(goroutines)和通道(channels)的概念。文章最后提到了`wait_for`函数在处理超时和取消操作中的作
35 1
使用python实现一个用户态协程
|
2月前
|
数据库 开发者 Python
实战指南:用Python协程与异步函数优化高性能Web应用
【7月更文挑战第15天】Python的协程与异步函数优化Web性能,通过非阻塞I/O提升并发处理能力。使用aiohttp库构建异步服务器,示例代码展示如何处理GET请求。异步处理减少资源消耗,提高响应速度和吞吐量,适用于高并发场景。掌握这项技术对提升Web应用性能至关重要。
68 10
|
2月前
|
数据处理 Python
深入探索:Python中的并发编程新纪元——协程与异步函数解析
【7月更文挑战第15天】Python 3.5+引入的协程和异步函数革新了并发编程。协程,轻量级线程,由程序控制切换,降低开销。异步函数是协程的高级形式,允许等待异步操作。通过`asyncio`库,如示例所示,能并发执行任务,提高I/O密集型任务效率,实现并发而非并行,优化CPU利用率。理解和掌握这些工具对于构建高效网络应用至关重要。
39 6
|
2月前
|
大数据 数据处理 API
性能飞跃:Python协程与异步函数在数据处理中的高效应用
【7月更文挑战第15天】在大数据时代,Python的协程和异步函数解决了同步编程的性能瓶颈问题。同步编程在处理I/O密集型任务时效率低下,而Python的`asyncio`库支持的异步编程利用协程实现并发,通过`async def`和`await`避免了不必要的等待,提升了CPU利用率。例如,从多个API获取数据,异步方式使用`aiohttp`并发请求,显著提高了效率。掌握异步编程对于高效处理大规模数据至关重要。
37 4
|
2月前
|
设计模式 机器学习/深度学习 测试技术
设计模式转型:从传统同步到Python协程异步编程的实践与思考
【7月更文挑战第15天】探索从同步到Python协程异步编程的转变,异步处理I/O密集型任务提升效率。async/await关键词定义异步函数,asyncio库管理事件循环。面对挑战,如思维转变、错误处理和调试,可通过逐步迁移、学习资源、编写测试和使用辅助库来适应。通过实践和学习,开发者能有效优化性能和响应速度。
40 3