pprof能做什么

pprof能提供正在运行的go程序的各项维度指标,可以帮助我们很好的了解程序的运行状态,如内存的使用,cpu的消耗,是否发现死锁等

pprof提供的profile

profile 解释
cpu 默认进行 30s 的 CPU Profiling,得到一个分析用的 profile 文件
goroutine 查看当前所有运行的 goroutines 堆栈跟踪
block 查看导致阻塞同步的堆栈跟踪
heap 查看活动对象的内存分配情况
mutex 查看导致互斥锁的竞争持有者的堆栈跟踪
threadcreate 查看创建新OS线程的堆栈跟踪

怎么拿到对应的profile文件

当在服务里引入pprof包之后,可能通过http访问的方式拿到profile文件

wget - O analysis.pprof http://${ip}:${port}/debug/pprof/${profile}

怎么分析

以heap.pprof举例

// 查看常驻内存的使用情况
go tool pprof -inuse_space heap.pprof

// 查看常驻对象的使用情况
go tool pprof -inuse_objects heap.pprof

// 查看内存临时分配情况
go tool pprof -alloc_space heap.pprof

// 查看对象临时分配情况
go tool pprof -alloc_objects heap.pprof

通过top命令可以查看占用最多的地方

(pprof) top 20
Showing nodes accounting for 24.34GB, 99.52% of 24.46GB total
Dropped 33 nodes (cum <= 0.12GB)
Showing top 20 nodes out of 34
      flat  flat%   sum%        cum   cum%
   10.36GB 42.37% 42.37%    10.36GB 42.37%  git.ucloudadmin.com/epoch/us3fs/internal.(*Blob).makeAddBh
    7.49GB 30.63% 73.01%     7.49GB 30.63%  git.ucloudadmin.com/epoch/us3fs/internal.(*BufferHead).tryClear
    2.36GB  9.64% 82.64%     2.79GB 11.41%  git.ucloudadmin.com/epoch/us3fs/internal.(*Cacher).getBlob (inline)
    1.82GB  7.46% 90.10%     2.53GB 10.36%  git.ucloudadmin.com/epoch/us3fs/internal.(*US3fs).makeAddInode
    0.65GB  2.65% 92.76%     0.65GB  2.65%  sync.NewCond (inline)
    0.43GB  1.77% 94.53%     0.43GB  1.77%  git.ucloudadmin.com/epoch/us3fs/internal.XMap.init (inline)
    0.33GB  1.37% 95.90%     0.33GB  1.37%  git.ucloudadmin.com/epoch/us3fs/internal.(*Cacher).getBlobSet (inline)
    0.30GB  1.24% 97.14%     0.30GB  1.24%  git.ucloudadmin.com/epoch/us3fs/internal.(*US3fs).makeDentry
    0.28GB  1.14% 98.28%     0.28GB  1.14%  encoding/json.(*decodeState).literalStore
    0.25GB  1.03% 99.31%     3.09GB 12.64%  git.ucloudadmin.com/epoch/us3fs/internal.(*Dir).makeAddChild
    0.05GB  0.21% 99.52%     3.42GB 13.98%  git.ucloudadmin.com/epoch/us3fs/internal.(*Dir).readdirFromOsV2
         0     0% 99.52%     0.28GB  1.14%  encoding/json.(*decodeState).array
         0     0% 99.52%     0.28GB  1.14%  encoding/json.(*decodeState).object
         0     0% 99.52%     0.28GB  1.14%  encoding/json.(*decodeState).unmarshal
         0     0% 99.52%     0.28GB  1.14%  encoding/json.(*decodeState).value
         0     0% 99.52%     0.28GB  1.14%  encoding/json.Unmarshal
         0     0% 99.52%    24.46GB   100%  git.ucloudadmin.com/epoch/go-fuse/fuseutil.(*fileSystemServer).handleOp
         0     0% 99.52%     0.28GB  1.14%  git.ucloudadmin.com/epoch/us3-gosdk.(*UFileRequest).PrefixFileList
         0     0% 99.52%    10.36GB 42.37%  git.ucloudadmin.com/epoch/us3fs/internal.(*Cacher).mapRead
         0     0% 99.52%    20.65GB 84.42%  git.ucloudadmin.com/epoch/us3fs/internal.(*Cacher).read
  • flat:表示此函数分配、并由该函数持有的内存空间
  • flat%:与程序持有总内存的占比
  • sum%:
  • cum:表示由这个函数或它调用堆栈下面的函数分配的内存总量。
  • cum%:与程序持有总内存的占比

以web方式打开

go tool pprof -http=:9999 heap.pprof