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.

148 Zeilen
5.5KB

  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", required=True, 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. pcap_csv_list = list()
  23. for filename in os.listdir(args.pcap_csv_folder):
  24. if filename.endswith(".csv") and "tcp" in filename:
  25. pcap_csv_list.append(filename)
  26. counter = 1
  27. if len(pcap_csv_list) == 0:
  28. print("No CSV files found.")
  29. pcap_csv_list.sort(key=lambda x: int(x.split("_")[-1].replace(".csv", "")))
  30. for csv in pcap_csv_list:
  31. print("\rProcessing {} out of {} CSVs.\t({}%)\t".format(counter, len(pcap_csv_list), math.floor(counter/len(pcap_csv_list))))
  32. #try:
  33. transmission_df = pd.read_csv(
  34. "{}{}".format(args.pcap_csv_folder, csv),
  35. dtype=dict(is_retranmission=bool, is_dup_ack=bool),
  36. )
  37. transmission_df["datetime"] = pd.to_datetime(transmission_df["datetime"]) - pd.Timedelta(hours=1)
  38. transmission_df = transmission_df.set_index("datetime")
  39. transmission_df.index = pd.to_datetime(transmission_df.index)
  40. transmission_df = transmission_df.sort_index()
  41. # srtt to [s]
  42. transmission_df["srtt"] = transmission_df["srtt"].apply(lambda x: x / 10**6)
  43. # key for columns and level for index
  44. transmission_df["goodput"] = transmission_df["payload_size"].groupby(pd.Grouper(level="datetime", freq="{}s".format(args.interval))).transform("sum")
  45. transmission_df["goodput"] = transmission_df["goodput"].apply(
  46. lambda x: ((x * 8) / args.interval) / 10**6
  47. )
  48. transmission_df["goodput_rolling"] = transmission_df["payload_size"].rolling("{}s".format(args.interval)).sum()
  49. transmission_df["goodput_rolling"] = transmission_df["goodput_rolling"].apply(
  50. lambda x: ((x * 8) / args.interval) / 10 ** 6
  51. )
  52. # set meta values and remove all not needed columns
  53. cc_algo = transmission_df["congestion_control"].iloc[0]
  54. cc_algo = cc_algo.upper()
  55. transmission_direction = transmission_df["direction"].iloc[0]
  56. #transmission_df = transmission_df.filter(["goodput", "datetime", "ack_rtt", "goodput_rolling", "snd_cwnd"])
  57. # read serial csv
  58. serial_df = pd.read_csv(args.serial_file)
  59. serial_df["datetime"] = pd.to_datetime(serial_df["datetime"]) - pd.Timedelta(hours=1)
  60. serial_df = serial_df.set_index("datetime")
  61. serial_df.index = pd.to_datetime(serial_df.index)
  62. serial_df.sort_index()
  63. transmission_df = pd.merge_asof(
  64. transmission_df,
  65. serial_df,
  66. tolerance=pd.Timedelta("1s"),
  67. right_index=True,
  68. left_index=True,
  69. )
  70. transmission_df = transmission_df.rename(columns={"PCID": "lte_pcid", "PCID.1": "nr_pcid"})
  71. # transmission timeline
  72. scaley = 1.5
  73. scalex = 1.0
  74. plt.title("{} with {}".format(transmission_direction, cc_algo))
  75. fig, ax = plt.subplots(2, 1, figsize=[6.4 * scaley, 4.8 * scalex])
  76. fig.subplots_adjust(right=0.75)
  77. ax0 = ax[0]
  78. ax1 = ax0.twinx()
  79. ax2 = ax0.twinx()
  80. ax2.spines.right.set_position(("axes", 3))
  81. ax00 = ax[1]
  82. ax01 = ax00.twinx()
  83. transmission_df["lte_handovers"] = transmission_df["lte_pcid"].diff()
  84. lte_handovers = transmission_df[transmission_df.lte_pcid.diff() != 0].index.values
  85. nr_handovers = transmission_df[transmission_df.nr_pcid.diff() != 0].index.values
  86. print(transmission_df["lte_handovers"])
  87. print(len(transmission_df["lte_handovers"]))
  88. continue
  89. # Plot vertical lines
  90. for item in lte_handovers[1::]:
  91. ax00.axvline(item, ymin=0, ymax=1, color='red')
  92. for item in nr_handovers[1::]:
  93. ax00.axvline(item, ymin=0, ymax=1, color='red')
  94. ax0.plot(transmission_df["snd_cwnd"].dropna(), color="lime", linestyle="dashed", label="cwnd")
  95. ax1.plot(transmission_df["srtt"].dropna(), color="red", linestyle="dashdot", label="sRTT")
  96. ax2.plot(transmission_df["goodput_rolling"], color="blue", linestyle="solid", label="goodput")
  97. ax00.plot(transmission_df["downlink_cqi"].dropna(), color="magenta", linestyle="dotted", label="CQI")
  98. ax01.plot(transmission_df["DL_bandwidth"].dropna(), color="peru", linestyle="dotted", label="DL_bandwidth")
  99. ax2.spines.right.set_position(("axes", 1.1))
  100. ax0.set_ylim(0, 5000)
  101. ax1.set_ylim(0, 0.3)
  102. ax2.set_ylim(0, 500)
  103. ax00.set_ylim(0, 16)
  104. ax01.set_ylim(0, 21)
  105. ax00.set_xlabel("arrival time")
  106. ax2.set_ylabel("Goodput [mbps]")
  107. ax00.set_ylabel("CQI")
  108. ax1.set_ylabel("sRTT [s]")
  109. ax0.set_ylabel("cwnd")
  110. ax01.set_ylabel("Bandwidth [MHz]")
  111. plt.savefig("{}{}_plot.pdf".format(args.save, csv.replace(".csv", "")))
  112. #except Exception as e:
  113. # print("Error processing file: {}".format(csv))
  114. # print(str(e))
  115. counter += 1
  116. plt.clf()