分析 Golang 服务器

Posted

技术标签:

【中文标题】分析 Golang 服务器【英文标题】:Profiling Golang server 【发布时间】:2015-11-17 12:45:41 【问题描述】:

我想分析一个我用 Go 编写的简单网络服务器。它接受请求,将请求映射到 avro 对象,并在 go 例程中将其发送到 Kafka。要求是它立即响应并稍后将对象发送到 Kafka。在本地,它平均在 1 毫秒内回答。我一直在尝试通过使用 davecheney/profile 包启动脚本并使用 jmeter 发送测试请求来对其进行分析。我可以在输出中看到配置文件已生成,但无论 jemeter 发送请求多长时间,它仍然为空。我在 Mac El Capitan 上运行它。我读到 Mac 上的分析存在一些问题,但它可以在 El Capitan 上运行。你有什么建议吗?

【问题讨论】:

你能分享一些代码吗? (简化版,仅展示如何使用分析器) 您是否构建了一个更简单的示例,并且成功地进行了概要分析?分析适用于 Mac OS X 的“损坏”版本,即生成输出,但随着多个 go 例程它变得越来越不准确。还有一份报告说,分析可以在 OS X El Capitan 上正常工作。因此很可能程序设置不正确,因此建议先做一些简单的事情。 【参考方案1】:

首先,我不确定您是否正在尝试进行延迟分析。如果是这样,请注意 Go 的 CPU 分析器仅报告函数在 CPU 上执行所花费的时间,不包括睡眠时间等。如果 CPU 分析确实是您要查找的内容,请继续阅读。

如果您正在运行网络服务器,只需在导入中包含以下内容(在 main() 所在的文件中)并重新构建:

import _ "net/http/pprof"

然后,在通过 jmeter 施加负载的同时,运行:

go tool pprof /path/to/webserver/binary http://<server>/debug/pprof/profile

net/http/pprof 包提供了分析挂钩,允许您随时按需分析您的网络服务器,即使它在生产中运行。不过,如果您的网络服务器是要公开的,您可能希望为其使用不同的防火墙端口。

【讨论】:

我也没有使用“net/http/pprof”得到任何结果:go tool pprof localhost:8080/debug/pprof/block Fetching profile from localhost:8080/debug/pprof/block server response: 204 No Content 1) 块分析需要显式启用golang.org/pkg/runtime/#SetBlockProfileRate 2) 您需要包含要分析的二进制文件的路径才能使分析数据有意义。

以上是关于分析 Golang 服务器的主要内容,如果未能解决你的问题,请参考以下文章

Golang-ReverseProxy源码分析

gRPC 服务端和客户端源码分析(golang)

golang: 使用pprof做性能分析

golang: 使用pprof做性能分析

Golang CLOSE WAIT 分析

golang实现dns域名解析:响应报文分析