pprof.go 1011 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package common
  2. import (
  3. "fmt"
  4. "github.com/shirou/gopsutil/cpu"
  5. "os"
  6. "runtime/pprof"
  7. "time"
  8. )
  9. // Monitor 定时监控cpu使用率,超过阈值输出pprof文件
  10. func Monitor() {
  11. for {
  12. percent, err := cpu.Percent(time.Second, false)
  13. if err != nil {
  14. panic(err)
  15. }
  16. if percent[0] > 80 {
  17. fmt.Println("cpu usage too high")
  18. // write pprof file
  19. if _, err := os.Stat("./pprof"); os.IsNotExist(err) {
  20. err := os.Mkdir("./pprof", os.ModePerm)
  21. if err != nil {
  22. SysLog("创建pprof文件夹失败 " + err.Error())
  23. continue
  24. }
  25. }
  26. f, err := os.Create("./pprof/" + fmt.Sprintf("cpu-%s.pprof", time.Now().Format("20060102150405")))
  27. if err != nil {
  28. SysLog("创建pprof文件失败 " + err.Error())
  29. continue
  30. }
  31. err = pprof.StartCPUProfile(f)
  32. if err != nil {
  33. SysLog("启动pprof失败 " + err.Error())
  34. continue
  35. }
  36. time.Sleep(10 * time.Second) // profile for 30 seconds
  37. pprof.StopCPUProfile()
  38. f.Close()
  39. }
  40. time.Sleep(30 * time.Second)
  41. }
  42. }