【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月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
392 2
|
10月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
608 0
|
10月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
431 0
|
10月前
|
Go 调度 Python
Golang协程和Python协程用法上的那些“不一样”
本文对比了 Python 和 Go 语言中协程的区别,重点分析了调度机制和执行方式的不同。Go 的协程(goroutine)由运行时自动调度,启动后立即执行;而 Python 协程需通过 await 显式调度,依赖事件循环。文中通过代码示例展示了两种协程的实际运行效果。
393 7
|
9月前
|
数据采集 网络协议 API
协程+连接池:高并发Python爬虫的底层优化逻辑
协程+连接池:高并发Python爬虫的底层优化逻辑
|
Go Python
使用python实现一个用户态协程
【6月更文挑战第28天】本文探讨了如何在Python中实现类似Golang中协程(goroutines)和通道(channels)的概念。文章最后提到了`wait_for`函数在处理超时和取消操作中的作
341 1
使用python实现一个用户态协程
|
11月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
数据库 开发者 Python
实战指南:用Python协程与异步函数优化高性能Web应用
【7月更文挑战第15天】Python的协程与异步函数优化Web性能,通过非阻塞I/O提升并发处理能力。使用aiohttp库构建异步服务器,示例代码展示如何处理GET请求。异步处理减少资源消耗,提高响应速度和吞吐量,适用于高并发场景。掌握这项技术对提升Web应用性能至关重要。
377 10
|
数据处理 Python
深入探索:Python中的并发编程新纪元——协程与异步函数解析
【7月更文挑战第15天】Python 3.5+引入的协程和异步函数革新了并发编程。协程,轻量级线程,由程序控制切换,降低开销。异步函数是协程的高级形式,允许等待异步操作。通过`asyncio`库,如示例所示,能并发执行任务,提高I/O密集型任务效率,实现并发而非并行,优化CPU利用率。理解和掌握这些工具对于构建高效网络应用至关重要。
338 6
|
数据挖掘 程序员 调度
Python并发编程之协程与异步IO
传统的多线程和多进程模型在处理大规模并发时存在一些性能瓶颈和资源消耗问题。本文将重点介绍Python中基于协程和异步IO的并发编程方法,探讨其工作原理和实际应用,帮助开发者更好地理解并利用Python的并发编程能力。