110 lines
3.1 KiB
Python
110 lines
3.1 KiB
Python
import socket
|
|
from multiprocessing import Pipe
|
|
from threading import Thread
|
|
from time import time, sleep
|
|
from numpy import std, floor, log10
|
|
|
|
from meow_base.patterns.network_event_pattern import NetworkMonitor, \
|
|
NetworkEventPattern
|
|
from meow_base.recipes.jupyter_notebook_recipe import JupyterNotebookRecipe
|
|
from meow_base.tests.shared import BAREBONES_NOTEBOOK
|
|
|
|
def send(port):
|
|
sender = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
while True:
|
|
try:
|
|
sender.connect(("127.0.0.1", port))
|
|
sender.sendall(b'test')
|
|
sender.close()
|
|
break
|
|
except:
|
|
continue
|
|
|
|
def get_all(from_monitor_reader, event_count):
|
|
for _ in range(event_count):
|
|
if from_monitor_reader.poll(3):
|
|
event = from_monitor_reader.recv()
|
|
else:
|
|
raise Exception("Did not receive all events")
|
|
|
|
def test_network(monitor_count: int, patterns_per_monitor: int,
|
|
events_per_pattern: int, start_port: int):
|
|
|
|
monitors = []
|
|
port = start_port
|
|
|
|
|
|
recipe = JupyterNotebookRecipe(
|
|
"recipe_one", BAREBONES_NOTEBOOK)
|
|
recipes = {
|
|
recipe.name: recipe
|
|
}
|
|
|
|
from_monitor_reader, from_monitor_writer = Pipe()
|
|
|
|
for _ in range(monitor_count):
|
|
patterns = {}
|
|
for p in range(patterns_per_monitor):
|
|
pattern_name = f"pattern_{p}"
|
|
patterns[pattern_name] = NetworkEventPattern(
|
|
pattern_name,
|
|
port,
|
|
recipe.name
|
|
)
|
|
port += 1
|
|
|
|
monitor = NetworkMonitor(patterns, recipes)
|
|
monitor.to_runner_event = from_monitor_writer
|
|
monitors.append(monitor)
|
|
monitor.start()
|
|
|
|
|
|
event_count = monitor_count*patterns_per_monitor*events_per_pattern
|
|
|
|
receiver = Thread(target=get_all, args=(from_monitor_reader, event_count,))
|
|
receiver.start()
|
|
|
|
start_time = time()
|
|
|
|
|
|
for p in range(start_port, port):
|
|
for _ in range(events_per_pattern):
|
|
send(p)
|
|
# Thread(target=send, args=(p,)).start()
|
|
|
|
receiver.join()
|
|
|
|
duration = time() - start_time
|
|
|
|
for monitor in monitors:
|
|
monitor.stop()
|
|
|
|
return duration
|
|
|
|
def sigfigs(num):
|
|
if num < 10:
|
|
return round(num, -int(floor(log10(abs(num))-1)))
|
|
else:
|
|
return int(num)
|
|
|
|
def main():
|
|
monitors = 1
|
|
patterns = 1
|
|
events = 10_000
|
|
|
|
n = 100
|
|
|
|
durations = []
|
|
for i in range(n):
|
|
print(" ", i, end=" \r")
|
|
durations.append(test_network(monitors,patterns,events,1024))
|
|
sleep(0.5)
|
|
|
|
print(f"({monitors}, {patterns}, {events}) min: {min(durations)}, max: {max(durations)}, avg: {sum(durations)/n}, std: {std(durations)}")
|
|
|
|
# print(f"{sigfigs(min(durations)*1000)}ms & {sigfigs((min(durations)*1000)/events)}ms & {sigfigs(max(durations)*1000)}ms & {sigfigs((max(durations)*1000)/events)}ms & {sigfigs((sum(durations)/n)*1000)}ms & {sigfigs(((sum(durations)/n)*1000)/events)}ms & {sigfigs(std(durations)*1000)}ms")
|
|
print(f"{sigfigs(min(durations)*1000)}ms & {sigfigs(max(durations)*1000)}ms & {sigfigs((sum(durations)/n)*1000)}ms & {sigfigs(std(durations)*1000)}ms")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|