我正在尝试分析我正在运行的服务器。我主要关注https://artem.krylysov.com/blog/2017/03/13/profiling-and-optimizing-go-web-applications/
我添加以下代码以允许分析:
mux.HandleFunc("/debug/pprof/", pprof.Index)
mux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
mux.HandleFunc("/debug/pprof/profile", pprof.Profile)
mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
mux.HandleFunc("/debug/pprof/trace", pprof.Trace)
我开始一些基准测试并运行
go tool pprof http:/.1:8080/debug/pprof/profile?seconds=5
,这按预期工作,因为它在 5 秒内分析了 cpu。
我想对堆做同样的事情。但是,如果我这样做
go tool pprof -alloc_objects http:/.1:8080/debug/pprof/profile?seconds=5
我会得到所有分配,而不仅仅是最后五秒钟的分配。
在我的特殊情况下,我在启动时运行了很多分配,它们掩盖了所有其他分配。是否可以将它们限制在这个时期内?如果我执行跟踪,我可以看到堆在增加,但我无法查询那里有什么对象。
我尝试拍摄两个不同的堆快照,并使用带有 --base 的 go tool pprof。但是它不起作用,它显示 0 差异。我的猜测是对象与分配的总内存相比太小,所以它们没有保存到配置文件中。