Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

172 Zeilen
6.9KB

  1. #!/usr/bin/env python3
  2. import math
  3. import multiprocessing
  4. import os
  5. import pickle
  6. from argparse import ArgumentParser
  7. import matplotlib
  8. import pandas as pd
  9. import matplotlib.pyplot as plt
  10. if __name__ == "__main__":
  11. parser = ArgumentParser()
  12. parser.add_argument("-s", "--serial_file", required=True, help="Serial csv file.")
  13. parser.add_argument("-p", "--pcap_csv_folder", required=True, help="PCAP csv folder.")
  14. parser.add_argument("--save", default=None, help="Location to save pdf file.")
  15. parser.add_argument(
  16. "-i",
  17. "--interval",
  18. default=10,
  19. type=int,
  20. help="Time interval for rolling window.",
  21. )
  22. args = parser.parse_args()
  23. manager = multiprocessing.Manager()
  24. n = manager.Value("i", 0)
  25. frame_list = manager.list()
  26. jobs = []
  27. # load all pcap csv into one dataframe
  28. pcap_csv_list = list()
  29. for filename in os.listdir(args.pcap_csv_folder):
  30. if filename.endswith(".csv") and "tcp" in filename:
  31. pcap_csv_list.append(filename)
  32. counter = 1
  33. if len(pcap_csv_list) == 0:
  34. print("No CSV files found.")
  35. pcap_csv_list.sort(key=lambda x: int(x.split("_")[-1].replace(".csv", "")))
  36. for csv in pcap_csv_list:
  37. print("\rProcessing {} out of {} CSVs.\t({}%)\t".format(counter, len(pcap_csv_list), math.floor(counter/len(pcap_csv_list))))
  38. try:
  39. transmission_df = pd.read_csv(
  40. "{}{}".format(args.pcap_csv_folder, csv),
  41. dtype=dict(is_retranmission=bool, is_dup_ack=bool),
  42. )
  43. transmission_df["datetime"] = pd.to_datetime(transmission_df["datetime"]) - pd.Timedelta(hours=1)
  44. transmission_df = transmission_df.set_index("datetime")
  45. transmission_df.index = pd.to_datetime(transmission_df.index)
  46. transmission_df = transmission_df.sort_index()
  47. # srtt to [s]
  48. transmission_df["srtt"] = transmission_df["srtt"].apply(lambda x: x / 10**6)
  49. # key for columns and level for index
  50. transmission_df["goodput"] = transmission_df["payload_size"].groupby(pd.Grouper(level="datetime", freq="{}s".format(args.interval))).transform("sum")
  51. transmission_df["goodput"] = transmission_df["goodput"].apply(
  52. lambda x: ((x * 8) / args.interval) / 10**6
  53. )
  54. transmission_df["goodput_rolling"] = transmission_df["payload_size"].rolling("{}s".format(args.interval)).sum()
  55. transmission_df["goodput_rolling"] = transmission_df["goodput_rolling"].apply(
  56. lambda x: ((x * 8) / args.interval) / 10 ** 6
  57. )
  58. # set meta values and remove all not needed columns
  59. cc_algo = transmission_df["congestion_control"].iloc[0]
  60. cc_algo = cc_algo.upper()
  61. transmission_direction = transmission_df["direction"].iloc[0]
  62. #transmission_df = transmission_df.filter(["goodput", "datetime", "ack_rtt", "goodput_rolling", "snd_cwnd"])
  63. # read serial csv
  64. serial_df = pd.read_csv(args.serial_file)
  65. serial_df["datetime"] = pd.to_datetime(serial_df["datetime"]) - pd.Timedelta(hours=1)
  66. serial_df = serial_df.set_index("datetime")
  67. serial_df.index = pd.to_datetime(serial_df.index)
  68. serial_df.sort_index()
  69. transmission_df = pd.merge_asof(
  70. transmission_df,
  71. serial_df,
  72. tolerance=pd.Timedelta("1s"),
  73. right_index=True,
  74. left_index=True,
  75. )
  76. # transmission timeline
  77. scaley = 1.5
  78. scalex = 1.0
  79. fig, ax = plt.subplots(figsize=[6.4 * scaley, 4.8 * scalex])
  80. plt.title("{} with {}".format(transmission_direction, cc_algo))
  81. fig.subplots_adjust(right=0.75)
  82. twin1 = ax.twinx()
  83. twin2 = ax.twinx()
  84. twin3 = ax.twinx()
  85. # Offset the right spine of twin2. The ticks and label have already been
  86. # placed on the right by twinx above.
  87. twin2.spines.right.set_position(("axes", 1.1))
  88. twin3.spines.right.set_position(("axes", 1.2))
  89. # create list fo color indices
  90. transmission_df["index"] = transmission_df.index
  91. color_dict = dict()
  92. color_list = list()
  93. i = 0
  94. for cell_id in transmission_df["cellID"]:
  95. if cell_id not in color_dict:
  96. color_dict[cell_id] = i
  97. i += 1
  98. color_list.append(color_dict[cell_id])
  99. transmission_df["cell_color"] = color_list
  100. color_dict = None
  101. color_list = None
  102. cmap = matplotlib.cm.get_cmap("Set3")
  103. unique_cells = transmission_df["cell_color"].unique()
  104. color_list = cmap.colors * (round(len(unique_cells) / len(cmap.colors)) + 1)
  105. for c in transmission_df["cell_color"].unique():
  106. bounds = transmission_df[["index", "cell_color"]].groupby("cell_color").agg(["min", "max"]).loc[c]
  107. ax.axvspan(bounds.min(), bounds.max(), alpha=0.3, color=color_list[c])
  108. p4, = twin3.plot(transmission_df["snd_cwnd"].dropna(), color="lime", linestyle="dashed", label="cwnd")
  109. p3, = twin2.plot(transmission_df["srtt"].dropna(), color="red", linestyle="dashdot", label="sRTT")
  110. p1, = ax.plot(transmission_df["goodput_rolling"], color="blue", linestyle="solid", label="goodput")
  111. p2, = twin1.plot(transmission_df["downlink_cqi"].dropna(), color="magenta", linestyle="dotted", label="CQI")
  112. ax.set_xlim(transmission_df["index"].min(), transmission_df["index"].max())
  113. ax.set_ylim(0, 500)
  114. twin1.set_ylim(0, 15)
  115. twin2.set_ylim(0, transmission_df["ack_rtt"].max())
  116. twin3.set_ylim(0, transmission_df["snd_cwnd"].max() + 10)
  117. ax.set_xlabel("arrival time")
  118. ax.set_ylabel("Goodput [mbps]")
  119. twin1.set_ylabel("CQI")
  120. twin2.set_ylabel("sRTT [s]")
  121. twin3.set_ylabel("cwnd")
  122. ax.yaxis.label.set_color(p1.get_color())
  123. twin1.yaxis.label.set_color(p2.get_color())
  124. twin2.yaxis.label.set_color(p3.get_color())
  125. twin3.yaxis.label.set_color(p4.get_color())
  126. tkw = dict(size=4, width=1.5)
  127. ax.tick_params(axis='y', colors=p1.get_color(), **tkw)
  128. twin1.tick_params(axis='y', colors=p2.get_color(), **tkw)
  129. twin2.tick_params(axis='y', colors=p3.get_color(), **tkw)
  130. twin3.tick_params(axis='y', colors=p4.get_color(), **tkw)
  131. ax.tick_params(axis='x', **tkw)
  132. #ax.legend(handles=[p1, p2, p3])
  133. if args.save:
  134. plt.savefig("{}{}_plot.pdf".format(args.save, csv.replace(".csv", "")))
  135. except Exception as e:
  136. print("Error processing file: {}".format(csv))
  137. print(str(e))
  138. counter += 1
  139. plt.clf()