K8s已经成为一线大厂分布式平台的标配技术。你是不是还在惆怅怎么掌握它?来这里,大型互联网公司一线工程师亲授,不来虚的,直接上手实战,3天时间带你搭建K8s平台,快速学会K8s,点击下方图片可了解培训详情,点击下方图片了解详情。
$ go get -u github.com/google/gops
import (
...
"github.com/google/gops/agent"
)
func main() {
// 创建并监听 gops agent,gops 命令会通过连接 agent 来读取进程信息
// 若需要远程访问,可配置 agent.Options{Addr: "0.0.0.0:6060"},否则默认仅允许本地访问
if err := agent.Listen(agent.Options{}); err != nil {
log.Fatalf("agent.Listen err: %v", err)
}
http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
_, _ = w.Write([]byte(`Go语言编程之旅`))
})
_ := http.ListenAndServe(":6060", http.DefaultServeMux)
}
3739 3725 main * go1.14 /private/var/folders/jm/.../b001/exe/main
3725 71093 go go1.14 /usr/local/Cellar/go/1.14/libexec/bin/go
62357 46131 go go1.14 /usr/local/Cellar/go/1.14/libexec/bin/go
3872 3742 gops go1.14 /Users/eddycjy/go/bin/gops
62379 62357 main go1.14 /private/var/folders/jm/.../b001/exe/main
...
3739 3725 main * go1.14 /private/var/folders/jm/.../b001/exe/main
$ gops help
gops is a tool to list and diagnose Go processes.
Usage:
gops <cmd> <pid|addr> ...
gops <pid> # displays process info
gops help # displays this help message
Commands:
stack Prints the stack trace.
gc Runs the garbage collector and blocks until successful.
setgc Sets the garbage collection target percentage.
memstats Prints the allocation and garbage collection stats.
version Prints the Go version used to build the program.
stats Prints runtime stats.
trace Runs the runtime tracer for 5 secs and launches "go tool trace".
pprof-heap Reads the heap profile and launches "go tool pprof".
pprof-cpu Reads the CPU profile and launches "go tool pprof".
$ gops <pid>
parent PID: 3725
threads: 7
memory usage: 0.042%
cpu usage: 0.003%
username: eddycjy
cmd+args: /var/folders/jm/pk20jr_s74x49kqmyt87n2800000gn/T/go-build943691423/b001/exe/main
elapsed time: 10:56
local/remote: 127.0.0.1:59369 <-> :0 (LISTEN)
local/remote: *:6060 <-> :0 (LISTEN)
$ gops stack 3739
goroutine 19 [running]:
runtime/pprof.writeGoroutineStacks(0x1385aa0, 0xc000132038, 0x30, 0xd0)
...
/Users/eddycjy/go/src/github.com/google/gops/agent/agent.go:185 +0x1af
github.com/google/gops/agent.listen()
/Users/eddycjy/go/src/github.com/google/gops/agent/agent.go:133 +0x2bf
created by github.com/google/gops/agent.Listen
/Users/eddycjy/go/src/github.com/google/gops/agent/agent.go:111 +0x36b
goroutine 1 [IO wait]:
internal/poll.runtime_pollWait(0x2f55e38, 0x72, 0x0)
/usr/local/Cellar/go/1.14/libexec/src/runtime/netpoll.go:203 +0x55
...
$ gops memstats 3739
alloc: 1.15MB (1205272 bytes)
total-alloc: 1.15MB (1205272 bytes)
sys: 69.45MB (72827136 bytes)
lookups: 0
mallocs: 644
frees: 12
heap-alloc: 1.15MB (1205272 bytes)
heap-sys: 63.66MB (66748416 bytes)
heap-idle: 62.05MB (65060864 bytes)
heap-in-use: 1.61MB (1687552 bytes)
heap-released: 62.02MB (65028096 bytes)
heap-objects: 632
...
$ gops stats 3739
goroutines: 2
OS threads: 8
GOMAXPROCS: 4
num CPU: 4
$ gops trace 3739
Tracing now, will take 5 secs...
Trace dump saved to: /var/folders/jm/pk20jr_s74x49kqmyt87n2800000gn/T/trace092133110
Parsing trace...
Splitting trace...
Opening browser. Trace viewer is listening on http://127.0.0.1:53811
$ gops pprof-cpu 3739
Profiling CPU now, will take 30 secs...
Profile dump saved to: /var/folders/jm/pk20jr_s74x49kqmyt87n2800000gn/T/profile563685966
Binary file saved to: /var/folders/jm/pk20jr_s74x49kqmyt87n2800000gn/T/binary265411413
File: binary265411413
Type: cpu
...
(pprof)
$ gops pprof-heap 3739
Profile dump saved to: /var/folders/jm/pk20jr_s74x49kqmyt87n2800000gn/T/profile967076057
Binary file saved to: /var/folders/jm/pk20jr_s74x49kqmyt87n2800000gn/T/binary904879716
File: binary904879716
Type: inuse_space
...
(pprof)
func PidsWithContext(ctx context.Context) ([]int32, error) {
var ret []int32
d, err := os.Open(common.HostProc())
if err != nil {
return nil, err
}
defer d.Close()
fnames, err := d.Readdirnames(-1)
if err != nil {
return nil, err
}
for _, fname := range fnames {
pid, err := strconv.ParseInt(fname, 10, 32)
if err != nil {
continue
}
ret = append(ret, int32(pid))
}
return ret, nil
}
// common.HostProc
func HostProc(combineWith ...string) string {
return GetEnv("HOST_PROC", "/proc", combineWith...)
}
func isGo(pr ps.Process) (path, version string, agent, ok bool, err error) {
...
path, _ = pr.Path()
if err != nil {
return
}
var versionInfo goversion.Version
versionInfo, err = goversion.ReadExe(path)
if err != nil {
return
}
ok = true
version = versionInfo.Release
pidfile, err := internal.PIDFile(pr.Pid())
if err == nil {
_, err := os.Stat(pidfile)
agent = err == nil
}
return path, version, agent, ok, nil
}
if name == "runtime.main" || name == "main.main" {
isGo = true
}
if name == "runtime.buildVersion" {
isGo = true
}
$ export GOFLAGS="-ldflags=-compressdwarf=false" && go build .
$ gdb awesomeProject
...
(gdb) p 'runtime.buildVersion'
$1 = 0x131bbb0 "go1.14"
$ upx awesomeProject
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论