Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Main binary filename not available. #138

Open
SovereignRemedy opened this issue Jan 17, 2023 · 12 comments
Open

Main binary filename not available. #138

SovereignRemedy opened this issue Jan 17, 2023 · 12 comments

Comments

@SovereignRemedy
Copy link

SovereignRemedy commented Jan 17, 2023

image
image

生成的文件都是.log结尾的
使用linux和mac都尝试go tool pprof 都有一样的问题

`func systemInit() {
err := service.Init()
if err != nil {
glog.Fatalf("system fatal err:%s", err)
}
configs.InitDb()
appstore.Init()
appdev.Init()
//authcheck.Init()

r := &ReporterImpl{}
h, _ := holmes.New(
	holmes.WithProfileReporter(r),
	holmes.WithCollectInterval("5s"),
	holmes.WithDumpPath("/tmp"),
	holmes.WithTextDump(),

	holmes.WithCPUDump(10, 25, 80, time.Minute),
	holmes.WithMemDump(30, 25, 80, time.Minute),
	holmes.WithGCHeapDump(10, 20, 40, time.Minute),
	holmes.WithGoroutineDump(500, 25, 20000, 0, time.Minute),
	holmes.WithCGroup(true), // set cgroup to true
)

h.EnableCPUDump().
	EnableGoroutineDump().
	EnableMemDump().
	EnableGCHeapDump().Start()

}

type ReporterImpl struct{}

func (r *ReporterImpl) Report(pType string, filename string, reason holmes.ReasonType, eventID string, sampleTime time.Time, pprofBytes []byte, scene holmes.Scene) error {
// do something
glog.Infof("report to minio reporter %s", filename)
fr := bytes.NewReader(pprofBytes)
minioClient := configs.Get().MinioClientPool.Get()
_, err := minioClient.PutObject(context.Background(),
configs.Get().DownloadBucket, filepath.Join("wxtest", filename),
fr, int64(len(pprofBytes)), minio.PutObjectOptions{ContentType: pType})
if err != nil {
glog.Errorf("Reporter holmes.Report error %v", err)
}
return err
}`

@Jun10ng
Copy link
Contributor

Jun10ng commented Jan 17, 2023

这个和文件后缀应该没啥关系,只要是生成的压缩文件的内容符合谷歌pprof pb格式的要求,就可以被 go pprof工具正常解析。

我起了个demo,import了holmes的master分支代码。并没有复现你的问题。

方便提供一下可复现的case吗,我们在一起调查下。

@SovereignRemedy
Copy link
Author

GCHeap.heap-3.20230131112906.390.log
mem.20230131112506.312.log
提供两个dumpdump出来的文件 如果需要别的可以再提供

@Jun10ng
Copy link
Contributor

Jun10ng commented Feb 1, 2023

GCHeap.heap-3.20230131112906.390.log mem.20230131112506.312.log 提供两个dumpdump出来的文件 如果需要别的可以再提供

两个profile里的metric指向的函数都是,应该是add2line的时候找不到函数名和地址。能提供下demo吗

@SovereignRemedy
Copy link
Author

GCHeap.heap-3.20230131112906.390.log mem.20230131112506.312.log 提供两个dumpdump出来的文件 如果需要别的可以再提供

两个profile里的metric指向的函数都是,应该是add2line的时候找不到函数名和地址。能提供下demo吗

因为是公司的服务感觉不太好直接全贴出来..需要哪些关键的地方我可以节选出来。
`
func systemInit() {
err := service.Init()
if err != nil {
glog.Fatalf("system fatal err:%s", err)
}
configs.InitDb()
appstore.Init()
appdev.Init()
//authcheck.Init()

r := &ReporterImpl{}
h, _ := holmes.New(
	holmes.WithProfileReporter(r),
	holmes.WithCollectInterval("5s"),
	holmes.WithDumpPath("/tmp"),
	holmes.WithTextDump(),

	holmes.WithCPUDump(10, 25, 80, time.Minute),
	holmes.WithMemDump(30, 25, 80, time.Minute),
	holmes.WithGCHeapDump(10, 20, 40, time.Minute),
	holmes.WithGoroutineDump(500, 25, 20000, 0, time.Minute),
	holmes.WithCGroup(true), // set cgroup to true
)

h.EnableCPUDump().
	EnableGoroutineDump().
	EnableMemDump().
	EnableGCHeapDump().Start()

}

type ReporterImpl struct{}

func (r *ReporterImpl) Report(pType string, filename string, reason holmes.ReasonType, eventID string, sampleTime time.Time, pprofBytes []byte, scene holmes.Scene) error {
// do something
glog.Infof("report to minio reporter %s", filename)
fr := bytes.NewReader(pprofBytes)
minioClient := configs.Get().MinioClientPool.Get()
_, err := minioClient.PutObject(context.Background(),
configs.Get().DownloadBucket, filepath.Join("wxtest", filename),
fr, int64(len(pprofBytes)), minio.PutObjectOptions{ContentType: pType})
if err != nil {
glog.Errorf("Reporter holmes.Report error %v", err)
}
return err
}

func main() {
systemInit()
//appdev.Get().TestPublish("./data/com.liuli.app-store.tar")
//service.Get().Run()
for true {
time.Sleep(1 * time.Minute)
}
}

`

这部分就是集成holmes的地方 剩下就是请求一个文件上传的业务接口

@Jun10ng
Copy link
Contributor

Jun10ng commented Feb 1, 2023

GCHeap.heap-3.20230131112906.390.log mem.20230131112506.312.log 提供两个dumpdump出来的文件 如果需要别的可以再提供

两个profile里的metric指向的函数都是,应该是add2line的时候找不到函数名和地址。能提供下demo吗

因为是公司的服务感觉不太好直接全贴出来..需要哪些关键的地方我可以节选出来。 ` func systemInit() { err := service.Init() if err != nil { glog.Fatalf("system fatal err:%s", err) } configs.InitDb() appstore.Init() appdev.Init() //authcheck.Init()

r := &ReporterImpl{}
h, _ := holmes.New(
	holmes.WithProfileReporter(r),
	holmes.WithCollectInterval("5s"),
	holmes.WithDumpPath("/tmp"),
	holmes.WithTextDump(),

	holmes.WithCPUDump(10, 25, 80, time.Minute),
	holmes.WithMemDump(30, 25, 80, time.Minute),
	holmes.WithGCHeapDump(10, 20, 40, time.Minute),
	holmes.WithGoroutineDump(500, 25, 20000, 0, time.Minute),
	holmes.WithCGroup(true), // set cgroup to true
)

h.EnableCPUDump().
	EnableGoroutineDump().
	EnableMemDump().
	EnableGCHeapDump().Start()

}

type ReporterImpl struct{}

func (r *ReporterImpl) Report(pType string, filename string, reason holmes.ReasonType, eventID string, sampleTime time.Time, pprofBytes []byte, scene holmes.Scene) error { // do something glog.Infof("report to minio reporter %s", filename) fr := bytes.NewReader(pprofBytes) minioClient := configs.Get().MinioClientPool.Get() _, err := minioClient.PutObject(context.Background(), configs.Get().DownloadBucket, filepath.Join("wxtest", filename), fr, int64(len(pprofBytes)), minio.PutObjectOptions{ContentType: pType}) if err != nil { glog.Errorf("Reporter holmes.Report error %v", err) } return err }

func main() { systemInit() //appdev.Get().TestPublish("./data/com.liuli.app-store.tar") //service.Get().Run() for true { time.Sleep(1 * time.Minute) } }

`

这部分就是集成holmes的地方 剩下就是请求一个文件上传的业务接口

你方便运行下 这里的case吗?看看能否正常解析。
我想排除是不是项目依赖的第三库导致的问题,有些库会对runtime分配下来的资源进行二次分配,给profile增加了很多噪音,比如goid。

@SovereignRemedy
Copy link
Author

GCHeap.heap-3.20230131112906.390.log mem.20230131112506.312.log 提供两个dumpdump出来的文件 如果需要别的可以再提供

两个profile里的metric指向的函数都是,应该是add2line的时候找不到函数名和地址。能提供下demo吗

因为是公司的服务感觉不太好直接全贴出来..需要哪些关键的地方我可以节选出来。 ` func systemInit() { err := service.Init() if err != nil { glog.Fatalf("system fatal err:%s", err) } configs.InitDb() appstore.Init() appdev.Init() //authcheck.Init()

r := &ReporterImpl{}
h, _ := holmes.New(
	holmes.WithProfileReporter(r),
	holmes.WithCollectInterval("5s"),
	holmes.WithDumpPath("/tmp"),
	holmes.WithTextDump(),

	holmes.WithCPUDump(10, 25, 80, time.Minute),
	holmes.WithMemDump(30, 25, 80, time.Minute),
	holmes.WithGCHeapDump(10, 20, 40, time.Minute),
	holmes.WithGoroutineDump(500, 25, 20000, 0, time.Minute),
	holmes.WithCGroup(true), // set cgroup to true
)

h.EnableCPUDump().
	EnableGoroutineDump().
	EnableMemDump().
	EnableGCHeapDump().Start()

}
type ReporterImpl struct{}
func (r *ReporterImpl) Report(pType string, filename string, reason holmes.ReasonType, eventID string, sampleTime time.Time, pprofBytes []byte, scene holmes.Scene) error { // do something glog.Infof("report to minio reporter %s", filename) fr := bytes.NewReader(pprofBytes) minioClient := configs.Get().MinioClientPool.Get() _, err := minioClient.PutObject(context.Background(), configs.Get().DownloadBucket, filepath.Join("wxtest", filename), fr, int64(len(pprofBytes)), minio.PutObjectOptions{ContentType: pType}) if err != nil { glog.Errorf("Reporter holmes.Report error %v", err) } return err }
func main() { systemInit() //appdev.Get().TestPublish("./data/com.liuli.app-store.tar") //service.Get().Run() for true { time.Sleep(1 * time.Minute) } }
`
这部分就是集成holmes的地方 剩下就是请求一个文件上传的业务接口

你方便运行下 这里的case吗?看看能否正常解析。 我想排除是不是项目依赖的第三库导
致的问题,有些库会对runtime分配下来的资源进行二次分配,给profile增加了很多噪音,比如goid。

本地运行demo可以正常解析。
运行自己的服务确实仍然会出现上述问题。
mem.20230201183949.552.log
go.mod.txt

@Jun10ng
Copy link
Contributor

Jun10ng commented Feb 1, 2023

/needInvestigate

@z760087139
Copy link

环境
rancher v2.4.4
holmes v1.1.0

holmes.WithTextDump(),
holmes.WIthMemDump(20,50,70,5*time.Minute)

导出的 heap 会出现 unknown 的情况

@doujiang24
Copy link
Member

@z760087139

  1. 最好单独搞个 issue,看起来不是同一个问题

  2. 导出的 heap 会出现 unknown 的情况

    这个具体是什么情况呢?文件内容是 unknown 么?

@z760087139
Copy link

@z760087139

  1. 最好单独搞个 issue,看起来不是同一个问题

  2. 导出的 heap 会出现 unknown 的情况

    这个具体是什么情况呢?文件内容是 unknown 么?

与 issue 截图的内容一样,heap 内容能够被 profile 工具解读,但是指向 unknown。
不过因为公司使用的内网无法把 profile 拿出来展示,我只是想提供一个曾经复现的场景

@vurihuang
Copy link

使用的是官方的 Deadlock 例子,复现了相同的场景,其他的 demo 也有相同的问题。

Deadlock Demo 包含了 debug log, profile, etc..
image

@vurihuang
Copy link

golang/go#26255

# for free to join this conversation on GitHub. Already have an account? # to comment
Projects
None yet
Development

No branches or pull requests

5 participants