- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
12.7.1 分析 HTTP 服务
如您在第11章(代码测试,优化和分析)中了解到的,有个名为 net/http/pprof
标准包,当您想要用它自己的 HTTP 服务分析一个 Go 应用时,可以使用它。因此,导入 net/http/pprof
将在 /debug/pprof/
URL 下安装各种处理程序。您很快就会看到更多的情况。现在,您记住 net/http/pprof
包应该用于用 HTTP 服务分析 web 应用就足够了,而 runtime/pprof
标准包应该用于分析其他类型的应用。
注意,如果您的分析器工作在 http://localhost:8080
地址,您将从 如下 web 链接获得支持:
- http://localhost:8080/debug/pprof/goroutine
- http://localhost:8080/debug/pprof/heap
- http://localhost:8080/debug/pprof/theadcreate
- http://localhost:8080/debug/pprof/block
- http://localhost:8080/debug/pprof/mutex
- http://localhost:8080/debug/pprof/profile
- http://localhost:8080/debug/pprof/trace?seconds=5
下面被展示的程序将使用 www.go
做为起始点,并添加必要的 Go 代码允许您去分析它。这个新程序命名为 wwwProfile.go
,分为四部分展示。
注意,wwwProfile.go
将使用一个 http.NewServeMux
变量用于注册程序支持的路径。这样做的主要原因是,使用 http.NewServeMux
需要手动定义 HTTP 端点。如果您决定不使用 http.NewServeMux
,那么 HTTP 端点将自动注册,这也意味着您将使用 _
字符在引入的 net/http/pprof
包前。
wwwProfile.go
第一部分包含的 Go 代码如下:
package main
import (
"fmt"
"net/http"
"net/http/pprof"
"os"
"time"
)
func myHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Serving: %s\n", r.URL.Path)
fmt.Printf("Served: %s\n", r.Host)
}
func timeHandler(w http.ResponseWriter, r *http.Request) {
t := time.Now().Format(time.RFC1123)
Body := "The current time is:"
fmt.Fprintf(w, "<h1 align=\"center\">%s</h1>", Body)
fmt.Fprintf(w, "<h2 align=\"center\">%s</h2>\n", t)
fmt.Fprintf(w, "Serving: %s\n", r.URL.Path)
fmt.Printf("Served time for: %s\n", r.Host)
}
这俩个处理函数的实现与之前的一样。
wwwProfile.go
的第二段代码如下:
func main() {
PORT := ":8001"
arguments := os.Args
if len(arguments) == 1 {
fmt.Println("Using default port number: ", PORT)
}else{
PORT = ":" + arguments[1]
fmt.Println("Using port number: ", PORT)
}
r := http.NewServeMux()
r.HandleFunc("/time", timeHandler)
r.HandleFunc("/", myHandler)
在上面的 Go 代码中,您使用 http.NewServeMux()
和 HandleFunc()
定义您的 web 服务支持的 URL。
wwwProfile.go
的第三段代码如下:
r.HandleFunc("/debug/pprof/", pprof.Index)
r.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
r.HandleFunc("/debug/pprof/profile", pprof.Profile)
r.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
r.HandleFunc("/debug/pprof/trace", pprof.Trace)
上面的 Go 代码定义与分析相关的 HTTP 端点。没有它们,您将不能分析您的 web 应用。
余下的 Go 代码如下:
err := http.ListenAndServe(PORT, r)
if err != nil {
fmt.Println(err)
return
}
}
这段代码启动 web 服务,并允许它服务来自 HTTP 客户端的连接。您会注意到 http.ListenAndServe()
的第二个参数不再是 nil
。
如您所见,wwwProfile.go
没有定义 /debug/pprof/goroutine
HTTP 端点,这意味着 wwwProfile.go
不使用任何 goroutines !
执行 wwwProfile.go
将产生如下输出:
$ go run wwwProfile.go 1234
Using port number: :1234
Served time for: localhost:1234
使用 Go 分析器获取数据是相当简单的任务,执行下面的命令将带您自动进入 Go 分析器的 shell。
如您在第11章(代码测试,优化和分析)中了解到的,您现在可以使用这个分析数据,并使用 go tool pprof
分析它。
您可以访问
http://HOSTNAME:PORTNUMBER/debug/pprof
,从那可以看到分析结果。当HOSTNAME
的值是localhost
,PORTNUMBER
的值是1234
时,您应该访问http://localhost:1234/debug/pprof/
。
您应该希望测试您的 web 服务应用的性能,您可以使用 ab(1)
工具,它做为 Apache HTTP server benchmarking tool 广为人知,用于创建流量和基准。这也允许 go tool pprof
收集更多的准确数据,如下:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论