Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

164 lines
6.6KB

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