go: 查看GC的运行情况

2023-08-16 20:20:27 浏览数 (2)

Go的pprof包可以帮助你对程序的性能进行分析,包括CPU使用、内存分配以及协程的使用情况。但是要注意,对于GC的运行情况,pprof包并不能直接提供很详细的信息,需要通过其他方式。

使用pprof,你可以查看程序的内存分配情况,从而间接地了解GC的工作情况。以下是一个基本的示例,说明了如何启动HTTP服务器并提供pprof的端点:

代码语言:javascript复制
import (
  "net/http"
  _ "net/http/pprof"
)

func main() {
  go func() {
    log.Println(http.ListenAndServe("localhost:6060", nil))
  }()
  // your program here...
}

然后,在浏览器中访问http://localhost:6060/debug/pprof/,你可以看到程序的各种性能数据。

对于内存使用情况,你可以访问http://localhost:6060/debug/pprof/heap来获取。这可以帮助你看到程序的内存分配情况,从而间接地了解GC的工作情况。

如果你想要查看更详细的GC运行情况,可以通过启用GC的调试跟踪。你可以设置GODEBUG=gctrace=1环境变量,然后运行你的程序。这样,每次GC运行时,都会在控制台输出一些信息,包括GC的运行时间、STW(Stop The World)的时间、内存的回收情况等。这些信息可以帮助你了解GC的具体运行情况。

例如,你可以在运行你的程序时这样设置环境变量:

代码语言:javascript复制
GODEBUG=gctrace=1 go run your_program.go
GODEBUG=gctrace=1 ./your_program

然后,你就可以在控制台看到GC的调试跟踪信息了。

在启用GC的调试追踪后,每次进行垃圾回收时,都会在标准错误输出流(stderr)中输出一条追踪信息。下面是一个示例:

代码语言:javascript复制
gc 1 @0.026s 35%: 15 1.7 0.73 ms clock, 46 1.7/1.0/2.8 2.2 ms cpu,4->4->1 MB, 5 MB goal, 4 P

这些字段的含义如下:

  • gc 1:这是第1次垃圾回收。
  • @0.026s:垃圾回收开始时,程序已经运行了0.026秒。
  • 35%:程序启动以来,约有35%的CPU时间用于垃圾回收。
  • 15 1.7 0.73 ms clock:本次垃圾回收耗时包括3个阶段。第一阶段(STW,Stop-The-World)耗时15毫秒,第二阶段并行标记耗时1.7毫秒,第三阶段(STW)耗时0.73毫秒。这些时间是以墙钟时间(wall-clock time)表示的,也就是真实经过的时间。
  • 46 1.7/1.0/2.8 2.2 ms cpu:与上面类似,但这些时间是CPU时间,是所有CPU花费的总时间。如果你有4个CPU,那么可能在1毫秒的墙钟时间内,有4毫秒的CPU时间被使用。
  • 4->4->1 MB:垃圾回收开始时,堆上的活动对象占用了4MB。在标记阶段结束后,发现还有4MB的对象是可达的。回收后,堆上的活动对象占用了1MB。
  • 5 MB goal:下一次垃圾回收预计在堆的活动对象占用达到5MB时开始。
  • 4 P:进行垃圾回收的CPU的数量。

这些数据可以帮助你理解垃圾回收的工作情况,包括它占用了多少CPU时间,每次垃圾回收的耗时,以及堆的内存使用情况。对于性能优化,通常需要关注的是垃圾回收的CPU时间占比,以及每次垃圾回收的耗时,尤其是STW的阶段。如果这些时间过长,可能会导致程序的性能下降。

0 人点赞