batchplotter.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #!/usr/bin/env python3
  2. # vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
  3. import json
  4. import matplotlib.pyplot as plt
  5. import os
  6. import sys
  7. from subprocess import Popen, PIPE
  8. from stats import parseData
  9. bar_width = 0.25
  10. index = []
  11. def plot(process_data, title, filename):
  12. fig, ax = plt.subplots(figsize=(10,5))
  13. task_output = []
  14. for p in process_data:
  15. cmd = ["./simusched",p["tasks"]]
  16. cmd.extend(p["args"].split(" "))
  17. process = Popen(cmd, stdout=PIPE)
  18. (out, _) = process.communicate()
  19. process.wait()
  20. out = out.decode("utf-8")
  21. (parsed,idle) = parseData(out.split("\n"))
  22. ap = {}
  23. ap["idle"] = idle
  24. ap["processes"] = parsed
  25. ap["tasks"] = p["tasks"]
  26. ap["args"] = p["args"]
  27. task_output.append(ap)
  28. m_latencies = []
  29. m_ready = []
  30. m_cpu = []
  31. m_cpuio = []
  32. idletime = []
  33. for t in task_output:
  34. m_latencies.append(meanLatency(t))
  35. m_ready.append(meanReady(t))
  36. m_cpu.append(meanCPU(t))
  37. m_cpuio.append(meanCPUIO(t))
  38. idletime.append(t["idle"])
  39. plot_data(0, m_latencies, 'r', 'M. Latency')
  40. plot_data(1, m_ready, 'g', 'M. Ready')
  41. plot_data(2, m_cpu, 'b', 'M. CPU')
  42. plot_data(3, m_cpuio, '#deadbe', 'M. CPU+IO')
  43. plot_data(4, idletime, '#c1c1c1', 'Idle')
  44. ax.set_ylabel('Ticks')
  45. ax.set_title(title + " - %s" % task_output[0]["tasks"])
  46. ax.set_xticks([ i + 1.5 * bar_width for i in index])
  47. xtlbls = []
  48. for i in range(len(process_data)):
  49. lbl = task_output[i]["args"]
  50. if len(lbl) > 30:
  51. lbl=lbl[:30]+ "..."
  52. xtlbls.append(lbl)
  53. ax.set_xticklabels(xtlbls)
  54. for tick in ax.xaxis.get_major_ticks():
  55. tick.label.set_fontsize(8)
  56. plt.legend(loc="best")
  57. plt.tight_layout()
  58. plt.grid()
  59. plt.savefig(filename)
  60. def meanLatency(pl):
  61. totLatency = sum([ latency(p) for p in pl["processes"]])
  62. mean = totLatency / len(pl["processes"])
  63. return mean
  64. def meanReady(pl):
  65. totReady = sum([ ready(p) for p in pl["processes"]])
  66. mean = totReady / len(pl["processes"])
  67. return mean
  68. def meanCPU(pl):
  69. totCPU = sum([ cpu(p) for p in pl["processes"]])
  70. mean = totCPU / len(pl["processes"])
  71. return mean
  72. def meanCPUIO(pl):
  73. totCPUIO = sum([ cpu_io(p) for p in pl["processes"]])
  74. mean = totCPUIO / len(pl["processes"])
  75. return mean
  76. def latency(p):
  77. return p["primerTick"]-p["cargaTick"]
  78. def ready(p):
  79. return (p["ultimoTick"]-p["primerTick"])-(p["ticksBlock"]+p["ticksCpu"])+(p["primerTick"]-p["cargaTick"])
  80. def cpu(p):
  81. return p["ticksCpu"]
  82. def cpu_io(p):
  83. return p["ticksBlock"]+p["ticksCpu"]
  84. def plot_data(ind, data, color, label):
  85. opacity = 1
  86. plt.bar([i + bar_width*ind for i in index],
  87. data,
  88. bar_width,
  89. alpha=opacity,
  90. color=color,
  91. label=(label))
  92. if len(sys.argv) != 2:
  93. print("1 arg, json file")
  94. sys.exit(1)
  95. if not os.path.isfile(sys.argv[1]):
  96. print("'%s' no es un archivo / no existe" % sys.argv[1])
  97. sys.exit(2)
  98. try:
  99. data = open(sys.argv[1]).read()
  100. j = json.loads(data)
  101. index = [ 1.5*i for i in list(range(len(j["list"]))) ]
  102. plot(j["list"],j["title"], j["filename"])
  103. except Exception as e:
  104. print("Exception")
  105. print(data)
  106. print(e)