profile-process.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #! /usr/bin/env python3
  2. import sys
  3. import subprocess
  4. import time
  5. import psutil
  6. import matplotlib
  7. matplotlib.use('Agg')
  8. import matplotlib.pyplot as plt
  9. from matplotlib.backends.backend_pdf import PdfPages
  10. def log_performance():
  11. def limit(n, limit):
  12. if n > limit:
  13. return limit
  14. else:
  15. return n
  16. # Interval for data collection (in seconds)
  17. probe_interval = 0.1
  18. i = 0
  19. x = []
  20. # Memory
  21. stats_rss = []
  22. stats_vms = []
  23. # CPU
  24. stats_usr = []
  25. stats_sys = []
  26. stats_cpu = []
  27. # Disk
  28. stats_io_r = []
  29. stats_io_w = []
  30. stats_io_r_b = []
  31. stats_io_w_b = []
  32. proc = subprocess.Popen("./CLI.py")
  33. p = psutil.Process(proc.pid)
  34. start_time = time.time()
  35. while proc is None or proc.poll() is None:
  36. m = p.memory_info()
  37. c = p.cpu_times()
  38. io = p.io_counters()
  39. x.append(i)
  40. stats_rss.append(m[0] / 10 ** 6)
  41. stats_vms.append(m[1] / 10 ** 6)
  42. stats_usr.append(c[0])
  43. stats_sys.append(c[1])
  44. stats_cpu.append(limit(p.cpu_percent(interval=None), 100))
  45. stats_io_r.append(io[0])
  46. stats_io_w.append(io[1])
  47. stats_io_r_b.append(io[2])
  48. stats_io_w_b.append(io[3])
  49. time.sleep(probe_interval)
  50. i += probe_interval
  51. print("=== MEASUREMENT RECORDED " + str(time.time() - start_time) + " seconds.")
  52. # Define style for plots
  53. f, axs = plt.subplots(4, 1, figsize=(8, 12))
  54. plt.rcParams["font.family"] = "monospace"
  55. plt.rcParams["font.size"] = 8.5
  56. plt.rcParams["legend.fontsize"] = 8.0
  57. # plt.autoscale(enable=True, axis='both')
  58. f.subplots_adjust(hspace=0.5)
  59. pp = PdfPages('multipage.pdf')
  60. # f.add_subplot(4,1,2)
  61. plt.subplot(411)
  62. plt.grid(True)
  63. plt.plot(x, stats_cpu, label="CPU Usage")
  64. # plt.plot(x, stats_usr, label="User")
  65. # plt.plot(x, stats_sys, label="System")
  66. plt.xlabel("Execution time (seconds)")
  67. plt.ylabel("CPU Load (%)")
  68. plt.legend(loc="upper left")
  69. # plt.savefig("profile_cpu.png")
  70. # f.add_subplot(4,1,1)
  71. plt.subplot(412)
  72. plt.grid(True)
  73. plt.plot(x, stats_rss, label="RSS")
  74. plt.plot(x, stats_vms, label="VMS")
  75. plt.xlabel("Execution time (seconds)")
  76. plt.ylabel("Memory Usage (MBytes)")
  77. plt.legend(loc="upper left")
  78. # plt.savefig("profile_memory.png")
  79. # f.add_subplot(4,1,3)
  80. plt.subplot(413)
  81. plt.grid(True)
  82. plt.plot(x, stats_io_r, label="IO Reads")
  83. # plt.plot(x, stats_io_w, label="IO Writes")
  84. # plt.plot(x, stats_io_r_b, label="IO Reads Bytes")
  85. # plt.plot(x, stats_io_w_b, label="IO Writes Bytes")
  86. # plt.xlabel("Execution time (seconds)")
  87. plt.xlabel("Execution time (seconds)")
  88. plt.ylabel("I/O reads counter")
  89. # plt.ylabel("IO Profile")
  90. plt.legend(loc="upper left")
  91. # f.add_subplot(4,1,4)
  92. plt.subplot(414)
  93. plt.grid(True)
  94. plt.plot(x, stats_io_w, label="IO Writes")
  95. plt.xlabel("Execution time (seconds)")
  96. plt.ylabel("I/O writes counter")
  97. plt.legend(loc="upper left")
  98. plt.savefig(pp, format='pdf')
  99. pp.close()
  100. sys.exit(proc.returncode)
  101. log_performance()