diff --git a/cmd/npc/npc.go b/cmd/npc/npc.go index 309ca685..781dc1f0 100644 --- a/cmd/npc/npc.go +++ b/cmd/npc/npc.go @@ -33,6 +33,7 @@ var ( localType = flag.String("local_type", "p2p", "p2p target") logPath = flag.String("log_path", "", "npc log path") debug = flag.Bool("debug", true, "npc debug") + pprofAddr = flag.String("pprof", "", "PProf debug addr (ip:port)") ) const systemdScript = `[Unit] @@ -171,6 +172,7 @@ func (p *npc) run() error { logs.Warning("npc: panic serving %v: %v\n%s", err, string(buf)) } }() + common.InitPProfFromArg(*pprofAddr) //p2p or secret command if *password != "" { commonConfig := new(config.CommonConfig) diff --git a/cmd/nps/nps.go b/cmd/nps/nps.go index e74f3445..93640ae7 100644 --- a/cmd/nps/nps.go +++ b/cmd/nps/nps.go @@ -59,6 +59,7 @@ func main() { if err := beego.LoadAppConfig("ini", filepath.Join(common.GetRunPath(), "conf", "nps.conf")); err != nil { log.Fatalln("load config file error", err.Error()) } + common.InitPProfFromFile() if level = beego.AppConfig.String("log_level"); level == "" { level = "7" } diff --git a/conf/npc.conf b/conf/npc.conf index b3dccdbd..f7b73d97 100644 --- a/conf/npc.conf +++ b/conf/npc.conf @@ -12,6 +12,7 @@ web_username=user web_password=1234 crypt=true compress=true +#pprof_addr=0.0.0.0:9999 [health_check_test1] health_check_timeout=1 diff --git a/conf/nps.conf b/conf/nps.conf index cee576f2..404a981b 100755 --- a/conf/nps.conf +++ b/conf/nps.conf @@ -76,3 +76,7 @@ http_cache_length=100 #get origin ip http_add_origin_header=false + +#pprof debug options +#pprof_ip=0.0.0.0 +#pprof_port=9999 diff --git a/docs/feature.md b/docs/feature.md index e8ba92a1..79b9aba0 100644 --- a/docs/feature.md +++ b/docs/feature.md @@ -245,3 +245,9 @@ LevelInformational->6 LevelDebug->7 **对于nps:** 在`nps.conf`中设置相关配置即可 + +## pprof性能分析与调试 + +可在服务端与客户端配置中开启pprof端口,用于性能分析与调试,注释或留空相应参数为关闭。 + +默认为关闭状态 \ No newline at end of file diff --git a/docs/server_config.md b/docs/server_config.md index afa85c0b..eb7cd4ed 100644 --- a/docs/server_config.md +++ b/docs/server_config.md @@ -19,3 +19,5 @@ log_level|日志输出级别 auth_crypt_key | 获取服务端authKey时的aes加密密钥,16位 p2p_ip| 服务端Ip,使用p2p模式必填 p2p_port|p2p模式开启的udp端口 +pprof_ip|debug pprof 服务端ip +pprof_port|debug pprof 端口 diff --git a/docs/use.md b/docs/use.md index 086bcf07..32c26bdb 100644 --- a/docs/use.md +++ b/docs/use.md @@ -59,6 +59,7 @@ rate_limit=10000 flow_limit=100 remark=test max_conn=10 +#pprof_addr=0.0.0.0:9999 ``` 项 | 含义 ---|--- @@ -73,6 +74,7 @@ rate_limit|速度限制,可忽略 flow_limit|流量限制,可忽略 remark|客户端备注,可忽略 max_conn|最大连接数,可忽略 +pprof_addr|debug pprof ip:port #### 域名代理 ```ini diff --git a/lib/common/pprof.go b/lib/common/pprof.go new file mode 100644 index 00000000..7f9ee766 --- /dev/null +++ b/lib/common/pprof.go @@ -0,0 +1,29 @@ +package common + +import ( + "github.com/astaxie/beego" + "github.com/astaxie/beego/logs" + "net/http" + _ "net/http/pprof" +) + +func InitPProfFromFile() { + ip := beego.AppConfig.String("pprof_ip") + p := beego.AppConfig.String("pprof_port") + if len(ip) > 0 && len(p) > 0 && IsPort(p) { + runPProf(ip + ":" + p) + } +} + +func InitPProfFromArg(arg string) { + if len(arg) > 0 { + runPProf(arg) + } +} + +func runPProf(ipPort string) { + go func() { + _ = http.ListenAndServe(ipPort, nil) + }() + logs.Info("PProf debug listen on", ipPort) +} diff --git a/lib/config/config.go b/lib/config/config.go index 62e2d2bf..d30e22c0 100644 --- a/lib/config/config.go +++ b/lib/config/config.go @@ -145,6 +145,8 @@ func dealCommon(s string) *CommonConfig { c.Client.MaxConn = common.GetIntNoErrByStr(item[1]) case "remark": c.Client.Remark = item[1] + case "pprof_addr": + common.InitPProfFromArg(item[1]) } } return c