You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

debug.go 1.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // Copyright (c) 2012-2014 Jeremy Latt
  2. // released under the MIT license
  3. package irc
  4. import (
  5. "os"
  6. "runtime"
  7. "runtime/debug"
  8. "runtime/pprof"
  9. "time"
  10. )
  11. func (msg *DebugCommand) HandleServer(server *Server) {
  12. client := msg.Client()
  13. if !client.flags[Operator] {
  14. return
  15. }
  16. switch msg.subCommand {
  17. case "GCSTATS":
  18. stats := debug.GCStats{
  19. Pause: make([]time.Duration, 10),
  20. PauseQuantiles: make([]time.Duration, 5),
  21. }
  22. debug.ReadGCStats(&stats)
  23. server.Replyf(client, "last GC: %s", stats.LastGC.Format(time.RFC1123))
  24. server.Replyf(client, "num GC: %d", stats.NumGC)
  25. server.Replyf(client, "pause total: %s", stats.PauseTotal)
  26. server.Replyf(client, "pause quantiles min%%: %s", stats.PauseQuantiles[0])
  27. server.Replyf(client, "pause quantiles 25%%: %s", stats.PauseQuantiles[1])
  28. server.Replyf(client, "pause quantiles 50%%: %s", stats.PauseQuantiles[2])
  29. server.Replyf(client, "pause quantiles 75%%: %s", stats.PauseQuantiles[3])
  30. server.Replyf(client, "pause quantiles max%%: %s", stats.PauseQuantiles[4])
  31. case "NUMGOROUTINE":
  32. count := runtime.NumGoroutine()
  33. server.Replyf(client, "num goroutines: %d", count)
  34. case "PROFILEHEAP":
  35. profFile := "ergonomadic.mprof"
  36. file, err := os.Create(profFile)
  37. if err != nil {
  38. server.Replyf(client, "error: %s", err)
  39. break
  40. }
  41. defer file.Close()
  42. pprof.Lookup("heap").WriteTo(file, 0)
  43. server.Replyf(client, "written to %s", profFile)
  44. case "STARTCPUPROFILE":
  45. profFile := "ergonomadic.prof"
  46. file, err := os.Create(profFile)
  47. if err != nil {
  48. server.Replyf(client, "error: %s", err)
  49. break
  50. }
  51. if err := pprof.StartCPUProfile(file); err != nil {
  52. defer file.Close()
  53. server.Replyf(client, "error: %s", err)
  54. break
  55. }
  56. server.Replyf(client, "CPU profile writing to %s", profFile)
  57. case "STOPCPUPROFILE":
  58. pprof.StopCPUProfile()
  59. server.Reply(client, "CPU profiling stopped")
  60. }
  61. }