Table of Contents

1. 前言

本文是Go语言系列文章Golang Notes的其中一篇,完整的文章列表请去总章查看。

2. CPU

CPU这里基本上就没什么太多原理可以说了,只要知道几个知识点就OK。

2.1 核心数量

获取可用的核心数量:

runtime.NumCPU()

设置当前Go进程应该使用多少核心:

runtime.GOMAXPROCS(4)

2.2 Profiling

Profiling方面和内存使用的工具基本上是一致的,直接看内存那篇里的内容即可:Golang Memory#5.3.3 runtime/pprof web

仍旧推荐使用WEB入口的方式来进行profiling,更容易进行实时追踪。获取采样的地址为:http://localhost:8080/debug/pprof/profile

$ go tool pprof http://localhost:8080/debug/pprof/profile
Fetching profile over HTTP from http://localhost:8080/debug/pprof/profile
Saved profile in /Users/XXX/pprof/pprof.samples.cpu.001.pb.gz
Type: cpu
Time: Mar 26, 2019 at 1:41pm (CST)
Duration: 30.15s, Total samples = 3.16s (10.48%)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof)

go tool pprof在进行CPU分析的时候先要进行采样,所以需要等待一段时间,如果在URL上不加任何参数的话,默认是采样30秒。可以通过附加?seconds=x来进行调整。

e.g

$ go tool pprof http://localhost:8080/debug/pprof/profile?seconds=10
Fetching profile over HTTP from http://localhost:8080/debug/pprof/profile?seconds=10
Saved profile in /Users/XXX/pprof/pprof.samples.cpu.002.pb.gz
Type: cpu
Time: Mar 26, 2019 at 1:44pm (CST)
Duration: 10.02s, Total samples = 1.06s (10.57%)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof)

同样的,其他的工具例如trace等也都可以使用。如果要在代码里进行采样,则需要使用接口:

pprof.StartCPUProfile(os.Stdout)
defer pprof.StopCPUProfile()

2.3 火焰图

火焰图是最直观的查看CPU消耗的分析工具,如果要在Go工具链上生成火焰图,可以使用在内存篇里提到过的pprof的UI界面。打开之后VIEW > Flame Graph就能看到了。

3. 代码

代码放在github:experiment/cpu/cpu.go。github上的代码可以看到最新的更新,不过需要打开新的页面稍微麻烦点。

当前页面会放一份gist,方便直接查看:experiment/cpu/cpu.go,但可能更新不及时。

4. 资料

experiment/cpu/cpu.go

EOF