|
@@ -6,7 +6,7 @@
|
|
|
|
|
|
|
|
```sh
|
|
```sh
|
|
|
#!/bin/sh
|
|
#!/bin/sh
|
|
|
-/usr/bin/time -f ‘%Uu %Ss %er %MkB %C’ “$@”
|
|
|
|
|
|
|
+/usr/bin/time -f '%Uu %Ss %er %MkB %C' "$@"
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
在 Unix 命令行中像这样使用 ```xtime goprogexec```,这里的 progexec 是一个 Go 可执行程序,这句命令行输出类似:56.63u 0.26s 56.92r 1642640kB progexec,分别对应用户时间,系统时间,实际时间和最大内存占用。
|
|
在 Unix 命令行中像这样使用 ```xtime goprogexec```,这里的 progexec 是一个 Go 可执行程序,这句命令行输出类似:56.63u 0.26s 56.92r 1642640kB progexec,分别对应用户时间,系统时间,实际时间和最大内存占用。
|
|
@@ -24,11 +24,11 @@
|
|
|
你可以在单机程序 progexec 中引入 runtime/pprof 包;这个包以 pprof 可视化工具需要的格式写入运行时报告数据。对于 CPU 性能分析来说你需要添加一些代码:
|
|
你可以在单机程序 progexec 中引入 runtime/pprof 包;这个包以 pprof 可视化工具需要的格式写入运行时报告数据。对于 CPU 性能分析来说你需要添加一些代码:
|
|
|
|
|
|
|
|
```go
|
|
```go
|
|
|
-var cpuprofile = flag.String(“cpuprofile”, “”, “write cpu profile to file”)
|
|
|
|
|
|
|
+var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
|
|
|
|
|
|
|
|
func main() {
|
|
func main() {
|
|
|
flag.Parse()
|
|
flag.Parse()
|
|
|
- if *cpuprofile != “” {
|
|
|
|
|
|
|
+ if *cpuprofile != "" {
|
|
|
f, err := os.Create(*cpuprofile)
|
|
f, err := os.Create(*cpuprofile)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
log.Fatal(err)
|
|
log.Fatal(err)
|
|
@@ -45,7 +45,7 @@ func main() {
|
|
|
|
|
|
|
|
然后可以像这样用 gopprof 工具:```gopprof progexec progexec.prof```
|
|
然后可以像这样用 gopprof 工具:```gopprof progexec progexec.prof```
|
|
|
|
|
|
|
|
-gopprof 程序是 Google pprofC++ 分析器的一个轻微变种;关于此工具更多的信息,参见[http://code.google.com/p/google-perftools/](http://code.google.com/p/google-perftools/)。
|
|
|
|
|
|
|
+gopprof 程序是 Google pprofC++ 分析器的一个轻微变种;关于此工具更多的信息,参见[https://github.com/gperftools/gperftools](https://github.com/gperftools/gperftools)。
|
|
|
|
|
|
|
|
如果开启了 CPU 性能分析,Go 程序会以大约每秒 100 次的频率阻塞,并记录当前执行的 goroutine 栈上的程序计数器样本。
|
|
如果开启了 CPU 性能分析,Go 程序会以大约每秒 100 次的频率阻塞,并记录当前执行的 goroutine 栈上的程序计数器样本。
|
|
|
|
|
|
|
@@ -78,11 +78,11 @@ Total: 3099 samples
|
|
|
为了做到这一点必须在合适的地方添加下面的代码:
|
|
为了做到这一点必须在合适的地方添加下面的代码:
|
|
|
|
|
|
|
|
```go
|
|
```go
|
|
|
-var memprofile = flag.String(“memprofile”, “”, “write memory profile to this file”)
|
|
|
|
|
|
|
+var memprofile = flag.String("memprofile", "", "write memory profile to this file")
|
|
|
...
|
|
...
|
|
|
|
|
|
|
|
CallToFunctionWhichAllocatesLotsOfMemory()
|
|
CallToFunctionWhichAllocatesLotsOfMemory()
|
|
|
-if *memprofile != “” {
|
|
|
|
|
|
|
+if *memprofile != "" {
|
|
|
f, err := os.Create(*memprofile)
|
|
f, err := os.Create(*memprofile)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
log.Fatal(err)
|
|
log.Fatal(err)
|
|
@@ -117,7 +117,7 @@ gopprof --inuse_objects progexec progexec.mprof
|
|
|
对于 web 应用来说,有标准的 HTTP 接口可以分析数据。在 HTTP 服务中添加
|
|
对于 web 应用来说,有标准的 HTTP 接口可以分析数据。在 HTTP 服务中添加
|
|
|
|
|
|
|
|
```go
|
|
```go
|
|
|
-import _ “http/pprof”
|
|
|
|
|
|
|
+import _ "http/pprof"
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
会为 /debug/pprof/ 下的一些 URL 安装处理器。然后你可以用一个唯一的参数——你服务中的分析数据的 URL 来执行 gopprof 命令——它会下载并执行在线分析。
|
|
会为 /debug/pprof/ 下的一些 URL 安装处理器。然后你可以用一个唯一的参数——你服务中的分析数据的 URL 来执行 gopprof 命令——它会下载并执行在线分析。
|