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.

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