Hook系统调用
可以用来拦截网络流量
package hookimport ("net""runtime""syscall")// GetCurrentGoRoutineID GetCurrentGoRoutineIDfunc GetCurrentGoRoutineID() int64 {return runtime.GetCurrentGoRoutineId()}// SetDelegatedFromGoRoutineID SetDelegatedFromGoRoutineIDfunc SetDelegatedFromGoRoutineID(gID int64) {runtime.SetDelegatedFromGoRoutineId(gID)}// RegisterOnConnect RegisterOnConnectfunc RegisterOnConnect(callback func(fd int, sa syscall.Sockaddr)) {syscall.OnConnect = callback}// RegisterOnAccept RegisterOnAcceptfunc RegisterOnAccept(callback func(serverSocketFD int, clientSocketFD int, sa syscall.Sockaddr)) {syscall.OnAccept = callback}// RegisterOnRecv RegisterOnRecvfunc RegisterOnRecv(callback func(fd int, net string, raddr net.Addr, span []byte)) {net.OnRead = callback}// RegisterOnSend RegisterOnSendfunc RegisterOnSend(callback func(fd int, net string, raddr net.Addr, span []byte)) {net.OnWrite = callback}// RegisterOnClose RegisterOnClosefunc RegisterOnClose(callback func(fd int)) {net.OnClose = callback}// RegisterOnGoRoutineExit RegisterOnGoRoutineExitfunc RegisterOnGoRoutineExit(callback func(goid int64)) {runtime.OnGoRoutineExit = callback}
go:linkname
可以实现引导编译器将当前(私有)方法或者变量在编译时链接到指定的位置的方法或者变量,第一个参数表示当前方法或变量,第二个参数表示目标方法或变量,因为这关指令会破坏系统和包的模块化,因此在使用时必须导入unsafe
Prof
如果你的go程序不是web服务器,而是一个服务进程,那么你也可以选择使用net/http/pprof包,同样引入包net/http/pprof,然后在开启另外一个goroutine来开启端口监听。
go func() {log.Println(http.ListenAndServe("localhost:6060", nil))}()
调用go tool pprof http://localhost:3999/debug/pprof/profile来开始采集数据,
之后输入png就可以生成一个调用图
pprof现在支持加label可以观察时间都耗费在哪里
