Compare commits

...

20 Commits

Author SHA1 Message Date
fe75cc59b4 Merge pull request 'bar-graphs' (#7) from bar-graphs into develop
Reviewed-on: #7
2021-02-16 15:47:45 +00:00
71849ff60d reordered notebook 2020-12-12 18:55:05 +00:00
23e13ad43c events and timeouts 2020-12-12 17:15:09 +00:00
1e3b0d7634 git churn error 2020-12-12 13:06:20 +00:00
a9d001e764 Refactored graph generation
- Refactored graph generation
- Added bar graphs and switched most
2020-12-12 10:40:29 +00:00
ccff05c8d2 Merge pull request 'direct-fixes' (#6) from direct-fixes into develop
Reviewed-on: #6
2020-12-11 16:02:36 +00:00
bd3347d7a4 extended interval size 2020-11-16 23:04:48 +00:00
433f8785af improved testing 2020-11-16 14:55:05 +00:00
907093a925 Merge pull request 'client' (#5) from client into develop
Reviewed-on: #5
2020-11-16 12:15:02 +00:00
3ec73e203d direct tests 2020-11-16 11:47:22 +00:00
135d2e8cec improved testing 2020-11-15 00:48:44 +00:00
3e777bde92 removed bridge subnet collisions 2020-11-14 12:54:50 +00:00
e47e058c3f improved variation 2020-11-14 10:50:20 +00:00
d700800a78 updated remaining tests 2020-11-13 16:53:56 +00:00
b36556bb71 added standard structures 2020-11-13 16:37:06 +00:00
e594f6f06e brevity 2020-11-10 21:43:49 +00:00
5e2009610f removed array expansion 2020-11-10 20:46:27 +00:00
6c657866e0 updated install scripts 2020-11-10 20:44:54 +00:00
ad07a44065 needs further debugging 2020-11-09 14:18:23 +00:00
268d26d802 adding support for client behind 2020-11-09 10:54:40 +00:00
17 changed files with 1024 additions and 6766 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
output/
# Created by https://www.toptal.com/developers/gitignore/api/python,intellij+all,dotenv
# Edit at https://www.toptal.com/developers/gitignore?templates=python,intellij+all,dotenv

View File

@ -2,7 +2,9 @@
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"metadata": {
"collapsed": false
},
"source": [
"# Project Evaluation\n",
"\n",
@ -13,9 +15,7 @@
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
"collapsed": false
},
"source": [
"## Setup\n",
@ -25,17 +25,20 @@
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"import os\n",
"import ipaddress\n",
"import threading\n",
"\n",
"import runners\n",
"from structure import Bridge\n",
"from structure import RemotePortal, LocalPortal\n",
"from structure import Interface, IpMethod\n",
"from structure import StandardEnvironment, StandardTest\n",
"from structure import DirectEnvironment, DirectTest\n",
"from structure import BaseEnvironment\n",
"\n",
"%load_ext dotenv\n",
"%dotenv"
@ -44,9 +47,7 @@
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
"collapsed": false
},
"source": [
"## Testing\n",
@ -83,10 +84,7 @@
" 'access_key': os.getenv('S3_ACCESS_KEY'),\n",
" 'secret_key': os.getenv('S3_SECRET_KEY'),\n",
" 'branch': os.getenv('TARGET_BRANCH'),\n",
"}\n",
"\n",
"directionInbound = {}\n",
"directionOutbound = {}"
"}"
]
},
{
@ -99,187 +97,151 @@
},
"outputs": [],
"source": [
"rp = RemotePortal([Interface(IpMethod.Auto4)], setup_params=setup_params)\n",
"lp = LocalPortal([\n",
" Interface(IpMethod.Auto4),\n",
"], None, setup_params=setup_params)\n",
"from graphs import TestStore\n",
"\n",
"rp.set_local_portal(lp)\n",
"lp.set_remote_portal(rp)\n",
"test_store = TestStore()\n",
"\n",
"top_level_bridge = Bridge(*[\n",
" rp.get_interfaces()[0],\n",
" lp.get_interfaces()[0],\n",
"])\n",
"def run_and_save_test(env: BaseEnvironment, test: StandardTest):\n",
" (inbound, outbound) = env.test(test)\n",
" test_store.save_inbound(test, inbound)\n",
" test_store.save_outbound(test, outbound)\n",
"\n",
"try:\n",
" runner.build(top_level_bridge)\n",
"def attempt_n_times(foo, n=3):\n",
" for i in range(n):\n",
" try:\n",
" return foo()\n",
" except KeyboardInterrupt as e:\n",
" raise e\n",
" except Exception as e:\n",
" if i == n - 1:\n",
" raise e\n",
"\n",
" lp.get_interfaces()[0].set_rate(1)\n",
" lp.speedtest_server()\n",
" directionInbound['One1MBNotProxied'] = rp.speedtest_client(lp.get_interfaces()[0].get_address())\n",
" rp.speedtest_server()\n",
" directionOutbound['One1MBNotProxied'] = lp.speedtest_client(rp.get_interfaces()[0].get_address())\n",
"\n",
" lp.get_interfaces()[0].set_rate(2)\n",
" lp.speedtest_server()\n",
" directionInbound['One2MBNotProxied'] = rp.speedtest_client(lp.get_interfaces()[0].get_address())\n",
" rp.speedtest_server()\n",
" directionOutbound['One2MBNotProxied'] = lp.speedtest_client(rp.get_interfaces()[0].get_address())\n",
"finally:\n",
" runner.teardown()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"rp = RemotePortal([Interface(IpMethod.Auto4)], setup_params=setup_params)\n",
"lp = LocalPortal([\n",
" Interface(IpMethod.Auto4),\n",
" Interface(IpMethod.Auto4),\n",
"], None, setup_params=setup_params)\n",
"\n",
"rp.set_local_portal(lp)\n",
"lp.set_remote_portal(rp)\n",
"\n",
"top_level_bridge = Bridge(*[\n",
" rp.get_interfaces()[0],\n",
" *lp.get_interfaces()[0:2],\n",
"])\n",
"\n",
"try:\n",
" runner.build(top_level_bridge)\n",
"\n",
" lp.get_interfaces()[0].set_rate(1)\n",
" lp.get_interfaces()[1].set_rate(1)\n",
"\n",
" lp.speedtest_server()\n",
" directionInbound['Two1MBProxied'] = rp.speedtest_client('172.19.152.3')\n",
" rp.speedtest_server()\n",
" directionOutbound['Two1MBProxied'] = lp.speedtest_client('172.19.152.2')\n",
"\n",
" lp.get_interfaces()[0].set_rate(2)\n",
" lp.get_interfaces()[1].set_rate(2)\n",
"\n",
" lp.speedtest_server()\n",
" directionInbound['Two2MBProxied'] = rp.speedtest_client('172.19.152.3')\n",
" rp.speedtest_server()\n",
" directionOutbound['Two2MBProxied'] = lp.speedtest_client('172.19.152.2')\n",
"\n",
" lp.get_interfaces()[0].set_rate(1)\n",
" lp.get_interfaces()[1].set_rate(2)\n",
"\n",
" lp.speedtest_server()\n",
" directionInbound['One1MBOne2MBProxied'] = rp.speedtest_client('172.19.152.3')\n",
" rp.speedtest_server()\n",
" directionOutbound['One1MBOne2MBProxied'] = lp.speedtest_client('172.19.152.2')\n",
"\n",
" lp.get_interfaces()[0].set_rate(2)\n",
" lp.get_interfaces()[1].set_rate(2)\n",
"\n",
" lp.speedtest_server()\n",
" threading.Timer(5+15, lambda: lp.get_interfaces()[1].set_rate(1)).start()\n",
" threading.Timer(5+30, lambda: lp.get_interfaces()[1].set_rate(2)).start()\n",
"\n",
" directionInbound['One2MBOneYMBProxiedSlow15Return30'] = rp.speedtest_client('172.19.152.3', time=60)\n",
" rp.speedtest_server()\n",
" directionOutbound['One2MBOneYMBProxiedSlow15Return30'] = lp.speedtest_client('172.19.152.2', time=60)\n",
"finally:\n",
" runner.teardown()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"rp = RemotePortal([Interface(IpMethod.Auto4)], setup_params=setup_params)\n",
"lp = LocalPortal([\n",
" Interface(IpMethod.Auto4),\n",
" Interface(IpMethod.Auto4),\n",
" Interface(IpMethod.Auto4),\n",
"], None, setup_params=setup_params)\n",
"\n",
"rp.set_local_portal(lp)\n",
"lp.set_remote_portal(rp)\n",
"\n",
"top_level_bridge = Bridge(*[\n",
" rp.get_interfaces()[0],\n",
" *lp.get_interfaces()[0:3],\n",
"])\n",
"\n",
"try:\n",
" runner.build(top_level_bridge)\n",
"\n",
" lp.get_interfaces()[0].set_rate(1)\n",
" lp.get_interfaces()[1].set_rate(1)\n",
" lp.get_interfaces()[2].set_rate(1)\n",
"\n",
" lp.speedtest_server()\n",
" directionInbound['Three1MBProxied'] = rp.speedtest_client('172.19.152.3')\n",
" rp.speedtest_server()\n",
" directionOutbound['Three1MBProxied'] = lp.speedtest_client('172.19.152.2')\n",
"finally:\n",
" runner.teardown()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"rp = RemotePortal([Interface(IpMethod.Auto4)], setup_params=setup_params)\n",
"lp = LocalPortal([\n",
" Interface(IpMethod.Auto4),\n",
" Interface(IpMethod.Auto4),\n",
" Interface(IpMethod.Auto4),\n",
" Interface(IpMethod.Auto4),\n",
"], None, setup_params=setup_params)\n",
"\n",
"rp.set_local_portal(lp)\n",
"lp.set_remote_portal(rp)\n",
"\n",
"top_level_bridge = Bridge(*[\n",
" rp.get_interfaces()[0],\n",
" *lp.get_interfaces()[0:4],\n",
"])\n",
"\n",
"try:\n",
" runner.build(top_level_bridge)\n",
"\n",
" lp.get_interfaces()[0].set_rate(1)\n",
" lp.get_interfaces()[1].set_rate(1)\n",
" lp.get_interfaces()[2].set_rate(1)\n",
" lp.get_interfaces()[3].set_rate(1)\n",
"\n",
" lp.speedtest_server()\n",
" directionInbound['Four1MBProxied'] = rp.speedtest_client('172.19.152.3')\n",
" rp.speedtest_server()\n",
" directionOutbound['Four1MBProxied'] = lp.speedtest_client('172.19.152.2')\n",
"finally:\n",
" runner.teardown()\n"
"fast_tests = True"
]
},
{
"cell_type": "markdown",
"metadata": {},
"metadata": {
"collapsed": false
},
"source": [
"### Direct Server to Server"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"def direct_tests():\n",
" with DirectEnvironment(runner) as env:\n",
" run_and_save_test(env, DirectTest(1, bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
" run_and_save_test(env, DirectTest(2, bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
" run_and_save_test(env, DirectTest(3, bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
" run_and_save_test(env, DirectTest(4, bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
"\n",
"attempt_n_times(direct_tests)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"### Local Portal with 2 Interfaces"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"def two_interface_tests():\n",
" with StandardEnvironment(2, runner, setup_params) as env:\n",
" run_and_save_test(env, StandardTest([1,1], bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
" run_and_save_test(env, StandardTest([1,2], bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
" run_and_save_test(env, StandardTest([2,2], bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
" run_and_save_test(env, StandardTest(\n",
" [2,2],\n",
" events={10: (0,1), 20: (0,2)},\n",
" duration=30,\n",
" interval_variation_target=0.8 if fast_tests else 0.5,\n",
" ))\n",
"\n",
"attempt_n_times(two_interface_tests)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"### Local Portal with 3 Interfaces"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"def three_interface_tests():\n",
" with StandardEnvironment(3, runner, setup_params) as env:\n",
" run_and_save_test(env, StandardTest([1,1,1], bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
" run_and_save_test(env, StandardTest([2,2,2], bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
"\n",
"attempt_n_times(three_interface_tests)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"### Local Portal with 4 Interfaces"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"def four_interface_tests():\n",
" with StandardEnvironment(4, runner, setup_params) as env:\n",
" run_and_save_test(env, StandardTest([1,1,1,1], bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
" run_and_save_test(env, StandardTest([2,2,2,2], bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
"\n",
"attempt_n_times(four_interface_tests)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"## Graphs\n",
"This section produces graphs from the collected data."
@ -295,51 +257,24 @@
},
"outputs": [],
"source": [
"from itertools import cycle\n",
"import matplotlib.pyplot as plt\n",
"from graphs import plot_iperf_results, plot_iperf_results_time\n",
"\n",
"def plot_iperf_results(data, title, events=None, filename=None, start_at_zero=True):\n",
" cycol = cycle('brgy')\n",
"if not os.path.exists('output/'):\n",
" os.makedirs('output/')\n",
"\n",
" fig = plt.figure()\n",
" axes = fig.add_axes([0,0,1,1])\n",
"\n",
" axes.set_title(title, pad=20.0)\n",
" axes.set_xlabel('Time (s)')\n",
" axes.set_ylabel('Throughput (Mbps)')\n",
"\n",
" for k, v in data.items():\n",
" intervals = [x['sum'] for x in v['intervals'] if not x['sum']['omitted']]\n",
"\n",
" x_axis = [((x['start'] + x['end'])/2) for x in intervals]\n",
" y_axis = [x['bits_per_second']/1e6 for x in intervals]\n",
" axes.plot(x_axis, y_axis, next(cycol), label=k)\n",
"\n",
" legend = axes.legend()\n",
"\n",
" if start_at_zero:\n",
" axes.set_ylim(bottom=0)\n",
" axes.set_xlim(left=0)\n",
"\n",
" if events is not None:\n",
" for k, v in events.items():\n",
" axes.axvline(k, linestyle='--', color='grey')\n",
" axes.annotate(v, (k, 1.02), xycoords=axes.get_xaxis_transform(), ha='center')\n",
"\n",
" if filename is not None:\n",
" fig.savefig(filename, bbox_extra_artists=(legend,), bbox_inches='tight', pad_inches=0.3)"
"for filename in os.listdir('output'):\n",
" file_path = os.path.join('output/', filename)\n",
" os.unlink(file_path)"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
"collapsed": false
},
"source": [
"### Equal Connection Scaling\n",
"This section shows equal connections scaling at various speeds and number of connections."
"### Section 4.2: Graphs\n",
"#### Subsection 4.2.2 Line Graphs"
]
},
{
@ -352,12 +287,16 @@
},
"outputs": [],
"source": [
"plot_iperf_results(\n",
"plot_iperf_results_time(test_store,\n",
" {\n",
" '2x1MBps Connections (proxied)': directionInbound['Two1MBProxied'],\n",
" '1x1MBps Connection (not proxied)': directionInbound['One1MBNotProxied'],\n",
" '4x1MB Connections (proxied)': StandardTest([1,1,1,1]),\n",
" '3x1MB Connections (proxied)': StandardTest([1,1,1]),\n",
" '2x1MB Connections (proxied)': StandardTest([1,1]),\n",
" },\n",
" 'Two Equal 1MB Connections',\n",
" fast_tests,\n",
" error_bars_x=False,\n",
" error_bars_y=False,\n",
" filename='png',\n",
")"
]
},
@ -371,12 +310,16 @@
},
"outputs": [],
"source": [
"plot_iperf_results(\n",
"plot_iperf_results_time(test_store,\n",
" {\n",
" '2x2MBps Connections (proxied)': directionInbound['Two2MBProxied'],\n",
" '1x2MBps Connection (not proxied)': directionInbound['One2MBNotProxied'],\n",
" '4x1MB Connections (proxied)': StandardTest([1,1,1,1]),\n",
" '3x1MB Connections (proxied)': StandardTest([1,1,1]),\n",
" '2x1MB Connections (proxied)': StandardTest([1,1]),\n",
" },\n",
" 'Two Equal 2MB Connections',\n",
" fast_tests,\n",
" error_bars_x=True,\n",
" error_bars_y=False,\n",
" filename='png',\n",
")"
]
},
@ -390,26 +333,27 @@
},
"outputs": [],
"source": [
"plot_iperf_results(\n",
"plot_iperf_results_time(test_store,\n",
" {\n",
" '4x1MBps Connections (proxied)': directionInbound['Four1MBProxied'],\n",
" '3x1MBps Connections (proxied)': directionInbound['Three1MBProxied'],\n",
" '2x1MBps Connections (proxied)': directionInbound['Two1MBProxied'],\n",
" '4x1MB Connections (proxied)': StandardTest([1,1,1,1]),\n",
" '3x1MB Connections (proxied)': StandardTest([1,1,1]),\n",
" '2x1MB Connections (proxied)': StandardTest([1,1]),\n",
" },\n",
" 'More Equal Connections',\n",
" fast_tests,\n",
" error_bars_x=False,\n",
" error_bars_y=True,\n",
" filename='png',\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
"collapsed": false
},
"source": [
"### Mixed Connections Scaling\n",
"This section shows mixed connections at various speeds with various events."
"### Section 4.3: Success Criteria\n",
"#### Subsection 4.3.2: Bidirectional Performance Gains"
]
},
{
@ -422,51 +366,166 @@
},
"outputs": [],
"source": [
"plot_iperf_results(\n",
"plot_iperf_results(test_store,\n",
" {\n",
" '2x2MBps Connections (proxied)': directionInbound['Two2MBProxied'],\n",
" '1x1MBps + 1x2MBps Connections (proxied)': directionInbound['One1MBOne2MBProxied'],\n",
" '2x1MBps Connections (proxied)': directionInbound['Two1MBProxied'],\n",
" '2x1MB Connections (proxied)': StandardTest([1,1]),\n",
" '1x1MB + 1x2MB\\nConnections (proxied)': StandardTest([1,2]),\n",
" '2x2MB Connections (proxied)': StandardTest([2,2]),\n",
" },\n",
" 'Mixed Speed Connections',\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"plot_iperf_results(\n",
" {\n",
" '1x2MBps + 1xYMBps Connections (proxied)': directionInbound['One2MBOneYMBProxiedSlow15Return30'],\n",
" },\n",
" 'Network Slow',\n",
" events={0: 'Y=2', 15: 'Y=1', 30: 'Y=2'}\n",
" fast_tests,\n",
" filename='png',\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {
"pycharm": {
"name": "#%% md\n"
}
"collapsed": false
},
"source": [
"## Criteria\n",
"This section automatically verifies some criteria with assertions."
"#### Subsection 4.3.5: More Bandwidth over Two Equal Connections"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"plot_iperf_results(test_store,\n",
" {\n",
" '1x1MB Connection\\n(direct)': DirectTest(1),\n",
" '2x1MB Connections\\n(proxied)': StandardTest([1,1]),\n",
" '1x2MB Connection\\n(direct)': DirectTest(2),\n",
"\n",
" },\n",
" fast_tests,\n",
" filename='png',\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"### Section 4.4: Extended Goals\n",
"#### Subsection 4.4.1: More Bandwidth over Unequal Connections"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"plot_iperf_results(test_store,\n",
" {\n",
" '2x2MB Connections\\n(proxied)': StandardTest([2,2]),\n",
" '1x1MB + 1x2MB\\nConnections (proxied)': StandardTest([1,2]),\n",
" '2x1MB Connections\\n(proxied)': StandardTest([1,1]),\n",
" },\n",
" fast_tests,\n",
" filename='png',\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"#### Subsection 4.4.2: More Bandwidth over Four Equal Connections"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"plot_iperf_results(test_store,\n",
" {\n",
" '4x1MB Connections\\n(proxied)': StandardTest([1,1,1,1]),\n",
" '3x1MB Connections\\n(proxied)': StandardTest([1,1,1]),\n",
" '2x1MB Connections\\n(proxied)': StandardTest([1,1]),\n",
" },\n",
" fast_tests,\n",
" filename='png',\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"plot_iperf_results(test_store,\n",
" {\n",
" '4x2MB Connections\\n(proxied)': StandardTest([2,2,2,2]),\n",
" '3x2MB Connections\\n(proxied)': StandardTest([2,2,2]),\n",
" '2x2MB Connections\\n(proxied)': StandardTest([2,2]),\n",
" },\n",
" fast_tests,\n",
" filename='png',\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"#### Subsection 4.4.3: Bandwidth Variation"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"plot_iperf_results_time(test_store,\n",
" {\n",
" 'Varied Connection': StandardTest([2,2], events={10: (0,1), 20: (0,2)}, duration=30),\n",
" },\n",
" fast_tests,\n",
" filename='png',\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": []
}
@ -487,7 +546,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.6"
"version": "3.9.0"
}
},
"nbformat": 4,

2
graphs/__init__.py Normal file
View File

@ -0,0 +1,2 @@
from .store import TestStore
from .graphs import plot_iperf_results, plot_iperf_results_time

132
graphs/graphs.py Normal file
View File

@ -0,0 +1,132 @@
from itertools import cycle
from typing import Dict, Union
from matplotlib import pyplot as plt
from graphs import TestStore
from structure import StandardTest
def plot_iperf_results(
store: TestStore,
series: Dict[str, StandardTest],
fast_tests: bool,
title: str = None,
direction='both',
error_bars=True,
filename=None,
):
if direction == 'both':
plot_iperf_results(store, series, fast_tests, title, 'inbound', error_bars, filename)
plot_iperf_results(store, series, fast_tests, title, 'outbound', error_bars, filename)
return
if filename in ['png', 'eps']:
filename = 'output/{}{}{}.{}'.format(
'I' if direction == 'inbound' else 'O',
'E' if error_bars else '',
''.join(['S{}-{}'.format(i, x.name()) for (i, x) in enumerate(series.values())]),
filename,
)
print(filename)
series = {
k: (store.get_inbound(v) if direction == 'inbound' else store.get_outbound(v))
for (k, v) in series.items()
}
fig = plt.figure()
axes = fig.add_axes([0, 0, 1, 1])
if title is not None:
axes.set_title(title, pad=20.0 if True in [len(x.test.events) > 0 for x in series.values()] else None)
axes.set_ylabel('Throughput (Mbps)')
for k, v in series.items():
axes.bar(
k,
v.bandwidth_mean() / 1e6,
yerr=1.5 * v.bandwidth_standard_deviation() / 1e6,
width=0.4,
capsize=15,
)
if fast_tests:
fig.text(0.95, 0.05, 'Draft', fontsize=50, color='gray', ha='right', va='bottom', alpha=0.5)
if filename is not None:
fig.savefig(filename, bbox_inches='tight', pad_inches=0.3)
def plot_iperf_results_time(
store: TestStore,
series: Dict[str, StandardTest],
fast_tests: bool,
title: str = None,
direction='both',
error_bars_x=False,
error_bars_y=True,
filename=None,
start_at_zero=True,
):
if direction == 'both':
plot_iperf_results_time(store, series, fast_tests, title, 'outbound', error_bars_x, error_bars_y, filename,
start_at_zero)
plot_iperf_results_time(store, series, fast_tests, title, 'inbound', error_bars_x, error_bars_y, filename,
start_at_zero)
return
if filename in ['png', 'eps']:
filename = 'output/T{}{}{}{}.{}'.format(
'I' if direction == 'inbound' else 'O',
'Ex' if error_bars_x else '',
'Ey' if error_bars_y else '',
''.join(['S{}-{}'.format(i, x.name()) for (i, x) in enumerate(series.values())]),
filename,
)
print(filename)
series = {
k: (store.get_inbound(v) if direction == 'inbound' else store.get_outbound(v))
for (k, v) in series.items()
}
cycol = cycle('brgy')
fig = plt.figure()
axes = fig.add_axes([0, 0, 1, 1])
if title is not None:
axes.set_title(title, pad=20.0 if True in [len(x.test.events) > 0 for x in series.values()] else None)
axes.set_xlabel('Time (s)')
axes.set_ylabel('Throughput (Mbps)')
for k, v in series.items():
data = v.interval_means()
axes.errorbar(
data.keys(),
[x / 1e6 for x in data.values()],
xerr=(
[x[0] for x in v.interval_time_ranges().values()],
[x[1] for x in v.interval_time_ranges().values()]) if error_bars_x else None,
yerr=[x * 1.5 / 1e6 for x in v.interval_standard_deviations().values()] if error_bars_y else None,
capsize=3,
ecolor='grey',
color=next(cycol),
label=k,
)
legend = axes.legend()
if start_at_zero:
axes.set_ylim(bottom=0)
axes.set_xlim(left=0)
if fast_tests:
fig.text(0.95, 0.05, 'Draft', fontsize=50, color='gray', ha='right', va='bottom', alpha=0.5)
if filename is not None:
fig.savefig(filename, bbox_extra_artists=(legend,), bbox_inches='tight', pad_inches=0.3)

21
graphs/store.py Normal file
View File

@ -0,0 +1,21 @@
from typing import Dict
from structure import IperfResult, StandardTest
class TestStore:
def __init__(self):
self.inbound: Dict[str, IperfResult] = dict()
self.outbound: Dict[str, IperfResult] = dict()
def save_inbound(self, test: StandardTest, result: IperfResult):
self.inbound[test.name()] = result
def save_outbound(self, test: StandardTest, result: IperfResult):
self.outbound[test.name()] = result
def get_inbound(self, test: StandardTest) -> IperfResult:
return self.inbound[test.name()]
def get_outbound(self, test: StandardTest) -> IperfResult:
return self.outbound[test.name()]

View File

@ -1,928 +0,0 @@
{
"start": {
"connected": [{
"socket": 5,
"local_host": "2.2.2.3",
"local_port": 33206,
"remote_host": "2.2.2.2",
"remote_port": 5201
}],
"version": "iperf 3.6",
"system_info": "Linux Manual-LocalPortal 4.19.0-12-amd64 #1 SMP Debian 4.19.152-1 (2020-10-18) x86_64",
"timestamp": {
"time": "Tue, 03 Nov 2020 20:35:32 GMT",
"timesecs": 1604435732
},
"connecting_to": {
"host": "2.2.2.2",
"port": 5201
},
"cookie": "axalr4267zeh7islurtqh5euv2dodaj24kyf",
"tcp_mss_default": 1448,
"sock_bufsize": 0,
"sndbuf_actual": 16384,
"rcvbuf_actual": 131072,
"test_start": {
"protocol": "TCP",
"num_streams": 1,
"blksize": 131072,
"omit": 5,
"duration": 30,
"bytes": 0,
"blocks": 0,
"reverse": 0,
"tos": 0
}
},
"intervals": [{
"streams": [{
"socket": 5,
"start": 0,
"end": 1.0003411769866943,
"seconds": 1.0003411769866943,
"bytes": 4229608,
"bits_per_second": 33825323.578027688,
"retransmits": 141,
"snd_cwnd": 13032,
"rtt": 9958,
"rttvar": 5796,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 0,
"end": 1.0003411769866943,
"seconds": 1.0003411769866943,
"bytes": 4229608,
"bits_per_second": 33825323.578027688,
"retransmits": 141,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 1.0003411769866943,
"end": 2.0002310276031494,
"seconds": 0.99988985061645508,
"bytes": 2867040,
"bits_per_second": 22938846.699823216,
"retransmits": 197,
"snd_cwnd": 21720,
"rtt": 9344,
"rttvar": 13938,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 1.0003411769866943,
"end": 2.0002310276031494,
"seconds": 0.99988985061645508,
"bytes": 2867040,
"bits_per_second": 22938846.699823216,
"retransmits": 197,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 2.0002310276031494,
"end": 3.0001740455627441,
"seconds": 0.99994301795959473,
"bytes": 2736720,
"bits_per_second": 21895007.622209,
"retransmits": 88,
"snd_cwnd": 15928,
"rtt": 14094,
"rttvar": 11719,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 2.0002310276031494,
"end": 3.0001740455627441,
"seconds": 0.99994301795959473,
"bytes": 2736720,
"bits_per_second": 21895007.622209,
"retransmits": 88,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 3.0001740455627441,
"end": 4.0002920627593994,
"seconds": 1.0001180171966553,
"bytes": 2671560,
"bits_per_second": 21369957.977466859,
"retransmits": 92,
"snd_cwnd": 40544,
"rtt": 22721,
"rttvar": 10547,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 3.0001740455627441,
"end": 4.0002920627593994,
"seconds": 1.0001180171966553,
"bytes": 2671560,
"bits_per_second": 21369957.977466859,
"retransmits": 92,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 4.0002920627593994,
"end": 5.0001270771026611,
"seconds": 0.99983501434326172,
"bytes": 3388320,
"bits_per_second": 27111032.931573071,
"retransmits": 109,
"snd_cwnd": 40544,
"rtt": 11201,
"rttvar": 3720,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 4.0002920627593994,
"end": 5.0001270771026611,
"seconds": 0.99983501434326172,
"bytes": 3388320,
"bits_per_second": 27111032.931573071,
"retransmits": 109,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 3.5047531127929688e-05,
"end": 1.0000720024108887,
"seconds": 1.0001070499420166,
"bytes": 2606400,
"bits_per_second": 20848968.119171735,
"retransmits": 133,
"snd_cwnd": 39096,
"rtt": 18019,
"rttvar": 2579,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 3.5047531127929688e-05,
"end": 1.0000720024108887,
"seconds": 1.0001070499420166,
"bytes": 2606400,
"bits_per_second": 20848968.119171735,
"retransmits": 133,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 1.0000720024108887,
"end": 2.0003430843353271,
"seconds": 1.0002710819244385,
"bytes": 2867040,
"bits_per_second": 22930104.063262954,
"retransmits": 95,
"snd_cwnd": 4344,
"rtt": 9610,
"rttvar": 4548,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 1.0000720024108887,
"end": 2.0003430843353271,
"seconds": 1.0002710819244385,
"bytes": 2867040,
"bits_per_second": 22930104.063262954,
"retransmits": 95,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 2.0003430843353271,
"end": 3.0001189708709717,
"seconds": 0.99977588653564453,
"bytes": 3192840,
"bits_per_second": 25548445.750686083,
"retransmits": 107,
"snd_cwnd": 31856,
"rtt": 14704,
"rttvar": 11251,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 2.0003430843353271,
"end": 3.0001189708709717,
"seconds": 0.99977588653564453,
"bytes": 3192840,
"bits_per_second": 25548445.750686083,
"retransmits": 107,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 3.0001189708709717,
"end": 4.0001530647277832,
"seconds": 1.0000340938568115,
"bytes": 2736720,
"bits_per_second": 21893013.582729738,
"retransmits": 108,
"snd_cwnd": 24616,
"rtt": 10218,
"rttvar": 6107,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 3.0001189708709717,
"end": 4.0001530647277832,
"seconds": 1.0000340938568115,
"bytes": 2736720,
"bits_per_second": 21893013.582729738,
"retransmits": 108,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 4.0001530647277832,
"end": 5.000140905380249,
"seconds": 0.99998784065246582,
"bytes": 2736720,
"bits_per_second": 21894026.217073698,
"retransmits": 117,
"snd_cwnd": 8688,
"rtt": 1468,
"rttvar": 1844,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 4.0001530647277832,
"end": 5.000140905380249,
"seconds": 0.99998784065246582,
"bytes": 2736720,
"bits_per_second": 21894026.217073698,
"retransmits": 117,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 5.000140905380249,
"end": 6.0001630783081055,
"seconds": 1.0000221729278564,
"bytes": 2736720,
"bits_per_second": 21893274.562002596,
"retransmits": 111,
"snd_cwnd": 17376,
"rtt": 772,
"rttvar": 138,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 5.000140905380249,
"end": 6.0001630783081055,
"seconds": 1.0000221729278564,
"bytes": 2736720,
"bits_per_second": 21893274.562002596,
"retransmits": 111,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 6.0001630783081055,
"end": 7.0002310276031494,
"seconds": 1.0000679492950439,
"bytes": 2736720,
"bits_per_second": 21892272.435521096,
"retransmits": 92,
"snd_cwnd": 11584,
"rtt": 10739,
"rttvar": 6756,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 6.0001630783081055,
"end": 7.0002310276031494,
"seconds": 1.0000679492950439,
"bytes": 2736720,
"bits_per_second": 21892272.435521096,
"retransmits": 92,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 7.0002310276031494,
"end": 8.0000350475311279,
"seconds": 0.99980401992797852,
"bytes": 2736720,
"bits_per_second": 21898051.581726115,
"retransmits": 75,
"snd_cwnd": 52128,
"rtt": 15688,
"rttvar": 4171,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 7.0002310276031494,
"end": 8.0000350475311279,
"seconds": 0.99980401992797852,
"bytes": 2736720,
"bits_per_second": 21898051.581726115,
"retransmits": 75,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 8.0000350475311279,
"end": 9.0002028942108154,
"seconds": 1.0001678466796875,
"bytes": 2736720,
"bits_per_second": 21890085.82177674,
"retransmits": 158,
"snd_cwnd": 34752,
"rtt": 7382,
"rttvar": 6454,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 8.0000350475311279,
"end": 9.0002028942108154,
"seconds": 1.0001678466796875,
"bytes": 2736720,
"bits_per_second": 21890085.82177674,
"retransmits": 158,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 9.0002028942108154,
"end": 10.00016188621521,
"seconds": 0.99995899200439453,
"bytes": 2736720,
"bits_per_second": 21894657.856033143,
"retransmits": 82,
"snd_cwnd": 14480,
"rtt": 11687,
"rttvar": 4174,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 9.0002028942108154,
"end": 10.00016188621521,
"seconds": 0.99995899200439453,
"bytes": 2736720,
"bits_per_second": 21894657.856033143,
"retransmits": 82,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 10.00016188621521,
"end": 11.00008487701416,
"seconds": 0.9999229907989502,
"bytes": 2280600,
"bits_per_second": 18246205.125678919,
"retransmits": 103,
"snd_cwnd": 14480,
"rtt": 8499,
"rttvar": 12658,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 10.00016188621521,
"end": 11.00008487701416,
"seconds": 0.9999229907989502,
"bytes": 2280600,
"bits_per_second": 18246205.125678919,
"retransmits": 103,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 11.00008487701416,
"end": 12.000163078308105,
"seconds": 1.0000782012939453,
"bytes": 3192840,
"bits_per_second": 25540722.682437934,
"retransmits": 181,
"snd_cwnd": 36200,
"rtt": 10647,
"rttvar": 14692,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 11.00008487701416,
"end": 12.000163078308105,
"seconds": 1.0000782012939453,
"bytes": 3192840,
"bits_per_second": 25540722.682437934,
"retransmits": 181,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 12.000163078308105,
"end": 13.000297069549561,
"seconds": 1.0001339912414551,
"bytes": 2280600,
"bits_per_second": 18242355.684114821,
"retransmits": 147,
"snd_cwnd": 27512,
"rtt": 22539,
"rttvar": 10121,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 12.000163078308105,
"end": 13.000297069549561,
"seconds": 1.0001339912414551,
"bytes": 2280600,
"bits_per_second": 18242355.684114821,
"retransmits": 147,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 13.000297069549561,
"end": 14.000071048736572,
"seconds": 0.99977397918701172,
"bytes": 3258000,
"bits_per_second": 26069892.338260811,
"retransmits": 155,
"snd_cwnd": 21720,
"rtt": 1443,
"rttvar": 185,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 13.000297069549561,
"end": 14.000071048736572,
"seconds": 0.99977397918701172,
"bytes": 3258000,
"bits_per_second": 26069892.338260811,
"retransmits": 155,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 14.000071048736572,
"end": 15.000072002410889,
"seconds": 1.0000009536743164,
"bytes": 2736720,
"bits_per_second": 21893739.12050331,
"retransmits": 87,
"snd_cwnd": 55024,
"rtt": 17620,
"rttvar": 8980,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 14.000071048736572,
"end": 15.000072002410889,
"seconds": 1.0000009536743164,
"bytes": 2736720,
"bits_per_second": 21893739.12050331,
"retransmits": 87,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 15.000072002410889,
"end": 16.000117063522339,
"seconds": 1.0000450611114502,
"bytes": 2736720,
"bits_per_second": 21892773.487293936,
"retransmits": 157,
"snd_cwnd": 27512,
"rtt": 7473,
"rttvar": 7514,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 15.000072002410889,
"end": 16.000117063522339,
"seconds": 1.0000450611114502,
"bytes": 2736720,
"bits_per_second": 21892773.487293936,
"retransmits": 157,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 16.000117063522339,
"end": 17.000438928604126,
"seconds": 1.0003218650817871,
"bytes": 1824480,
"bits_per_second": 14591143.620365264,
"retransmits": 144,
"snd_cwnd": 1448,
"rtt": 10071,
"rttvar": 4812,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 16.000117063522339,
"end": 17.000438928604126,
"seconds": 1.0003218650817871,
"bytes": 1824480,
"bits_per_second": 14591143.620365264,
"retransmits": 144,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 17.000438928604126,
"end": 18.000046014785767,
"seconds": 0.99960708618164062,
"bytes": 3648960,
"bits_per_second": 29203154.322873138,
"retransmits": 79,
"snd_cwnd": 15928,
"rtt": 6663,
"rttvar": 7363,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 17.000438928604126,
"end": 18.000046014785767,
"seconds": 0.99960708618164062,
"bytes": 3648960,
"bits_per_second": 29203154.322873138,
"retransmits": 79,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 18.000046014785767,
"end": 19.000181913375854,
"seconds": 1.0001358985900879,
"bytes": 2280600,
"bits_per_second": 18242320.894310534,
"retransmits": 84,
"snd_cwnd": 8688,
"rtt": 10117,
"rttvar": 12215,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 18.000046014785767,
"end": 19.000181913375854,
"seconds": 1.0001358985900879,
"bytes": 2280600,
"bits_per_second": 18242320.894310534,
"retransmits": 84,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 19.000181913375854,
"end": 20.000272989273071,
"seconds": 1.0000910758972168,
"bytes": 2736720,
"bits_per_second": 21891766.187752791,
"retransmits": 61,
"snd_cwnd": 31856,
"rtt": 27407,
"rttvar": 8084,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 19.000181913375854,
"end": 20.000272989273071,
"seconds": 1.0000910758972168,
"bytes": 2736720,
"bits_per_second": 21891766.187752791,
"retransmits": 61,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 20.000272989273071,
"end": 21.000174045562744,
"seconds": 0.99990105628967285,
"bytes": 2736720,
"bits_per_second": 21895926.464205418,
"retransmits": 167,
"snd_cwnd": 23168,
"rtt": 15721,
"rttvar": 4637,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 20.000272989273071,
"end": 21.000174045562744,
"seconds": 0.99990105628967285,
"bytes": 2736720,
"bits_per_second": 21895926.464205418,
"retransmits": 167,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 21.000174045562744,
"end": 22.000287055969238,
"seconds": 1.0001130104064941,
"bytes": 3518640,
"bits_per_second": 28145939.215968043,
"retransmits": 157,
"snd_cwnd": 41992,
"rtt": 20718,
"rttvar": 6776,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 21.000174045562744,
"end": 22.000287055969238,
"seconds": 1.0001130104064941,
"bytes": 3518640,
"bits_per_second": 28145939.215968043,
"retransmits": 157,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 22.000287055969238,
"end": 23.000086069107056,
"seconds": 0.99979901313781738,
"bytes": 3648960,
"bits_per_second": 29197548.32362099,
"retransmits": 117,
"snd_cwnd": 27512,
"rtt": 14186,
"rttvar": 1897,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 22.000287055969238,
"end": 23.000086069107056,
"seconds": 0.99979901313781738,
"bytes": 3648960,
"bits_per_second": 29197548.32362099,
"retransmits": 117,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 23.000086069107056,
"end": 24.000319004058838,
"seconds": 1.0002329349517822,
"bytes": 1824480,
"bits_per_second": 14592440.910480132,
"retransmits": 66,
"snd_cwnd": 23168,
"rtt": 2717,
"rttvar": 4139,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 23.000086069107056,
"end": 24.000319004058838,
"seconds": 1.0002329349517822,
"bytes": 1824480,
"bits_per_second": 14592440.910480132,
"retransmits": 66,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 24.000319004058838,
"end": 25.000109910964966,
"seconds": 0.99979090690612793,
"bytes": 3648960,
"bits_per_second": 29197785.055211406,
"retransmits": 165,
"snd_cwnd": 10136,
"rtt": 7919,
"rttvar": 7074,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 24.000319004058838,
"end": 25.000109910964966,
"seconds": 0.99979090690612793,
"bytes": 3648960,
"bits_per_second": 29197785.055211406,
"retransmits": 165,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 25.000109910964966,
"end": 26.000142097473145,
"seconds": 1.0000321865081787,
"bytes": 2736720,
"bits_per_second": 21893055.338995274,
"retransmits": 96,
"snd_cwnd": 20272,
"rtt": 8375,
"rttvar": 6912,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 25.000109910964966,
"end": 26.000142097473145,
"seconds": 1.0000321865081787,
"bytes": 2736720,
"bits_per_second": 21893055.338995274,
"retransmits": 96,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 26.000142097473145,
"end": 27.000432014465332,
"seconds": 1.0002899169921875,
"bytes": 1824480,
"bits_per_second": 14591609.644420715,
"retransmits": 103,
"snd_cwnd": 33304,
"rtt": 16162,
"rttvar": 1970,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 26.000142097473145,
"end": 27.000432014465332,
"seconds": 1.0002899169921875,
"bytes": 1824480,
"bits_per_second": 14591609.644420715,
"retransmits": 103,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 27.000432014465332,
"end": 28.000056982040405,
"seconds": 0.99962496757507324,
"bytes": 3648960,
"bits_per_second": 29202631.9338684,
"retransmits": 105,
"snd_cwnd": 34752,
"rtt": 4937,
"rttvar": 3315,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 27.000432014465332,
"end": 28.000056982040405,
"seconds": 0.99962496757507324,
"bytes": 3648960,
"bits_per_second": 29202631.9338684,
"retransmits": 105,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 28.000056982040405,
"end": 29.000309944152832,
"seconds": 1.0002529621124268,
"bytes": 1824480,
"bits_per_second": 14592148.73923008,
"retransmits": 105,
"snd_cwnd": 14480,
"rtt": 14421,
"rttvar": 9939,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 28.000056982040405,
"end": 29.000309944152832,
"seconds": 1.0002529621124268,
"bytes": 1824480,
"bits_per_second": 14592148.73923008,
"retransmits": 105,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 29.000309944152832,
"end": 30.000411033630371,
"seconds": 1.0001010894775391,
"bytes": 2736720,
"bits_per_second": 21891546.994951759,
"retransmits": 117,
"snd_cwnd": 24616,
"rtt": 12050,
"rttvar": 4452,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 29.000309944152832,
"end": 30.000411033630371,
"seconds": 1.0001010894775391,
"bytes": 2736720,
"bits_per_second": 21891546.994951759,
"retransmits": 117,
"omitted": false
}
}],
"end": {
"streams": [{
"sender": {
"socket": 5,
"start": 0,
"end": 30.000411033630371,
"seconds": 30.000411033630371,
"bytes": 82948680,
"bits_per_second": 22119344.94017826,
"retransmits": 3474,
"max_snd_cwnd": 55024,
"max_rtt": 27407,
"min_rtt": 772,
"mean_rtt": 11636
},
"receiver": {
"socket": 5,
"start": 0,
"end": 30.04242992401123,
"seconds": 30.000411033630371,
"bytes": 81816344,
"bits_per_second": 21786877.88090238
}
}],
"sum_sent": {
"start": 0,
"end": 30.000411033630371,
"seconds": 30.000411033630371,
"bytes": 82948680,
"bits_per_second": 22119344.94017826,
"retransmits": 3474
},
"sum_received": {
"start": 0,
"end": 30.04242992401123,
"seconds": 30.04242992401123,
"bytes": 81816344,
"bits_per_second": 21786877.88090238
},
"cpu_utilization_percent": {
"host_total": 0.22279627348816114,
"host_user": 0.052762963625616423,
"host_system": 0.17003900965336524,
"remote_total": 1.1676044402542152,
"remote_user": 0.11287335188105996,
"remote_system": 1.0547325937726919
},
"sender_tcp_congestion": "cubic",
"receiver_tcp_congestion": "cubic"
}
}

View File

@ -1,928 +0,0 @@
{
"start": {
"connected": [{
"socket": 5,
"local_host": "1.1.1.4",
"local_port": 59214,
"remote_host": "1.1.1.2",
"remote_port": 5201
}],
"version": "iperf 3.6",
"system_info": "Linux Manual-LocalPortal 4.19.0-12-amd64 #1 SMP Debian 4.19.152-1 (2020-10-18) x86_64",
"timestamp": {
"time": "Tue, 03 Nov 2020 20:38:57 GMT",
"timesecs": 1604435937
},
"connecting_to": {
"host": "1.1.1.2",
"port": 5201
},
"cookie": "hm3mg6k2chfebwyrik2x23h3zd2ruewombei",
"tcp_mss_default": 1448,
"sock_bufsize": 0,
"sndbuf_actual": 16384,
"rcvbuf_actual": 131072,
"test_start": {
"protocol": "TCP",
"num_streams": 1,
"blksize": 131072,
"omit": 5,
"duration": 30,
"bytes": 0,
"blocks": 0,
"reverse": 0,
"tos": 0
}
},
"intervals": [{
"streams": [{
"socket": 5,
"start": 0,
"end": 1.0002508163452148,
"seconds": 1.0002508163452148,
"bytes": 2247296,
"bits_per_second": 17973859.862159967,
"retransmits": 179,
"snd_cwnd": 2896,
"rtt": 451,
"rttvar": 344,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 0,
"end": 1.0002508163452148,
"seconds": 1.0002508163452148,
"bytes": 2247296,
"bits_per_second": 17973859.862159967,
"retransmits": 179,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 1.0002508163452148,
"end": 2.0003719329833984,
"seconds": 1.0001211166381836,
"bytes": 977400,
"bits_per_second": 7818253.079470546,
"retransmits": 109,
"snd_cwnd": 2896,
"rtt": 467,
"rttvar": 308,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 1.0002508163452148,
"end": 2.0003719329833984,
"seconds": 1.0001211166381836,
"bytes": 977400,
"bits_per_second": 7818253.079470546,
"retransmits": 109,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 2.0003719329833984,
"end": 3.0002238750457764,
"seconds": 0.99985194206237793,
"bytes": 1172880,
"bits_per_second": 9384429.4392685387,
"retransmits": 114,
"snd_cwnd": 7240,
"rtt": 379,
"rttvar": 348,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 2.0003719329833984,
"end": 3.0002238750457764,
"seconds": 0.99985194206237793,
"bytes": 1172880,
"bits_per_second": 9384429.4392685387,
"retransmits": 114,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 3.0002238750457764,
"end": 4.0003209114074707,
"seconds": 1.0000970363616943,
"bytes": 977400,
"bits_per_second": 7818441.3268995173,
"retransmits": 122,
"snd_cwnd": 2896,
"rtt": 830,
"rttvar": 432,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 3.0002238750457764,
"end": 4.0003209114074707,
"seconds": 1.0000970363616943,
"bytes": 977400,
"bits_per_second": 7818441.3268995173,
"retransmits": 122,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 4.0003209114074707,
"end": 5.0001609325408936,
"seconds": 0.99984002113342285,
"bytes": 1172880,
"bits_per_second": 9384541.3282850459,
"retransmits": 103,
"snd_cwnd": 14480,
"rtt": 474,
"rttvar": 94,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 4.0003209114074707,
"end": 5.0001609325408936,
"seconds": 0.99984002113342285,
"bytes": 1172880,
"bits_per_second": 9384541.3282850459,
"retransmits": 103,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 2.5033950805664062e-05,
"end": 1.0002329349517822,
"seconds": 1.0002579689025879,
"bytes": 977400,
"bits_per_second": 7817183.4097744524,
"retransmits": 122,
"snd_cwnd": 8688,
"rtt": 350,
"rttvar": 379,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 2.5033950805664062e-05,
"end": 1.0002329349517822,
"seconds": 1.0002579689025879,
"bytes": 977400,
"bits_per_second": 7817183.4097744524,
"retransmits": 122,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 1.0002329349517822,
"end": 2.0001299381256104,
"seconds": 0.99989700317382812,
"bytes": 1172880,
"bits_per_second": 9384006.5228886344,
"retransmits": 92,
"snd_cwnd": 5792,
"rtt": 356,
"rttvar": 56,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 1.0002329349517822,
"end": 2.0001299381256104,
"seconds": 0.99989700317382812,
"bytes": 1172880,
"bits_per_second": 9384006.5228886344,
"retransmits": 92,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 2.0001299381256104,
"end": 3.0001978874206543,
"seconds": 1.0000679492950439,
"bytes": 977400,
"bits_per_second": 7818668.72697182,
"retransmits": 130,
"snd_cwnd": 2896,
"rtt": 1545,
"rttvar": 2556,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 2.0001299381256104,
"end": 3.0001978874206543,
"seconds": 1.0000679492950439,
"bytes": 977400,
"bits_per_second": 7818668.72697182,
"retransmits": 130,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 3.0001978874206543,
"end": 4.0001950263977051,
"seconds": 0.99999713897705078,
"bytes": 977400,
"bits_per_second": 7819222.3709746487,
"retransmits": 114,
"snd_cwnd": 7240,
"rtt": 470,
"rttvar": 431,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 3.0001978874206543,
"end": 4.0001950263977051,
"seconds": 0.99999713897705078,
"bytes": 977400,
"bits_per_second": 7819222.3709746487,
"retransmits": 114,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 4.0001950263977051,
"end": 5.0001418590545654,
"seconds": 0.99994683265686035,
"bytes": 1172880,
"bits_per_second": 9383538.8978324458,
"retransmits": 261,
"snd_cwnd": 7240,
"rtt": 291,
"rttvar": 233,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 4.0001950263977051,
"end": 5.0001418590545654,
"seconds": 0.99994683265686035,
"bytes": 1172880,
"bits_per_second": 9383538.8978324458,
"retransmits": 261,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 5.0001418590545654,
"end": 6.0001709461212158,
"seconds": 1.0000290870666504,
"bytes": 977400,
"bits_per_second": 7818972.569023747,
"retransmits": 286,
"snd_cwnd": 7240,
"rtt": 386,
"rttvar": 249,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 5.0001418590545654,
"end": 6.0001709461212158,
"seconds": 1.0000290870666504,
"bytes": 977400,
"bits_per_second": 7818972.569023747,
"retransmits": 286,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 6.0001709461212158,
"end": 7.00025486946106,
"seconds": 1.0000839233398438,
"bytes": 1042560,
"bits_per_second": 8339780.09780063,
"retransmits": 196,
"snd_cwnd": 5792,
"rtt": 409,
"rttvar": 108,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 6.0001709461212158,
"end": 7.00025486946106,
"seconds": 1.0000839233398438,
"bytes": 1042560,
"bits_per_second": 8339780.09780063,
"retransmits": 196,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 7.00025486946106,
"end": 8.0001049041748047,
"seconds": 0.99985003471374512,
"bytes": 1042560,
"bits_per_second": 8341730.9700727882,
"retransmits": 172,
"snd_cwnd": 8688,
"rtt": 368,
"rttvar": 380,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 7.00025486946106,
"end": 8.0001049041748047,
"seconds": 0.99985003471374512,
"bytes": 1042560,
"bits_per_second": 8341730.9700727882,
"retransmits": 172,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 8.0001049041748047,
"end": 9.0001709461212158,
"seconds": 1.0000660419464111,
"bytes": 1042560,
"bits_per_second": 8339929.2148417206,
"retransmits": 97,
"snd_cwnd": 7240,
"rtt": 334,
"rttvar": 402,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 8.0001049041748047,
"end": 9.0001709461212158,
"seconds": 1.0000660419464111,
"bytes": 1042560,
"bits_per_second": 8339929.2148417206,
"retransmits": 97,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 9.0001709461212158,
"end": 10.00022292137146,
"seconds": 1.0000519752502441,
"bytes": 977400,
"bits_per_second": 7818793.6162451888,
"retransmits": 113,
"snd_cwnd": 2896,
"rtt": 487,
"rttvar": 356,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 9.0001709461212158,
"end": 10.00022292137146,
"seconds": 1.0000519752502441,
"bytes": 977400,
"bits_per_second": 7818793.6162451888,
"retransmits": 113,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 10.00022292137146,
"end": 11.0001540184021,
"seconds": 0.99993109703063965,
"bytes": 1042560,
"bits_per_second": 8341054.7234380422,
"retransmits": 105,
"snd_cwnd": 4344,
"rtt": 353,
"rttvar": 56,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 10.00022292137146,
"end": 11.0001540184021,
"seconds": 0.99993109703063965,
"bytes": 1042560,
"bits_per_second": 8341054.7234380422,
"retransmits": 105,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 11.0001540184021,
"end": 12.000258922576904,
"seconds": 1.0001049041748047,
"bytes": 977400,
"bits_per_second": 7818379.8193167448,
"retransmits": 104,
"snd_cwnd": 7240,
"rtt": 342,
"rttvar": 132,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 11.0001540184021,
"end": 12.000258922576904,
"seconds": 1.0001049041748047,
"bytes": 977400,
"bits_per_second": 7818379.8193167448,
"retransmits": 104,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 12.000258922576904,
"end": 13.000133037567139,
"seconds": 0.99987411499023438,
"bytes": 1238040,
"bits_per_second": 9905566.9623937942,
"retransmits": 124,
"snd_cwnd": 5792,
"rtt": 385,
"rttvar": 401,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 12.000258922576904,
"end": 13.000133037567139,
"seconds": 0.99987411499023438,
"bytes": 1238040,
"bits_per_second": 9905566.9623937942,
"retransmits": 124,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 13.000133037567139,
"end": 14.000139951705933,
"seconds": 1.0000069141387939,
"bytes": 1042560,
"bits_per_second": 8340422.3331623888,
"retransmits": 191,
"snd_cwnd": 7240,
"rtt": 452,
"rttvar": 173,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 13.000133037567139,
"end": 14.000139951705933,
"seconds": 1.0000069141387939,
"bytes": 1042560,
"bits_per_second": 8340422.3331623888,
"retransmits": 191,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 14.000139951705933,
"end": 15.0002920627594,
"seconds": 1.0001521110534668,
"bytes": 847080,
"bits_per_second": 6775609.3549231431,
"retransmits": 122,
"snd_cwnd": 10136,
"rtt": 452,
"rttvar": 442,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 14.000139951705933,
"end": 15.0002920627594,
"seconds": 1.0001521110534668,
"bytes": 847080,
"bits_per_second": 6775609.3549231431,
"retransmits": 122,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 15.0002920627594,
"end": 16.000130891799927,
"seconds": 0.99983882904052734,
"bytes": 1238040,
"bits_per_second": 9905916.5460741874,
"retransmits": 130,
"snd_cwnd": 10136,
"rtt": 433,
"rttvar": 305,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 15.0002920627594,
"end": 16.000130891799927,
"seconds": 0.99983882904052734,
"bytes": 1238040,
"bits_per_second": 9905916.5460741874,
"retransmits": 130,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 16.000130891799927,
"end": 17.000232934951782,
"seconds": 1.0001020431518555,
"bytes": 912240,
"bits_per_second": 7297175.3732252736,
"retransmits": 100,
"snd_cwnd": 7240,
"rtt": 447,
"rttvar": 308,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 16.000130891799927,
"end": 17.000232934951782,
"seconds": 1.0001020431518555,
"bytes": 912240,
"bits_per_second": 7297175.3732252736,
"retransmits": 100,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 17.000232934951782,
"end": 18.000098943710327,
"seconds": 0.99986600875854492,
"bytes": 1172880,
"bits_per_second": 9384297.41366064,
"retransmits": 131,
"snd_cwnd": 2896,
"rtt": 563,
"rttvar": 370,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 17.000232934951782,
"end": 18.000098943710327,
"seconds": 0.99986600875854492,
"bytes": 1172880,
"bits_per_second": 9384297.41366064,
"retransmits": 131,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 18.000098943710327,
"end": 19.000200986862183,
"seconds": 1.0001020431518555,
"bytes": 912240,
"bits_per_second": 7297175.3732252736,
"retransmits": 85,
"snd_cwnd": 7240,
"rtt": 385,
"rttvar": 233,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 18.000098943710327,
"end": 19.000200986862183,
"seconds": 1.0001020431518555,
"bytes": 912240,
"bits_per_second": 7297175.3732252736,
"retransmits": 85,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 19.000200986862183,
"end": 20.000109910964966,
"seconds": 0.9999089241027832,
"bytes": 1107720,
"bits_per_second": 8862567.16625631,
"retransmits": 128,
"snd_cwnd": 8688,
"rtt": 459,
"rttvar": 321,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 19.000200986862183,
"end": 20.000109910964966,
"seconds": 0.9999089241027832,
"bytes": 1107720,
"bits_per_second": 8862567.16625631,
"retransmits": 128,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 20.000109910964966,
"end": 21.000221967697144,
"seconds": 1.0001120567321777,
"bytes": 1042560,
"bits_per_second": 8339545.4977836711,
"retransmits": 77,
"snd_cwnd": 7240,
"rtt": 409,
"rttvar": 326,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 20.000109910964966,
"end": 21.000221967697144,
"seconds": 1.0001120567321777,
"bytes": 1042560,
"bits_per_second": 8339545.4977836711,
"retransmits": 77,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 21.000221967697144,
"end": 22.000252962112427,
"seconds": 1.0000309944152832,
"bytes": 977400,
"bits_per_second": 7818957.6559793288,
"retransmits": 104,
"snd_cwnd": 17376,
"rtt": 1420,
"rttvar": 1977,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 21.000221967697144,
"end": 22.000252962112427,
"seconds": 1.0000309944152832,
"bytes": 977400,
"bits_per_second": 7818957.6559793288,
"retransmits": 104,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 22.000252962112427,
"end": 23.000123023986816,
"seconds": 0.99987006187438965,
"bytes": 1107720,
"bits_per_second": 8862911.6301246677,
"retransmits": 143,
"snd_cwnd": 8688,
"rtt": 305,
"rttvar": 370,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 22.000252962112427,
"end": 23.000123023986816,
"seconds": 0.99987006187438965,
"bytes": 1107720,
"bits_per_second": 8862911.6301246677,
"retransmits": 143,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 23.000123023986816,
"end": 24.000200986862183,
"seconds": 1.0000779628753662,
"bytes": 1042560,
"bits_per_second": 8339829.8028885024,
"retransmits": 106,
"snd_cwnd": 4344,
"rtt": 370,
"rttvar": 172,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 23.000123023986816,
"end": 24.000200986862183,
"seconds": 1.0000779628753662,
"bytes": 1042560,
"bits_per_second": 8339829.8028885024,
"retransmits": 106,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 24.000200986862183,
"end": 25.000136852264404,
"seconds": 0.99993586540222168,
"bytes": 977400,
"bits_per_second": 7819701.51341131,
"retransmits": 105,
"snd_cwnd": 4344,
"rtt": 449,
"rttvar": 208,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 24.000200986862183,
"end": 25.000136852264404,
"seconds": 0.99993586540222168,
"bytes": 977400,
"bits_per_second": 7819701.51341131,
"retransmits": 105,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 25.000136852264404,
"end": 26.000211000442505,
"seconds": 1.0000741481781006,
"bytes": 977400,
"bits_per_second": 7818620.2635521973,
"retransmits": 114,
"snd_cwnd": 8688,
"rtt": 330,
"rttvar": 339,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 25.000136852264404,
"end": 26.000211000442505,
"seconds": 1.0000741481781006,
"bytes": 977400,
"bits_per_second": 7818620.2635521973,
"retransmits": 114,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 26.000211000442505,
"end": 27.000269889831543,
"seconds": 1.0000588893890381,
"bytes": 1107720,
"bits_per_second": 8861238.1670982186,
"retransmits": 109,
"snd_cwnd": 2896,
"rtt": 393,
"rttvar": 249,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 26.000211000442505,
"end": 27.000269889831543,
"seconds": 1.0000588893890381,
"bytes": 1107720,
"bits_per_second": 8861238.1670982186,
"retransmits": 109,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 27.000269889831543,
"end": 28.000152826309204,
"seconds": 0.99988293647766113,
"bytes": 977400,
"bits_per_second": 7820115.4502597041,
"retransmits": 130,
"snd_cwnd": 2896,
"rtt": 340,
"rttvar": 272,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 27.000269889831543,
"end": 28.000152826309204,
"seconds": 0.99988293647766113,
"bytes": 977400,
"bits_per_second": 7820115.4502597041,
"retransmits": 130,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 28.000152826309204,
"end": 29.0002498626709,
"seconds": 1.0000970363616943,
"bytes": 1042560,
"bits_per_second": 8339670.748692818,
"retransmits": 84,
"snd_cwnd": 7240,
"rtt": 319,
"rttvar": 269,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 28.000152826309204,
"end": 29.0002498626709,
"seconds": 1.0000970363616943,
"bytes": 1042560,
"bits_per_second": 8339670.748692818,
"retransmits": 84,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 29.0002498626709,
"end": 30.00000786781311,
"seconds": 0.99975800514221191,
"bytes": 1172880,
"bits_per_second": 9385311.1970484275,
"retransmits": 135,
"snd_cwnd": 8688,
"rtt": 274,
"rttvar": 379,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 29.0002498626709,
"end": 30.00000786781311,
"seconds": 0.99975800514221191,
"bytes": 1172880,
"bits_per_second": 9385311.1970484275,
"retransmits": 135,
"omitted": false
}
}],
"end": {
"streams": [{
"sender": {
"socket": 5,
"start": 0,
"end": 30.00000786781311,
"seconds": 30.00000786781311,
"bytes": 31276800,
"bits_per_second": 8340477.812622644,
"retransmits": 3910,
"max_snd_cwnd": 17376,
"max_rtt": 1545,
"min_rtt": 274,
"mean_rtt": 470
},
"receiver": {
"socket": 5,
"start": 0,
"end": 30.041186094284058,
"seconds": 30.00000786781311,
"bytes": 31341960,
"bits_per_second": 8346397.4828779325
}
}],
"sum_sent": {
"start": 0,
"end": 30.00000786781311,
"seconds": 30.00000786781311,
"bytes": 31276800,
"bits_per_second": 8340477.812622644,
"retransmits": 3910
},
"sum_received": {
"start": 0,
"end": 30.041186094284058,
"seconds": 30.041186094284058,
"bytes": 31341960,
"bits_per_second": 8346397.4828779325
},
"cpu_utilization_percent": {
"host_total": 0.17899055789323651,
"host_user": 0.074994085376974162,
"host_system": 0.10399362243890981,
"remote_total": 0.23904420886207059,
"remote_user": 0.036474564515223573,
"remote_system": 0.202569644346847
},
"sender_tcp_congestion": "cubic",
"receiver_tcp_congestion": "cubic"
}
}

View File

@ -1,928 +0,0 @@
{
"start": {
"connected": [{
"socket": 5,
"local_host": "1.1.1.4",
"local_port": 59210,
"remote_host": "1.1.1.2",
"remote_port": 5201
}],
"version": "iperf 3.6",
"system_info": "Linux Manual-LocalPortal 4.19.0-12-amd64 #1 SMP Debian 4.19.152-1 (2020-10-18) x86_64",
"timestamp": {
"time": "Tue, 03 Nov 2020 20:37:56 GMT",
"timesecs": 1604435876
},
"connecting_to": {
"host": "1.1.1.2",
"port": 5201
},
"cookie": "yrcvyf36b3ldevlrj5docqhcjim3j2u5e24i",
"tcp_mss_default": 1448,
"sock_bufsize": 0,
"sndbuf_actual": 16384,
"rcvbuf_actual": 131072,
"test_start": {
"protocol": "TCP",
"num_streams": 1,
"blksize": 131072,
"omit": 5,
"duration": 30,
"bytes": 0,
"blocks": 0,
"reverse": 0,
"tos": 0
}
},
"intervals": [{
"streams": [{
"socket": 5,
"start": 0,
"end": 1.0001020431518555,
"seconds": 1.0001020431518555,
"bytes": 3530224,
"bits_per_second": 28238910.412576538,
"retransmits": 314,
"snd_cwnd": 1448,
"rtt": 429,
"rttvar": 131,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 0,
"end": 1.0001020431518555,
"seconds": 1.0001020431518555,
"bytes": 3530224,
"bits_per_second": 28238910.412576538,
"retransmits": 314,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 1.0001020431518555,
"end": 2.0001661777496338,
"seconds": 1.0000641345977783,
"bytes": 1954800,
"bits_per_second": 15637397.101826575,
"retransmits": 237,
"snd_cwnd": 13032,
"rtt": 524,
"rttvar": 422,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 1.0001020431518555,
"end": 2.0001661777496338,
"seconds": 1.0000641345977783,
"bytes": 1954800,
"bits_per_second": 15637397.101826575,
"retransmits": 237,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 2.0001661777496338,
"end": 3.0002710819244385,
"seconds": 1.0001049041748047,
"bytes": 1954800,
"bits_per_second": 15636759.63863349,
"retransmits": 162,
"snd_cwnd": 13032,
"rtt": 493,
"rttvar": 400,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 2.0001661777496338,
"end": 3.0002710819244385,
"seconds": 1.0001049041748047,
"bytes": 1954800,
"bits_per_second": 15636759.63863349,
"retransmits": 162,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 3.0002710819244385,
"end": 4.0001749992370605,
"seconds": 0.99990391731262207,
"bytes": 2150280,
"bits_per_second": 17203892.996272445,
"retransmits": 214,
"snd_cwnd": 2896,
"rtt": 253,
"rttvar": 191,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 3.0002710819244385,
"end": 4.0001749992370605,
"seconds": 0.99990391731262207,
"bytes": 2150280,
"bits_per_second": 17203892.996272445,
"retransmits": 214,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 4.0001749992370605,
"end": 5.00016713142395,
"seconds": 0.99999213218688965,
"bytes": 2150280,
"bits_per_second": 17202375.34507427,
"retransmits": 440,
"snd_cwnd": 11584,
"rtt": 467,
"rttvar": 226,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 4.0001749992370605,
"end": 5.00016713142395,
"seconds": 0.99999213218688965,
"bytes": 2150280,
"bits_per_second": 17202375.34507427,
"retransmits": 440,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 3.1948089599609375e-05,
"end": 1.0002050399780273,
"seconds": 1.000236988067627,
"bytes": 1954800,
"bits_per_second": 15634694.763899965,
"retransmits": 318,
"snd_cwnd": 17376,
"rtt": 442,
"rttvar": 52,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 3.1948089599609375e-05,
"end": 1.0002050399780273,
"seconds": 1.000236988067627,
"bytes": 1954800,
"bits_per_second": 15634694.763899965,
"retransmits": 318,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 1.0002050399780273,
"end": 2.0001249313354492,
"seconds": 0.99991989135742188,
"bytes": 2150280,
"bits_per_second": 17203618.158498108,
"retransmits": 367,
"snd_cwnd": 20272,
"rtt": 395,
"rttvar": 73,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 1.0002050399780273,
"end": 2.0001249313354492,
"seconds": 0.99991989135742188,
"bytes": 2150280,
"bits_per_second": 17203618.158498108,
"retransmits": 367,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 2.0001249313354492,
"end": 3.0002379417419434,
"seconds": 1.0001130104064941,
"bytes": 1954800,
"bits_per_second": 15636632.897760024,
"retransmits": 156,
"snd_cwnd": 11584,
"rtt": 357,
"rttvar": 374,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 2.0001249313354492,
"end": 3.0002379417419434,
"seconds": 1.0001130104064941,
"bytes": 1954800,
"bits_per_second": 15636632.897760024,
"retransmits": 156,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 3.0002379417419434,
"end": 4.0001308917999268,
"seconds": 0.9998929500579834,
"bytes": 2345760,
"bits_per_second": 18768089.122852363,
"retransmits": 191,
"snd_cwnd": 10136,
"rtt": 478,
"rttvar": 396,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 3.0002379417419434,
"end": 4.0001308917999268,
"seconds": 0.9998929500579834,
"bytes": 2345760,
"bits_per_second": 18768089.122852363,
"retransmits": 191,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 4.0001308917999268,
"end": 5.0000970363616943,
"seconds": 0.99996614456176758,
"bytes": 2150280,
"bits_per_second": 17202822.409091495,
"retransmits": 199,
"snd_cwnd": 11584,
"rtt": 576,
"rttvar": 248,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 4.0001308917999268,
"end": 5.0000970363616943,
"seconds": 0.99996614456176758,
"bytes": 2150280,
"bits_per_second": 17202822.409091495,
"retransmits": 199,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 5.0000970363616943,
"end": 6.000108003616333,
"seconds": 1.0000109672546387,
"bytes": 1954800,
"bits_per_second": 15638228.491566036,
"retransmits": 451,
"snd_cwnd": 10136,
"rtt": 337,
"rttvar": 223,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 5.0000970363616943,
"end": 6.000108003616333,
"seconds": 1.0000109672546387,
"bytes": 1954800,
"bits_per_second": 15638228.491566036,
"retransmits": 451,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 6.000108003616333,
"end": 7.0002739429473877,
"seconds": 1.0001659393310547,
"bytes": 1759320,
"bits_per_second": 14072224.864419548,
"retransmits": 372,
"snd_cwnd": 7240,
"rtt": 474,
"rttvar": 159,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 6.000108003616333,
"end": 7.0002739429473877,
"seconds": 1.0001659393310547,
"bytes": 1759320,
"bits_per_second": 14072224.864419548,
"retransmits": 372,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 7.0002739429473877,
"end": 8.0001449584960938,
"seconds": 0.999871015548706,
"bytes": 2150280,
"bits_per_second": 17204459.10771782,
"retransmits": 149,
"snd_cwnd": 7240,
"rtt": 441,
"rttvar": 55,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 7.0002739429473877,
"end": 8.0001449584960938,
"seconds": 0.999871015548706,
"bytes": 2150280,
"bits_per_second": 17204459.10771782,
"retransmits": 149,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 8.0001449584960938,
"end": 9.0002191066741943,
"seconds": 1.0000741481781006,
"bytes": 2019960,
"bits_per_second": 16158481.878007874,
"retransmits": 173,
"snd_cwnd": 2896,
"rtt": 580,
"rttvar": 330,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 8.0001449584960938,
"end": 9.0002191066741943,
"seconds": 1.0000741481781006,
"bytes": 2019960,
"bits_per_second": 16158481.878007874,
"retransmits": 173,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 9.0002191066741943,
"end": 10.000104904174805,
"seconds": 0.99988579750061035,
"bytes": 2345760,
"bits_per_second": 18768223.378018875,
"retransmits": 174,
"snd_cwnd": 4344,
"rtt": 344,
"rttvar": 72,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 9.0002191066741943,
"end": 10.000104904174805,
"seconds": 0.99988579750061035,
"bytes": 2345760,
"bits_per_second": 18768223.378018875,
"retransmits": 174,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 10.000104904174805,
"end": 11.000201940536499,
"seconds": 1.0000970363616943,
"bytes": 1954800,
"bits_per_second": 15636882.653799035,
"retransmits": 163,
"snd_cwnd": 13032,
"rtt": 345,
"rttvar": 271,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 10.000104904174805,
"end": 11.000201940536499,
"seconds": 1.0000970363616943,
"bytes": 1954800,
"bits_per_second": 15636882.653799035,
"retransmits": 163,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 11.000201940536499,
"end": 12.000133037567139,
"seconds": 0.99993109703063965,
"bytes": 2150280,
"bits_per_second": 17203425.367090963,
"retransmits": 165,
"snd_cwnd": 10136,
"rtt": 343,
"rttvar": 312,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 11.000201940536499,
"end": 12.000133037567139,
"seconds": 0.99993109703063965,
"bytes": 2150280,
"bits_per_second": 17203425.367090963,
"retransmits": 165,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 12.000133037567139,
"end": 13.000078916549683,
"seconds": 0.999945878982544,
"bytes": 2150280,
"bits_per_second": 17203171.053120866,
"retransmits": 333,
"snd_cwnd": 2896,
"rtt": 497,
"rttvar": 257,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 12.000133037567139,
"end": 13.000078916549683,
"seconds": 0.999945878982544,
"bytes": 2150280,
"bits_per_second": 17203171.053120866,
"retransmits": 333,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 13.000078916549683,
"end": 14.000128984451294,
"seconds": 1.0000500679016113,
"bytes": 2150280,
"bits_per_second": 17201378.76306051,
"retransmits": 228,
"snd_cwnd": 10136,
"rtt": 458,
"rttvar": 388,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 13.000078916549683,
"end": 14.000128984451294,
"seconds": 1.0000500679016113,
"bytes": 2150280,
"bits_per_second": 17201378.76306051,
"retransmits": 228,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 14.000128984451294,
"end": 15.000159025192261,
"seconds": 1.0000300407409668,
"bytes": 1759320,
"bits_per_second": 14074137.202489968,
"retransmits": 147,
"snd_cwnd": 30408,
"rtt": 487,
"rttvar": 94,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 14.000128984451294,
"end": 15.000159025192261,
"seconds": 1.0000300407409668,
"bytes": 1759320,
"bits_per_second": 14074137.202489968,
"retransmits": 147,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 15.000159025192261,
"end": 16.000128984451294,
"seconds": 0.9999699592590332,
"bytes": 2345760,
"bits_per_second": 18766643.763884127,
"retransmits": 194,
"snd_cwnd": 27512,
"rtt": 486,
"rttvar": 67,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 15.000159025192261,
"end": 16.000128984451294,
"seconds": 0.9999699592590332,
"bytes": 2345760,
"bits_per_second": 18766643.763884127,
"retransmits": 194,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 16.000128984451294,
"end": 17.000190019607544,
"seconds": 1.00006103515625,
"bytes": 1954800,
"bits_per_second": 15637445.566066524,
"retransmits": 201,
"snd_cwnd": 4344,
"rtt": 484,
"rttvar": 452,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 16.000128984451294,
"end": 17.000190019607544,
"seconds": 1.00006103515625,
"bytes": 1954800,
"bits_per_second": 15637445.566066524,
"retransmits": 201,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 17.000190019607544,
"end": 18.000272035598755,
"seconds": 1.0000820159912109,
"bytes": 1954800,
"bits_per_second": 15637117.506308038,
"retransmits": 151,
"snd_cwnd": 7240,
"rtt": 498,
"rttvar": 190,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 17.000190019607544,
"end": 18.000272035598755,
"seconds": 1.0000820159912109,
"bytes": 1954800,
"bits_per_second": 15637117.506308038,
"retransmits": 151,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 18.000272035598755,
"end": 19.000139951705933,
"seconds": 0.99986791610717773,
"bytes": 2215440,
"bits_per_second": 17725861.300764233,
"retransmits": 208,
"snd_cwnd": 11584,
"rtt": 423,
"rttvar": 394,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 18.000272035598755,
"end": 19.000139951705933,
"seconds": 0.99986791610717773,
"bytes": 2215440,
"bits_per_second": 17725861.300764233,
"retransmits": 208,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 19.000139951705933,
"end": 20.000174999237061,
"seconds": 1.0000350475311279,
"bytes": 1954800,
"bits_per_second": 15637851.931897642,
"retransmits": 153,
"snd_cwnd": 7240,
"rtt": 382,
"rttvar": 35,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 19.000139951705933,
"end": 20.000174999237061,
"seconds": 1.0000350475311279,
"bytes": 1954800,
"bits_per_second": 15637851.931897642,
"retransmits": 153,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 20.000174999237061,
"end": 21.000102996826172,
"seconds": 0.99992799758911133,
"bytes": 2345760,
"bits_per_second": 18767431.300299808,
"retransmits": 246,
"snd_cwnd": 21720,
"rtt": 411,
"rttvar": 63,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 20.000174999237061,
"end": 21.000102996826172,
"seconds": 0.99992799758911133,
"bytes": 2345760,
"bits_per_second": 18767431.300299808,
"retransmits": 246,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 21.000102996826172,
"end": 22.00019097328186,
"seconds": 1.0000879764556885,
"bytes": 1954800,
"bits_per_second": 15637024.31002369,
"retransmits": 192,
"snd_cwnd": 4344,
"rtt": 398,
"rttvar": 199,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 21.000102996826172,
"end": 22.00019097328186,
"seconds": 1.0000879764556885,
"bytes": 1954800,
"bits_per_second": 15637024.31002369,
"retransmits": 192,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 22.00019097328186,
"end": 23.00009298324585,
"seconds": 0.99990200996398926,
"bytes": 2345760,
"bits_per_second": 18767919.069065426,
"retransmits": 308,
"snd_cwnd": 11584,
"rtt": 381,
"rttvar": 179,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 22.00019097328186,
"end": 23.00009298324585,
"seconds": 0.99990200996398926,
"bytes": 2345760,
"bits_per_second": 18767919.069065426,
"retransmits": 308,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 23.00009298324585,
"end": 24.000123023986816,
"seconds": 1.0000300407409668,
"bytes": 1954800,
"bits_per_second": 15637930.224988854,
"retransmits": 374,
"snd_cwnd": 14480,
"rtt": 523,
"rttvar": 421,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 23.00009298324585,
"end": 24.000123023986816,
"seconds": 1.0000300407409668,
"bytes": 1954800,
"bits_per_second": 15637930.224988854,
"retransmits": 374,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 24.000123023986816,
"end": 25.000124931335449,
"seconds": 1.0000019073486328,
"bytes": 1954800,
"bits_per_second": 15638370.172176033,
"retransmits": 286,
"snd_cwnd": 18824,
"rtt": 367,
"rttvar": 15,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 24.000123023986816,
"end": 25.000124931335449,
"seconds": 1.0000019073486328,
"bytes": 1954800,
"bits_per_second": 15638370.172176033,
"retransmits": 286,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 25.000124931335449,
"end": 26.000121116638184,
"seconds": 0.99999618530273438,
"bytes": 2150280,
"bits_per_second": 17202305.621588219,
"retransmits": 457,
"snd_cwnd": 10136,
"rtt": 363,
"rttvar": 189,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 25.000124931335449,
"end": 26.000121116638184,
"seconds": 0.99999618530273438,
"bytes": 2150280,
"bits_per_second": 17202305.621588219,
"retransmits": 457,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 26.000121116638184,
"end": 27.000117063522339,
"seconds": 0.99999594688415527,
"bytes": 2215440,
"bits_per_second": 17723591.835770894,
"retransmits": 264,
"snd_cwnd": 30408,
"rtt": 371,
"rttvar": 450,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 26.000121116638184,
"end": 27.000117063522339,
"seconds": 0.99999594688415527,
"bytes": 2215440,
"bits_per_second": 17723591.835770894,
"retransmits": 264,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 27.000117063522339,
"end": 28.000108003616333,
"seconds": 0.99999094009399414,
"bytes": 1954800,
"bits_per_second": 15638541.683717724,
"retransmits": 172,
"snd_cwnd": 7240,
"rtt": 479,
"rttvar": 301,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 27.000117063522339,
"end": 28.000108003616333,
"seconds": 0.99999094009399414,
"bytes": 1954800,
"bits_per_second": 15638541.683717724,
"retransmits": 172,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 28.000108003616333,
"end": 29.000185012817383,
"seconds": 1.0000770092010498,
"bytes": 1954800,
"bits_per_second": 15637195.792045396,
"retransmits": 196,
"snd_cwnd": 5792,
"rtt": 373,
"rttvar": 362,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 28.000108003616333,
"end": 29.000185012817383,
"seconds": 1.0000770092010498,
"bytes": 1954800,
"bits_per_second": 15637195.792045396,
"retransmits": 196,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 29.000185012817383,
"end": 29.999999046325684,
"seconds": 0.99981403350830078,
"bytes": 2150280,
"bits_per_second": 17205439.635247111,
"retransmits": 375,
"snd_cwnd": 11584,
"rtt": 441,
"rttvar": 251,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 29.000185012817383,
"end": 29.999999046325684,
"seconds": 0.99981403350830078,
"bytes": 2150280,
"bits_per_second": 17205439.635247111,
"retransmits": 375,
"omitted": false
}
}],
"end": {
"streams": [{
"sender": {
"socket": 5,
"start": 0,
"end": 29.999999046325684,
"seconds": 29.999999046325684,
"bytes": 62358120,
"bits_per_second": 16628832.52861635,
"retransmits": 7363,
"max_snd_cwnd": 30408,
"max_rtt": 580,
"min_rtt": 253,
"mean_rtt": 431
},
"receiver": {
"socket": 5,
"start": 0,
"end": 30.041683197021484,
"seconds": 29.999999046325684,
"bytes": 62469616,
"bits_per_second": 16635450.308242014
}
}],
"sum_sent": {
"start": 0,
"end": 29.999999046325684,
"seconds": 29.999999046325684,
"bytes": 62358120,
"bits_per_second": 16628832.52861635,
"retransmits": 7363
},
"sum_received": {
"start": 0,
"end": 30.041683197021484,
"seconds": 30.041683197021484,
"bytes": 62469616,
"bits_per_second": 16635450.308242014
},
"cpu_utilization_percent": {
"host_total": 0.22958490575932211,
"host_user": 0.08576907893887456,
"host_system": 0.14381582682044758,
"remote_total": 0.52957749062390125,
"remote_user": 0.11546899534656799,
"remote_system": 0.41411048907840631
},
"sender_tcp_congestion": "cubic",
"receiver_tcp_congestion": "cubic"
}
}

View File

@ -1,928 +0,0 @@
{
"start": {
"connected": [{
"socket": 5,
"local_host": "2.2.2.3",
"local_port": 33210,
"remote_host": "2.2.2.2",
"remote_port": 5201
}],
"version": "iperf 3.6",
"system_info": "Linux Manual-LocalPortal 4.19.0-12-amd64 #1 SMP Debian 4.19.152-1 (2020-10-18) x86_64",
"timestamp": {
"time": "Tue, 03 Nov 2020 20:36:18 GMT",
"timesecs": 1604435778
},
"connecting_to": {
"host": "2.2.2.2",
"port": 5201
},
"cookie": "5xavznyovbrdlw2xpma6ibd5fr5cwbkbrudi",
"tcp_mss_default": 1448,
"sock_bufsize": 0,
"sndbuf_actual": 16384,
"rcvbuf_actual": 131072,
"test_start": {
"protocol": "TCP",
"num_streams": 1,
"blksize": 131072,
"omit": 5,
"duration": 30,
"bytes": 0,
"blocks": 0,
"reverse": 0,
"tos": 0
}
},
"intervals": [{
"streams": [{
"socket": 5,
"start": 0,
"end": 1.0003159046173096,
"seconds": 1.0003159046173096,
"bytes": 3443344,
"bits_per_second": 27538052.602031305,
"retransmits": 233,
"snd_cwnd": 23168,
"rtt": 6923,
"rttvar": 8922,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 0,
"end": 1.0003159046173096,
"seconds": 1.0003159046173096,
"bytes": 3443344,
"bits_per_second": 27538052.602031305,
"retransmits": 233,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 1.0003159046173096,
"end": 2.0000860691070557,
"seconds": 0.99977016448974609,
"bytes": 1889640,
"bits_per_second": 15120595.249724563,
"retransmits": 208,
"snd_cwnd": 14480,
"rtt": 882,
"rttvar": 123,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 1.0003159046173096,
"end": 2.0000860691070557,
"seconds": 0.99977016448974609,
"bytes": 1889640,
"bits_per_second": 15120595.249724563,
"retransmits": 208,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 2.0000860691070557,
"end": 3.0002329349517822,
"seconds": 1.0001468658447266,
"bytes": 1759320,
"bits_per_second": 14072493.231394162,
"retransmits": 86,
"snd_cwnd": 20272,
"rtt": 19760,
"rttvar": 5590,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 2.0000860691070557,
"end": 3.0002329349517822,
"seconds": 1.0001468658447266,
"bytes": 1759320,
"bits_per_second": 14072493.231394162,
"retransmits": 86,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 3.0002329349517822,
"end": 4.0000879764556885,
"seconds": 0.99985504150390625,
"bytes": 2085120,
"bits_per_second": 16683378.397442257,
"retransmits": 78,
"snd_cwnd": 8688,
"rtt": 482,
"rttvar": 85,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 3.0002329349517822,
"end": 4.0000879764556885,
"seconds": 0.99985504150390625,
"bytes": 2085120,
"bits_per_second": 16683378.397442257,
"retransmits": 78,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 4.0000879764556885,
"end": 5.0001790523529053,
"seconds": 1.0000910758972168,
"bytes": 2678800,
"bits_per_second": 21428448.384837385,
"retransmits": 46,
"snd_cwnd": 14480,
"rtt": 14520,
"rttvar": 2837,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 4.0000879764556885,
"end": 5.0001790523529053,
"seconds": 1.0000910758972168,
"bytes": 2678800,
"bits_per_second": 21428448.384837385,
"retransmits": 46,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 4.482269287109375e-05,
"end": 0.99999403953552246,
"seconds": 1.0000388622283936,
"bytes": 1563840,
"bits_per_second": 12510233.824435858,
"retransmits": 97,
"snd_cwnd": 13032,
"rtt": 1307,
"rttvar": 464,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 4.482269287109375e-05,
"end": 0.99999403953552246,
"seconds": 1.0000388622283936,
"bytes": 1563840,
"bits_per_second": 12510233.824435858,
"retransmits": 97,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 0.99999403953552246,
"end": 2.0001680850982666,
"seconds": 1.0001740455627441,
"bytes": 2085120,
"bits_per_second": 16678057.258139027,
"retransmits": 62,
"snd_cwnd": 7240,
"rtt": 730,
"rttvar": 521,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 0.99999403953552246,
"end": 2.0001680850982666,
"seconds": 1.0001740455627441,
"bytes": 2085120,
"bits_per_second": 16678057.258139027,
"retransmits": 62,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 2.0001680850982666,
"end": 3.0000910758972168,
"seconds": 0.9999229907989502,
"bytes": 1563840,
"bits_per_second": 12511683.514751259,
"retransmits": 66,
"snd_cwnd": 13032,
"rtt": 9799,
"rttvar": 14699,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 2.0001680850982666,
"end": 3.0000910758972168,
"seconds": 0.9999229907989502,
"bytes": 1563840,
"bits_per_second": 12511683.514751259,
"retransmits": 66,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 3.0000910758972168,
"end": 4.000028133392334,
"seconds": 0.99993705749511719,
"bytes": 2085120,
"bits_per_second": 16682010.007496351,
"retransmits": 108,
"snd_cwnd": 15928,
"rtt": 14159,
"rttvar": 2544,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 3.0000910758972168,
"end": 4.000028133392334,
"seconds": 0.99993705749511719,
"bytes": 2085120,
"bits_per_second": 16682010.007496351,
"retransmits": 108,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 4.000028133392334,
"end": 5.0001780986785889,
"seconds": 1.0001499652862549,
"bytes": 1563840,
"bits_per_second": 12508844.107612684,
"retransmits": 55,
"snd_cwnd": 15928,
"rtt": 2237,
"rttvar": 2860,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 4.000028133392334,
"end": 5.0001780986785889,
"seconds": 1.0001499652862549,
"bytes": 1563840,
"bits_per_second": 12508844.107612684,
"retransmits": 55,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 5.0001780986785889,
"end": 6.000169038772583,
"seconds": 0.99999094009399414,
"bytes": 2085120,
"bits_per_second": 16681111.129298905,
"retransmits": 46,
"snd_cwnd": 26064,
"rtt": 22030,
"rttvar": 6628,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 5.0001780986785889,
"end": 6.000169038772583,
"seconds": 0.99999094009399414,
"bytes": 2085120,
"bits_per_second": 16681111.129298905,
"retransmits": 46,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 6.000169038772583,
"end": 7.0003340244293213,
"seconds": 1.0001649856567383,
"bytes": 1563840,
"bits_per_second": 12508656.251133494,
"retransmits": 63,
"snd_cwnd": 13032,
"rtt": 10833,
"rttvar": 6119,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 6.000169038772583,
"end": 7.0003340244293213,
"seconds": 1.0001649856567383,
"bytes": 1563840,
"bits_per_second": 12508656.251133494,
"retransmits": 63,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 7.0003340244293213,
"end": 8.0000259876251221,
"seconds": 0.99969196319580078,
"bytes": 2085120,
"bits_per_second": 16686099.932897879,
"retransmits": 59,
"snd_cwnd": 15928,
"rtt": 997,
"rttvar": 191,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 7.0003340244293213,
"end": 8.0000259876251221,
"seconds": 0.99969196319580078,
"bytes": 2085120,
"bits_per_second": 16686099.932897879,
"retransmits": 59,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 8.0000259876251221,
"end": 9.0002651214599609,
"seconds": 1.0002391338348389,
"bytes": 1563840,
"bits_per_second": 12507728.978804173,
"retransmits": 111,
"snd_cwnd": 11584,
"rtt": 10524,
"rttvar": 7286,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 8.0000259876251221,
"end": 9.0002651214599609,
"seconds": 1.0002391338348389,
"bytes": 1563840,
"bits_per_second": 12507728.978804173,
"retransmits": 111,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 9.0002651214599609,
"end": 10.000118017196655,
"seconds": 0.99985289573669434,
"bytes": 2085120,
"bits_per_second": 16683414.201355513,
"retransmits": 69,
"snd_cwnd": 18824,
"rtt": 10234,
"rttvar": 5503,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 9.0002651214599609,
"end": 10.000118017196655,
"seconds": 0.99985289573669434,
"bytes": 2085120,
"bits_per_second": 16683414.201355513,
"retransmits": 69,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 10.000118017196655,
"end": 11.000248193740845,
"seconds": 1.0001301765441895,
"bytes": 1563840,
"bits_per_second": 12509091.609683301,
"retransmits": 102,
"snd_cwnd": 13032,
"rtt": 10238,
"rttvar": 6064,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 10.000118017196655,
"end": 11.000248193740845,
"seconds": 1.0001301765441895,
"bytes": 1563840,
"bits_per_second": 12509091.609683301,
"retransmits": 102,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 11.000248193740845,
"end": 12.000431060791016,
"seconds": 1.0001828670501709,
"bytes": 1563840,
"bits_per_second": 12508432.619824551,
"retransmits": 56,
"snd_cwnd": 1448,
"rtt": 6729,
"rttvar": 5119,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 11.000248193740845,
"end": 12.000431060791016,
"seconds": 1.0001828670501709,
"bytes": 1563840,
"bits_per_second": 12508432.619824551,
"retransmits": 56,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 12.000431060791016,
"end": 13.000285148620605,
"seconds": 0.99985408782958984,
"bytes": 2085120,
"bits_per_second": 16683394.310273621,
"retransmits": 58,
"snd_cwnd": 8688,
"rtt": 6845,
"rttvar": 8273,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 12.000431060791016,
"end": 13.000285148620605,
"seconds": 0.99985408782958984,
"bytes": 2085120,
"bits_per_second": 16683394.310273621,
"retransmits": 58,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 13.000285148620605,
"end": 14.000042200088501,
"seconds": 0.99975705146789551,
"bytes": 2085120,
"bits_per_second": 16685013.599562157,
"retransmits": 160,
"snd_cwnd": 14480,
"rtt": 7607,
"rttvar": 5565,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 13.000285148620605,
"end": 14.000042200088501,
"seconds": 0.99975705146789551,
"bytes": 2085120,
"bits_per_second": 16685013.599562157,
"retransmits": 160,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 14.000042200088501,
"end": 15.00003719329834,
"seconds": 0.99999499320983887,
"bytes": 1563840,
"bits_per_second": 12510782.638863424,
"retransmits": 38,
"snd_cwnd": 26064,
"rtt": 2419,
"rttvar": 2087,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 14.000042200088501,
"end": 15.00003719329834,
"seconds": 0.99999499320983887,
"bytes": 1563840,
"bits_per_second": 12510782.638863424,
"retransmits": 38,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 15.00003719329834,
"end": 16.000066041946411,
"seconds": 1.0000288486480713,
"bytes": 2085120,
"bits_per_second": 16680478.790737705,
"retransmits": 130,
"snd_cwnd": 20272,
"rtt": 8761,
"rttvar": 3048,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 15.00003719329834,
"end": 16.000066041946411,
"seconds": 1.0000288486480713,
"bytes": 2085120,
"bits_per_second": 16680478.790737705,
"retransmits": 130,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 16.000066041946411,
"end": 17.000143051147461,
"seconds": 1.0000770092010498,
"bytes": 1563840,
"bits_per_second": 12509756.633636316,
"retransmits": 78,
"snd_cwnd": 28960,
"rtt": 24893,
"rttvar": 8383,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 16.000066041946411,
"end": 17.000143051147461,
"seconds": 1.0000770092010498,
"bytes": 1563840,
"bits_per_second": 12509756.633636316,
"retransmits": 78,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 17.000143051147461,
"end": 18.000263214111328,
"seconds": 1.0001201629638672,
"bytes": 1563840,
"bits_per_second": 12509216.855426995,
"retransmits": 114,
"snd_cwnd": 15928,
"rtt": 13224,
"rttvar": 4235,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 17.000143051147461,
"end": 18.000263214111328,
"seconds": 1.0001201629638672,
"bytes": 1563840,
"bits_per_second": 12509216.855426995,
"retransmits": 114,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 18.000263214111328,
"end": 19.000095129013062,
"seconds": 0.9998319149017334,
"bytes": 2085120,
"bits_per_second": 16683764.292160505,
"retransmits": 53,
"snd_cwnd": 17376,
"rtt": 19297,
"rttvar": 6312,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 18.000263214111328,
"end": 19.000095129013062,
"seconds": 0.9998319149017334,
"bytes": 2085120,
"bits_per_second": 16683764.292160505,
"retransmits": 53,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 19.000095129013062,
"end": 20.000341176986694,
"seconds": 1.0002460479736328,
"bytes": 1563840,
"bits_per_second": 12507642.519903054,
"retransmits": 42,
"snd_cwnd": 20272,
"rtt": 3156,
"rttvar": 3643,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 19.000095129013062,
"end": 20.000341176986694,
"seconds": 1.0002460479736328,
"bytes": 1563840,
"bits_per_second": 12507642.519903054,
"retransmits": 42,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 20.000341176986694,
"end": 21.000100135803223,
"seconds": 0.99975895881652832,
"bytes": 2085120,
"bits_per_second": 16684981.767751502,
"retransmits": 112,
"snd_cwnd": 14480,
"rtt": 11700,
"rttvar": 5569,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 20.000341176986694,
"end": 21.000100135803223,
"seconds": 0.99975895881652832,
"bytes": 2085120,
"bits_per_second": 16684981.767751502,
"retransmits": 112,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 21.000100135803223,
"end": 22.000210046768188,
"seconds": 1.0001099109649658,
"bytes": 1563840,
"bits_per_second": 12509345.085810527,
"retransmits": 68,
"snd_cwnd": 21720,
"rtt": 21732,
"rttvar": 8869,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 21.000100135803223,
"end": 22.000210046768188,
"seconds": 1.0001099109649658,
"bytes": 1563840,
"bits_per_second": 12509345.085810527,
"retransmits": 68,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 22.000210046768188,
"end": 23.000141143798828,
"seconds": 0.99993109703063965,
"bytes": 2085120,
"bits_per_second": 16682109.446876084,
"retransmits": 92,
"snd_cwnd": 24616,
"rtt": 21527,
"rttvar": 8192,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 22.000210046768188,
"end": 23.000141143798828,
"seconds": 0.99993109703063965,
"bytes": 2085120,
"bits_per_second": 16682109.446876084,
"retransmits": 92,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 23.000141143798828,
"end": 24.000304222106934,
"seconds": 1.0001630783081055,
"bytes": 1563840,
"bits_per_second": 12508680.105611743,
"retransmits": 85,
"snd_cwnd": 14480,
"rtt": 12058,
"rttvar": 5251,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 23.000141143798828,
"end": 24.000304222106934,
"seconds": 1.0001630783081055,
"bytes": 1563840,
"bits_per_second": 12508680.105611743,
"retransmits": 85,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 24.000304222106934,
"end": 24.999988079071045,
"seconds": 0.99968385696411133,
"bytes": 1563840,
"bits_per_second": 12514676.427799048,
"retransmits": 183,
"snd_cwnd": 5792,
"rtt": 1009,
"rttvar": 1000,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 24.000304222106934,
"end": 24.999988079071045,
"seconds": 0.99968385696411133,
"bytes": 1563840,
"bits_per_second": 12514676.427799048,
"retransmits": 183,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 24.999988079071045,
"end": 26.000048160552979,
"seconds": 1.0000600814819336,
"bytes": 2085120,
"bits_per_second": 16679957.843414178,
"retransmits": 76,
"snd_cwnd": 17376,
"rtt": 9610,
"rttvar": 4621,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 24.999988079071045,
"end": 26.000048160552979,
"seconds": 1.0000600814819336,
"bytes": 2085120,
"bits_per_second": 16679957.843414178,
"retransmits": 76,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 26.000048160552979,
"end": 27.000274181365967,
"seconds": 1.0002260208129883,
"bytes": 1563840,
"bits_per_second": 12507892.955865344,
"retransmits": 138,
"snd_cwnd": 17376,
"rtt": 6622,
"rttvar": 6040,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 26.000048160552979,
"end": 27.000274181365967,
"seconds": 1.0002260208129883,
"bytes": 1563840,
"bits_per_second": 12507892.955865344,
"retransmits": 138,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 27.000274181365967,
"end": 28.000102043151855,
"seconds": 0.99982786178588867,
"bytes": 2085120,
"bits_per_second": 16683831.925032109,
"retransmits": 77,
"snd_cwnd": 15928,
"rtt": 14498,
"rttvar": 2115,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 27.000274181365967,
"end": 28.000102043151855,
"seconds": 0.99982786178588867,
"bytes": 2085120,
"bits_per_second": 16683831.925032109,
"retransmits": 77,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 28.000102043151855,
"end": 29.000017166137695,
"seconds": 0.99991512298583984,
"bytes": 1563840,
"bits_per_second": 12511781.962694816,
"retransmits": 88,
"snd_cwnd": 1448,
"rtt": 17351,
"rttvar": 6222,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 28.000102043151855,
"end": 29.000017166137695,
"seconds": 0.99991512298583984,
"bytes": 1563840,
"bits_per_second": 12511781.962694816,
"retransmits": 88,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 29.000017166137695,
"end": 29.999970197677612,
"seconds": 0.999953031539917,
"bytes": 2150280,
"bits_per_second": 17203048.000673324,
"retransmits": 57,
"snd_cwnd": 13032,
"rtt": 15027,
"rttvar": 1607,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 29.000017166137695,
"end": 29.999970197677612,
"seconds": 0.999953031539917,
"bytes": 2150280,
"bits_per_second": 17203048.000673324,
"retransmits": 57,
"omitted": false
}
}],
"end": {
"streams": [{
"sender": {
"socket": 5,
"start": 0,
"end": 29.999970197677612,
"seconds": 29.999970197677612,
"bytes": 54278280,
"bits_per_second": 14474222.378848055,
"retransmits": 2543,
"max_snd_cwnd": 28960,
"max_rtt": 24893,
"min_rtt": 482,
"mean_rtt": 10277
},
"receiver": {
"socket": 5,
"start": 0,
"end": 30.047013998031616,
"seconds": 29.999970197677612,
"bytes": 54243528,
"bits_per_second": 14442307.779016843
}
}],
"sum_sent": {
"start": 0,
"end": 29.999970197677612,
"seconds": 29.999970197677612,
"bytes": 54278280,
"bits_per_second": 14474222.378848055,
"retransmits": 2543
},
"sum_received": {
"start": 0,
"end": 30.047013998031616,
"seconds": 30.047013998031616,
"bytes": 54243528,
"bits_per_second": 14442307.779016843
},
"cpu_utilization_percent": {
"host_total": 0.20204093980114748,
"host_user": 0.0728652619907714,
"host_system": 0.12918137753362316,
"remote_total": 1.1774421951610694,
"remote_user": 0.15254413270531306,
"remote_system": 1.024902419552419
},
"sender_tcp_congestion": "cubic",
"receiver_tcp_congestion": "cubic"
}
}

View File

@ -1,904 +0,0 @@
{
"start": {
"connected": [{
"socket": 5,
"local_host": "2.2.2.3",
"local_port": 33214,
"remote_host": "2.2.2.2",
"remote_port": 5201
}],
"version": "iperf 3.6",
"system_info": "Linux Manual-LocalPortal 4.19.0-12-amd64 #1 SMP Debian 4.19.152-1 (2020-10-18) x86_64",
"timestamp": {
"time": "Tue, 03 Nov 2020 20:37:05 GMT",
"timesecs": 1604435825
},
"connecting_to": {
"host": "2.2.2.2",
"port": 5201
},
"cookie": "hjybxbqwrgxmc63nengx3ba6q7j2qc7uz44u",
"tcp_mss_default": 1448,
"sock_bufsize": 0,
"sndbuf_actual": 16384,
"rcvbuf_actual": 131072,
"test_start": {
"protocol": "TCP",
"num_streams": 1,
"blksize": 131072,
"omit": 5,
"duration": 30,
"bytes": 0,
"blocks": 0,
"reverse": 0,
"tos": 0
}
},
"intervals": [{
"streams": [{
"socket": 5,
"start": 0,
"end": 1.0001130104064941,
"seconds": 1.0001130104064941,
"bytes": 7859744,
"bits_per_second": 62870846.940030679,
"retransmits": 168,
"snd_cwnd": 47784,
"rtt": 28466,
"rttvar": 4158,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 0,
"end": 1.0001130104064941,
"seconds": 1.0001130104064941,
"bytes": 7859744,
"bits_per_second": 62870846.940030679,
"retransmits": 168,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 1.0001130104064941,
"end": 2.000230073928833,
"seconds": 1.0001170635223389,
"bytes": 2736720,
"bits_per_second": 21891197.339331243,
"retransmits": 158,
"snd_cwnd": 31856,
"rtt": 19104,
"rttvar": 7997,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 1.0001130104064941,
"end": 2.000230073928833,
"seconds": 1.0001170635223389,
"bytes": 2736720,
"bits_per_second": 21891197.339331243,
"retransmits": 158,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 2.000230073928833,
"end": 3.0001280307769775,
"seconds": 0.99989795684814453,
"bytes": 4561200,
"bits_per_second": 36493323.8937918,
"retransmits": 39,
"snd_cwnd": 30408,
"rtt": 7994,
"rttvar": 6820,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 2.000230073928833,
"end": 3.0001280307769775,
"seconds": 0.99989795684814453,
"bytes": 4561200,
"bits_per_second": 36493323.8937918,
"retransmits": 39,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 3.0001280307769775,
"end": 4.0004382133483887,
"seconds": 1.0003101825714111,
"bytes": 2736720,
"bits_per_second": 21886971.043041468,
"retransmits": 21,
"snd_cwnd": 41992,
"rtt": 22568,
"rttvar": 11944,
"pmtu": 1500,
"omitted": true
}],
"sum": {
"start": 3.0001280307769775,
"end": 4.0004382133483887,
"seconds": 1.0003101825714111,
"bytes": 2736720,
"bits_per_second": 21886971.043041468,
"retransmits": 21,
"omitted": true
}
}, {
"streams": [{
"socket": 5,
"start": 0.99975895881652832,
"end": 1.0002000331878662,
"seconds": 1.9999589920043945,
"bytes": 3648960,
"bits_per_second": 14596139.27920771,
"retransmits": 172,
"snd_cwnd": 53576,
"rtt": 26442,
"rttvar": 4085,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 0.99975895881652832,
"end": 1.0002000331878662,
"seconds": 1.9999589920043945,
"bytes": 3648960,
"bits_per_second": 14596139.27920771,
"retransmits": 172,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 1.0002000331878662,
"end": 2.0003628730773926,
"seconds": 1.0001628398895264,
"bytes": 3127680,
"bits_per_second": 25017366.174855847,
"retransmits": 145,
"snd_cwnd": 4344,
"rtt": 15833,
"rttvar": 15395,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 1.0002000331878662,
"end": 2.0003628730773926,
"seconds": 1.0001628398895264,
"bytes": 3127680,
"bits_per_second": 25017366.174855847,
"retransmits": 145,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 2.0003628730773926,
"end": 3.0001430511474609,
"seconds": 0.99978017807006836,
"bytes": 4561200,
"bits_per_second": 36497622.977920927,
"retransmits": 85,
"snd_cwnd": 37648,
"rtt": 15779,
"rttvar": 817,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 2.0003628730773926,
"end": 3.0001430511474609,
"seconds": 0.99978017807006836,
"bytes": 4561200,
"bits_per_second": 36497622.977920927,
"retransmits": 85,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 3.0001430511474609,
"end": 4.0001969337463379,
"seconds": 1.000053882598877,
"bytes": 3648960,
"bits_per_second": 29190107.16116466,
"retransmits": 57,
"snd_cwnd": 1448,
"rtt": 7463,
"rttvar": 7039,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 3.0001430511474609,
"end": 4.0001969337463379,
"seconds": 1.000053882598877,
"bytes": 3648960,
"bits_per_second": 29190107.16116466,
"retransmits": 57,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 4.0001969337463379,
"end": 5.0002570152282715,
"seconds": 1.0000600814819336,
"bytes": 3648960,
"bits_per_second": 29189926.225974809,
"retransmits": 47,
"snd_cwnd": 27512,
"rtt": 12944,
"rttvar": 1829,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 4.0001969337463379,
"end": 5.0002570152282715,
"seconds": 1.0000600814819336,
"bytes": 3648960,
"bits_per_second": 29189926.225974809,
"retransmits": 47,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 5.0002570152282715,
"end": 6.0003118515014648,
"seconds": 1.0000548362731934,
"bytes": 3648960,
"bits_per_second": 29190079.324835606,
"retransmits": 41,
"snd_cwnd": 39096,
"rtt": 1252,
"rttvar": 506,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 5.0002570152282715,
"end": 6.0003118515014648,
"seconds": 1.0000548362731934,
"bytes": 3648960,
"bits_per_second": 29190079.324835606,
"retransmits": 41,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 6.0003118515014648,
"end": 7.00028395652771,
"seconds": 0.99997210502624512,
"bytes": 3648960,
"bits_per_second": 29192494.323863003,
"retransmits": 133,
"snd_cwnd": 21720,
"rtt": 6771,
"rttvar": 7775,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 6.0003118515014648,
"end": 7.00028395652771,
"seconds": 0.99997210502624512,
"bytes": 3648960,
"bits_per_second": 29192494.323863003,
"retransmits": 133,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 7.00028395652771,
"end": 8.00033187866211,
"seconds": 1.0000479221343994,
"bytes": 3648960,
"bits_per_second": 29190281.139424078,
"retransmits": 130,
"snd_cwnd": 28960,
"rtt": 12283,
"rttvar": 2654,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 7.00028395652771,
"end": 8.00033187866211,
"seconds": 1.0000479221343994,
"bytes": 3648960,
"bits_per_second": 29190281.139424078,
"retransmits": 130,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 8.00033187866211,
"end": 9.000169038772583,
"seconds": 0.99983716011047363,
"bytes": 4561200,
"bits_per_second": 36495542.930178955,
"retransmits": 40,
"snd_cwnd": 27512,
"rtt": 5518,
"rttvar": 2327,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 8.00033187866211,
"end": 9.000169038772583,
"seconds": 0.99983716011047363,
"bytes": 4561200,
"bits_per_second": 36495542.930178955,
"retransmits": 40,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 9.000169038772583,
"end": 10.000263929367065,
"seconds": 1.0000948905944824,
"bytes": 2736720,
"bits_per_second": 21891682.685215779,
"retransmits": 119,
"snd_cwnd": 11584,
"rtt": 604,
"rttvar": 72,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 9.000169038772583,
"end": 10.000263929367065,
"seconds": 1.0000948905944824,
"bytes": 2736720,
"bits_per_second": 21891682.685215779,
"retransmits": 119,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 10.000263929367065,
"end": 11.000330924987793,
"seconds": 1.0000669956207275,
"bytes": 3648960,
"bits_per_second": 29189724.416293863,
"retransmits": 74,
"snd_cwnd": 27512,
"rtt": 12099,
"rttvar": 4452,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 10.000263929367065,
"end": 11.000330924987793,
"seconds": 1.0000669956207275,
"bytes": 3648960,
"bits_per_second": 29189724.416293863,
"retransmits": 74,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 11.000330924987793,
"end": 12.000174045562744,
"seconds": 0.99984312057495117,
"bytes": 4561200,
"bits_per_second": 36495325.365660332,
"retransmits": 104,
"snd_cwnd": 27512,
"rtt": 9093,
"rttvar": 4584,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 11.000330924987793,
"end": 12.000174045562744,
"seconds": 0.99984312057495117,
"bytes": 4561200,
"bits_per_second": 36495325.365660332,
"retransmits": 104,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 12.000174045562744,
"end": 13.000422954559326,
"seconds": 1.000248908996582,
"bytes": 2736720,
"bits_per_second": 21888311.80227242,
"retransmits": 19,
"snd_cwnd": 40544,
"rtt": 20490,
"rttvar": 6207,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 12.000174045562744,
"end": 13.000422954559326,
"seconds": 1.000248908996582,
"bytes": 2736720,
"bits_per_second": 21888311.80227242,
"retransmits": 19,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 13.000422954559326,
"end": 14.000242948532104,
"seconds": 0.99981999397277832,
"bytes": 4561200,
"bits_per_second": 36496169.530485995,
"retransmits": 55,
"snd_cwnd": 21720,
"rtt": 9322,
"rttvar": 5071,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 13.000422954559326,
"end": 14.000242948532104,
"seconds": 0.99981999397277832,
"bytes": 4561200,
"bits_per_second": 36496169.530485995,
"retransmits": 55,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 14.000242948532104,
"end": 15.000162839889526,
"seconds": 0.99991989135742188,
"bytes": 3648960,
"bits_per_second": 29194018.693208914,
"retransmits": 76,
"snd_cwnd": 23168,
"rtt": 11580,
"rttvar": 4221,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 14.000242948532104,
"end": 15.000162839889526,
"seconds": 0.99991989135742188,
"bytes": 3648960,
"bits_per_second": 29194018.693208914,
"retransmits": 76,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 15.000162839889526,
"end": 16.00031590461731,
"seconds": 1.0001530647277832,
"bytes": 3648960,
"bits_per_second": 29187212.467268948,
"retransmits": 35,
"snd_cwnd": 37648,
"rtt": 18655,
"rttvar": 4241,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 15.000162839889526,
"end": 16.00031590461731,
"seconds": 1.0001530647277832,
"bytes": 3648960,
"bits_per_second": 29187212.467268948,
"retransmits": 35,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 16.00031590461731,
"end": 17.000074863433838,
"seconds": 0.99975895881652832,
"bytes": 4561200,
"bits_per_second": 36498397.616956413,
"retransmits": 28,
"snd_cwnd": 28960,
"rtt": 11578,
"rttvar": 7529,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 16.00031590461731,
"end": 17.000074863433838,
"seconds": 0.99975895881652832,
"bytes": 4561200,
"bits_per_second": 36498397.616956413,
"retransmits": 28,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 17.000074863433838,
"end": 18.000160932540894,
"seconds": 1.0000860691070557,
"bytes": 3648960,
"bits_per_second": 29189167.714399125,
"retransmits": 88,
"snd_cwnd": 27512,
"rtt": 6317,
"rttvar": 10163,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 17.000074863433838,
"end": 18.000160932540894,
"seconds": 1.0000860691070557,
"bytes": 3648960,
"bits_per_second": 29189167.714399125,
"retransmits": 88,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 18.000160932540894,
"end": 19.000382900238037,
"seconds": 1.0002219676971436,
"bytes": 2736720,
"bits_per_second": 21888901.370969683,
"retransmits": 31,
"snd_cwnd": 30408,
"rtt": 20038,
"rttvar": 7181,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 18.000160932540894,
"end": 19.000382900238037,
"seconds": 1.0002219676971436,
"bytes": 2736720,
"bits_per_second": 21888901.370969683,
"retransmits": 31,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 19.000382900238037,
"end": 20.000078916549683,
"seconds": 0.99969601631164551,
"bytes": 4626360,
"bits_per_second": 37022134.124882035,
"retransmits": 118,
"snd_cwnd": 39096,
"rtt": 12253,
"rttvar": 7091,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 19.000382900238037,
"end": 20.000078916549683,
"seconds": 0.99969601631164551,
"bytes": 4626360,
"bits_per_second": 37022134.124882035,
"retransmits": 118,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 20.000078916549683,
"end": 21.000180006027222,
"seconds": 1.0001010894775391,
"bytes": 3648960,
"bits_per_second": 29188729.326602343,
"retransmits": 66,
"snd_cwnd": 28960,
"rtt": 10169,
"rttvar": 8560,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 20.000078916549683,
"end": 21.000180006027222,
"seconds": 1.0001010894775391,
"bytes": 3648960,
"bits_per_second": 29188729.326602343,
"retransmits": 66,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 21.000180006027222,
"end": 22.000144958496094,
"seconds": 0.99996495246887207,
"bytes": 3648960,
"bits_per_second": 29192703.132171731,
"retransmits": 74,
"snd_cwnd": 30408,
"rtt": 6238,
"rttvar": 5972,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 21.000180006027222,
"end": 22.000144958496094,
"seconds": 0.99996495246887207,
"bytes": 3648960,
"bits_per_second": 29192703.132171731,
"retransmits": 74,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 22.000144958496094,
"end": 23.000087976455688,
"seconds": 0.99994301795959473,
"bytes": 3648960,
"bits_per_second": 29193343.49627867,
"retransmits": 49,
"snd_cwnd": 30408,
"rtt": 13749,
"rttvar": 4520,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 22.000144958496094,
"end": 23.000087976455688,
"seconds": 0.99994301795959473,
"bytes": 3648960,
"bits_per_second": 29193343.49627867,
"retransmits": 49,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 23.000087976455688,
"end": 24.000288963317871,
"seconds": 1.0002009868621826,
"bytes": 3648960,
"bits_per_second": 29185814.0348169,
"retransmits": 138,
"snd_cwnd": 31856,
"rtt": 7151,
"rttvar": 11584,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 23.000087976455688,
"end": 24.000288963317871,
"seconds": 1.0002009868621826,
"bytes": 3648960,
"bits_per_second": 29185814.0348169,
"retransmits": 138,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 24.000288963317871,
"end": 25.000213861465454,
"seconds": 0.999924898147583,
"bytes": 3714120,
"bits_per_second": 29715191.665939037,
"retransmits": 62,
"snd_cwnd": 28960,
"rtt": 14113,
"rttvar": 1352,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 24.000288963317871,
"end": 25.000213861465454,
"seconds": 0.999924898147583,
"bytes": 3714120,
"bits_per_second": 29715191.665939037,
"retransmits": 62,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 25.000213861465454,
"end": 26.000295877456665,
"seconds": 1.0000820159912109,
"bytes": 3648960,
"bits_per_second": 29189286.011775006,
"retransmits": 68,
"snd_cwnd": 82536,
"rtt": 56523,
"rttvar": 45608,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 25.000213861465454,
"end": 26.000295877456665,
"seconds": 1.0000820159912109,
"bytes": 3648960,
"bits_per_second": 29189286.011775006,
"retransmits": 68,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 26.000295877456665,
"end": 27.000303030014038,
"seconds": 1.000007152557373,
"bytes": 3648960,
"bits_per_second": 29191471.206327394,
"retransmits": 230,
"snd_cwnd": 52128,
"rtt": 22512,
"rttvar": 14539,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 26.000295877456665,
"end": 27.000303030014038,
"seconds": 1.000007152557373,
"bytes": 3648960,
"bits_per_second": 29191471.206327394,
"retransmits": 230,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 27.000303030014038,
"end": 28.000287055969238,
"seconds": 0.9999840259552002,
"bytes": 3648960,
"bits_per_second": 29192146.316653065,
"retransmits": 72,
"snd_cwnd": 46336,
"rtt": 12034,
"rttvar": 4791,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 27.000303030014038,
"end": 28.000287055969238,
"seconds": 0.9999840259552002,
"bytes": 3648960,
"bits_per_second": 29192146.316653065,
"retransmits": 72,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 28.000287055969238,
"end": 29.000072956085205,
"seconds": 0.9997859001159668,
"bytes": 4561200,
"bits_per_second": 36497414.092124633,
"retransmits": 151,
"snd_cwnd": 23168,
"rtt": 13022,
"rttvar": 3630,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 28.000287055969238,
"end": 29.000072956085205,
"seconds": 0.9997859001159668,
"bytes": 4561200,
"bits_per_second": 36497414.092124633,
"retransmits": 151,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 29.000072956085205,
"end": 29.999979019165039,
"seconds": 0.999906063079834,
"bytes": 3648960,
"bits_per_second": 29194422.434129488,
"retransmits": 35,
"snd_cwnd": 27512,
"rtt": 14104,
"rttvar": 2315,
"pmtu": 1500,
"omitted": false
}],
"sum": {
"start": 29.000072956085205,
"end": 29.999979019165039,
"seconds": 0.999906063079834,
"bytes": 3648960,
"bits_per_second": 29194422.434129488,
"retransmits": 35,
"omitted": false
}
}],
"end": {
"streams": [{
"sender": {
"socket": 5,
"start": 0,
"end": 29.999979019165039,
"seconds": 29.999979019165039,
"bytes": 112726800,
"bits_per_second": 30060501.023147028,
"retransmits": 2542,
"max_snd_cwnd": 82536,
"max_rtt": 56523,
"min_rtt": 604,
"mean_rtt": 14237
},
"receiver": {
"socket": 5,
"start": 0,
"end": 30.074513912200928,
"seconds": 29.999979019165039,
"bytes": 112376384,
"bits_per_second": 29892788.113701824
}
}],
"sum_sent": {
"start": 0,
"end": 29.999979019165039,
"seconds": 29.999979019165039,
"bytes": 112726800,
"bits_per_second": 30060501.023147028,
"retransmits": 2542
},
"sum_received": {
"start": 0,
"end": 30.074513912200928,
"seconds": 30.074513912200928,
"bytes": 112376384,
"bits_per_second": 29892788.113701824
},
"cpu_utilization_percent": {
"host_total": 0.22899917925098145,
"host_user": 0.082528055178228629,
"host_system": 0.14647967413545043,
"remote_total": 2.3161445099272395,
"remote_user": 0.21584379195901418,
"remote_system": 2.1003007179682252
},
"sender_tcp_congestion": "cubic",
"receiver_tcp_congestion": "cubic"
}
}

File diff suppressed because it is too large Load Diff

View File

@ -11,6 +11,7 @@ import proxmoxer
import paramiko
import structure
import structure.generic
def check_env(*names: str) -> bool:
@ -21,14 +22,14 @@ def check_env(*names: str) -> bool:
def bridge_node_search(
first: structure.Bridge,
bridge_name_generator: Callable[[structure.Bridge], str],
node_id_generator: Callable[[structure.Node], int],
) -> Tuple[List[structure.Bridge], List[structure.Node]]:
bridges: List[structure.Bridge] = []
nodes: List[structure.Node] = []
first: structure.generic.Bridge,
bridge_name_generator: Callable[[structure.generic.Bridge], str],
node_id_generator: Callable[[structure.generic.Node], int],
) -> Tuple[List[structure.generic.Bridge], List[structure.generic.Node]]:
bridges: List[structure.generic.Bridge] = []
nodes: List[structure.generic.Node] = []
queue: List[structure.Bridge] = [first]
queue: List[structure.generic.Bridge] = [first]
while len(queue) > 0:
bridge = queue.pop()
if bridge.get_name() != '':
@ -38,7 +39,7 @@ def bridge_node_search(
bridge.set_name(bridge_name_generator(bridge))
# from this bridge, find all nodes (via all interfaces)
reachable_nodes: List[structure.Node] = []
reachable_nodes: List[structure.generic.Node] = []
for interface in bridge.get_interfaces():
node = interface.get_node()
if node.get_id() is not None:
@ -63,7 +64,7 @@ class PrintRunner:
self._last_bridge: int = 0
self._last_node_id = 0
def build(self, bridge: structure.Bridge):
def build(self, bridge: structure.generic.Bridge):
bridges, nodes = bridge_node_search(bridge, lambda _: self.name_bridge(), lambda _: self.id_node())
print(bridges)
@ -121,10 +122,10 @@ class ProxmoxRunner:
self._template_id = template_id
self._initial_vm_id = initial_vm_id
self._internet_bridge = structure.Bridge()
self._internet_bridge = structure.generic.Bridge()
self._internet_bridge.set_name(internet_bridge)
self._management_bridge = structure.Bridge()
self._management_bridge = structure.generic.Bridge()
self._management_bridge.set_name(management_bridge)
self._management_initial_ip = management_initial_ip
self._management_netmask = management_netmask
@ -133,21 +134,21 @@ class ProxmoxRunner:
self._private_key = paramiko.RSAKey.generate(3072)
self._client = paramiko.SSHClient()
def build(self, bridge: structure.Bridge):
def build(self, bridge: structure.generic.Bridge):
bridges, nodes = bridge_node_search(bridge, lambda x: self._create_bridge(x), lambda x: self._create_node(x))
self._build_bridges()
self._build_bridges(bridges)
with concurrent.futures.ThreadPoolExecutor(max_workers=8) as executor:
build_futures = [executor.submit(self._build_node, node) for node in nodes]
for future in build_futures:
future.result()
future.result(300)
# guarantee that setup is not called until all of the nodes are built
# this means that all will have their final IPs by this point
setup_futures = [executor.submit(self._setup_node, node) for node in nodes]
for future in setup_futures:
future.result()
future.result(300)
def _await_task(self, upid, timeout=10):
t1 = datetime.now()
@ -156,7 +157,7 @@ class ProxmoxRunner:
return
raise TimeoutError
def _create_bridge(self, bridge: structure.Bridge) -> str:
def _create_bridge(self, bridge: structure.generic.Bridge) -> str:
while True:
try:
self._proxmox.nodes(self._proxmox_node).network.post(
@ -177,11 +178,17 @@ class ProxmoxRunner:
self._created_bridges.append(bridge_name)
return bridge_name
def _build_bridges(self):
def _build_bridges(self, bridges: List[structure.generic.Bridge]):
network_task = self._proxmox.nodes(self._proxmox_node).network.put()
self._await_task(network_task)
def _create_node(self, node: structure.Node) -> int:
existing = []
for bridge in bridges:
while True in [ipaddress.ip_network(bridge.get_network()).overlaps(x) for x in existing]:
bridge.new_network()
existing.append(bridge.get_network())
def _create_node(self, node: structure.generic.Node) -> int:
while True:
try:
clone_task = self._proxmox.nodes(self._proxmox_node).qemu(self._template_id).clone.post(
@ -201,10 +208,10 @@ class ProxmoxRunner:
self._created_nodes.append(new_id - 1)
return new_id - 1
def _open_ssh(self, node: structure.Node, interface: structure.Interface = None):
def _open_ssh(self, node: structure.generic.Node, interface: structure.generic.Interface = None):
if interface is None:
for iface in node.get_interfaces():
if iface.get_method() == structure.IpMethod.Management:
if iface.get_method() == structure.generic.IpMethod.Management:
interface = iface
break
if interface is None:
@ -227,21 +234,21 @@ class ProxmoxRunner:
except (paramiko.ssh_exception.AuthenticationException, paramiko.ssh_exception.NoValidConnectionsError):
time.sleep(10)
node.client = client
node.ssh_client = client
def _close_ssh(self, node: structure.Node):
node.client.close()
del node.client
def _close_ssh(self, node: structure.generic.Node):
node.ssh_client.close()
del node.ssh_client
def ssh(
self,
node: structure.Node,
node: structure.generic.Node,
command: str,
error_stderr=False,
error_stdout=False,
return_stdout=False,
) -> Union[int, str]:
chan = node.client.get_transport().open_session()
chan = node.ssh_client.get_transport().open_session()
chan.exec_command(command)
exit_status = chan.recv_exit_status()
@ -263,7 +270,7 @@ class ProxmoxRunner:
return exit_status
def _build_node(self, node: structure.Node):
def _build_node(self, node: structure.generic.Node):
# Step 1: Configure access
self._proxmox.nodes(self._proxmox_node).qemu(node.get_id()).config.put(
ciuser='python',
@ -276,7 +283,7 @@ class ProxmoxRunner:
# Step 2: connect to Internet bridge with DHCP to install packages
if node.get_internet_setup() is not None:
interfaces = node.get_interfaces()
internet_interface = structure.Interface(structure.IpMethod.Dhcp4)
internet_interface = structure.generic.Interface(structure.generic.IpMethod.Dhcp4)
internet_interface.set_bridge(self._internet_bridge)
temp_interfaces = [internet_interface, interfaces[len(interfaces) - 1]]
@ -296,12 +303,12 @@ class ProxmoxRunner:
self._setup_node_interfaces(node)
start_task = self._proxmox.nodes(self._proxmox_node).qemu(node.get_id()).status.start.post()
self._await_task(start_task)
self._await_task(start_task, timeout=20)
self._open_ssh(node)
node.ssh = (lambda n: lambda *args, **kwargs: self.ssh(n, *args, **kwargs))(node)
def _setup_node_interfaces(self, node: structure.Node, interfaces: List[structure.Interface] = None):
def _setup_node_interfaces(self, node: structure.generic.Node, interfaces: List[structure.generic.Interface] = None):
if interfaces is None:
interfaces = node.get_interfaces()
@ -310,21 +317,20 @@ class ProxmoxRunner:
interface = interfaces[i]
method = interface.get_method()
if method == structure.IpMethod.Manual:
pass
elif method == structure.IpMethod.Management:
if method == structure.generic.IpMethod.Management:
interface.set_bridge(self._management_bridge)
addr = self._management_initial_ip + node.get_id() - self._initial_vm_id
kwargs['ipconfig{}'.format(i)] = 'ip={}/{}'.format(addr, self._management_netmask)
interface.set_address(addr)
elif method == structure.IpMethod.Auto4:
elif method == structure.generic.IpMethod.Auto4 or method == structure.generic.IpMethod.Manual:
# handle manual the same as auto4 so it doesn't get stuck in DHCP
bridge = interface.get_bridge()
addr = bridge.get_ip_address()
kwargs['ipconfig{}'.format(i)] = 'ip={}/{}'.format(addr, bridge.netmask)
interface.set_address(addr)
elif method == structure.IpMethod.Dhcp4:
elif method == structure.generic.IpMethod.Dhcp4:
kwargs['ipconfig{}'.format(i)] = 'ip=dhcp'
else:
raise RuntimeError('not implemented')
@ -335,7 +341,7 @@ class ProxmoxRunner:
def interface_set_rate(iface):
def new_set_rate(rate: Optional[int]):
structure.Interface.set_rate(iface, rate)
structure.generic.Interface.set_rate(iface, rate)
self._update_node_interfaces(node)
return new_set_rate
@ -344,7 +350,7 @@ class ProxmoxRunner:
self._proxmox.nodes(self._proxmox_node).qemu(node.get_id()).config.put(**kwargs)
def _update_node_interfaces(self, node: structure.Node):
def _update_node_interfaces(self, node: structure.generic.Node):
interfaces = node.get_interfaces()
old_config = self._proxmox.nodes(self._proxmox_node).qemu(node.get_id()).config.get()
@ -363,9 +369,10 @@ class ProxmoxRunner:
self._proxmox.nodes(self._proxmox_node).qemu(node.get_id()).config.put(**new_config)
def _setup_node(self, node: structure.Node):
def _setup_node(self, node: structure.generic.Node):
if node.get_setup() is not None:
self.ssh(node, node.get_setup(), error_stdout=True, error_stderr=True)
cmd = node.get_setup()
self.ssh(node, cmd, error_stdout=True, error_stderr=True)
def teardown(self):
for node in self._created_nodes:
@ -377,8 +384,9 @@ class ProxmoxRunner:
for bridge in self._created_bridges:
self._proxmox.nodes(self._proxmox_node).network(bridge).delete()
network_task = self._proxmox.nodes(self._proxmox_node).network.put()
self._await_task(network_task)
if len(self._created_bridges) > 0:
network_task = self._proxmox.nodes(self._proxmox_node).network.put()
self._await_task(network_task)
self._created_nodes = []
self._last_node_id = 0

View File

@ -1,5 +1,5 @@
from .structure import Node
from .structure import IpMethod, Interface, Bridge
from .generic import IpMethod, Interface, Bridge, Node
from .structure import SpeedTestServer, LocalPortal, RemotePortal
from .tests import StandardTest, DirectTest, IperfResult
from .environments import StandardEnvironment, DirectEnvironment, BaseEnvironment

114
structure/environments.py Normal file
View File

@ -0,0 +1,114 @@
import threading
from typing import Tuple, Optional
from structure import Bridge, StandardTest, SpeedTestServer, Node, IperfResult, RemotePortal, Interface, \
IpMethod, LocalPortal
from structure.tests import repeat_until_satisfied
class BaseEnvironment:
def __init__(self, runner, top_level_bridge: Bridge):
self.top_level_bridge = top_level_bridge
self._runner = runner
def __enter__(self):
try:
self._runner.build(self.top_level_bridge)
except Exception as e:
self._runner.teardown()
raise e
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self._runner.teardown()
def _test(
self,
test: StandardTest,
inbound_server: SpeedTestServer,
inbound_client: SpeedTestServer,
rated_node: Node,
expected_interfaces: int,
) -> Tuple[IperfResult, IperfResult]:
if len(test.rates) != expected_interfaces:
raise RuntimeError('mismatched number of interfaces')
results = []
for server, client in [(inbound_server, inbound_client), (inbound_client, inbound_server)]:
def test_reducer(old: Optional[IperfResult]) -> IperfResult:
for i, r in enumerate(test.rates):
rated_node.get_interfaces()[i].set_rate(r)
server.server()
for delay, (index, rate) in test.events.items():
iface = rated_node.get_interfaces()[index]
threading.Timer(6 + delay, iface.set_rate, args=[rate]).start()
iperf = client.client(server, time=test.duration)
if old is None:
return IperfResult(test, iperf)
else:
old.add_results(iperf)
return old
def test_satisfier(val: IperfResult) -> bool:
if val.num_tests < 3:
return False
return val.bandwidth_coefficient_variance() < test.bandwidth_variation_target and False not in \
[x < test.interval_variation_target for x in val.interval_coefficient_variances().values()]
result = repeat_until_satisfied(
test_reducer,
test_satisfier,
max_failures=test.max_failures,
max_attempts=test.max_attempts,
)
results.append(result)
# Return a tuple of (inbound, outbound)
return results[0], results[1]
def test(self, test: StandardTest) -> Tuple[IperfResult, IperfResult]:
raise RuntimeError('not implemented')
class StandardEnvironment(BaseEnvironment):
def __init__(self, interfaces: int, runner, setup_params: dict):
self._interfaces = interfaces
self.rp = RemotePortal([Interface(IpMethod.Auto4)], setup_params=setup_params)
self.st = SpeedTestServer()
self.cl = SpeedTestServer(clone_interface=self.rp.get_interfaces()[0])
self.lp = LocalPortal(
[Interface(IpMethod.Auto4) for _ in range(interfaces)],
self.cl,
setup_params=setup_params,
)
self.rp.set_local_portal(self.lp)
self.lp.set_remote_portal(self.rp)
super().__init__(runner, Bridge(
self.st.get_interfaces()[0],
self.rp.get_interfaces()[0],
*self.lp.get_interfaces()[0:interfaces],
))
def test(self, test: StandardTest) -> Tuple[IperfResult, IperfResult]:
return self._test(test, self.st, self.cl, self.lp, self._interfaces)
class DirectEnvironment(BaseEnvironment):
def __init__(self, runner):
self.st1 = SpeedTestServer()
self.st2 = SpeedTestServer()
super().__init__(runner, Bridge(
self.st1.get_interfaces()[0],
self.st2.get_interfaces()[0],
))
def test(self, test: StandardTest) -> Tuple[IperfResult, IperfResult]:
return self._test(test, self.st2, self.st1, self.st2, 1)

132
structure/generic.py Normal file
View File

@ -0,0 +1,132 @@
import ipaddress
import random
from enum import Enum
from typing import Optional, List, Dict, Union
class IpMethod(Enum):
Manual = 0
Management = 1
Auto4 = 2
Auto6 = 3
Dhcp4 = 4
Dhcp6 = 5
class Interface:
def __init__(self, method: IpMethod, rate: Optional[int] = None):
self._method: IpMethod
self._node: Optional[Node] = None
self._rate: Optional[int] = None
self._bridge: Optional[Bridge] = None
self._method = method
self._rate = rate
self._address: ipaddress.ip_address = None
def get_method(self):
return self._method
def set_node(self, node):
self._node = node
def get_node(self):
return self._node
def set_bridge(self, bridge):
self._bridge = bridge
def get_bridge(self):
return self._bridge
def set_address(self, addr: ipaddress.ip_address):
self._address = addr
def get_address(self) -> ipaddress.ip_address:
return self._address
def get_rate(self) -> Optional[int]:
return self._rate
def set_rate(self, rate: Optional[int]):
self._rate = rate
class Bridge:
def __init__(self, *interfaces: Interface):
self._interfaces: List[Interface] = []
self._name: str = ''
for interface in interfaces:
self._interfaces.append(interface)
interface.set_bridge(self)
# Generate a random class c private range by default (10.0.0.0)
self._addr: ipaddress.ip_address = None
self._network_iterator: iter = None
self.netmask = 24
self.new_network()
def get_interfaces(self) -> List[Interface]:
return self._interfaces
def set_name(self, name: str):
self._name = name
def get_name(self) -> str:
return self._name
def set_netmask(self, mask: int):
self.netmask = mask
self._network_iterator = ipaddress.ip_network('{}/{}'.format(self._addr, self.netmask), False).hosts()
def get_ip_address(self) -> ipaddress.ip_address:
return next(self._network_iterator)
def get_network(self) -> ipaddress.ip_network:
return ipaddress.ip_network('{}/{}'.format(self._addr, self.netmask), False)
def get_network_string(self) -> str:
return str(ipaddress.ip_network('{}/{}'.format(self._addr, self.netmask), False))
def new_network(self):
self._addr: ipaddress.ip_address = ipaddress.ip_address('10.0.0.0') + random.randint(0, 16777216)
self._network_iterator = ipaddress.ip_network('{}/{}'.format(self._addr, self.netmask), False).hosts()
class Node:
def __init__(self, interfaces: List[Interface], setup_params: Dict = None):
self._id: Union[int, None] = None
self._interfaces: List[Interface] = interfaces
self._interfaces.append(Interface(IpMethod.Management))
for interface in self._interfaces:
interface.set_node(self)
self.setup_params = {} if setup_params is None else setup_params
def get_interfaces(self):
return self._interfaces
def set_id(self, new_id):
self._id = new_id
def get_id(self):
return self._id
def get_core_count(self) -> int:
return 2
def get_memory_mb(self) -> int:
return 2048
def get_internet_setup(self) -> Optional[str]:
return None
def get_setup(self) -> Optional[str]:
return None
def ssh(self, *args, **kwargs):
raise RuntimeError('ssh not implemented')

View File

@ -1,140 +1,50 @@
import ipaddress
import json
import textwrap
from enum import Enum
import random
from typing import List, Optional, Union, Dict
from typing import List, Optional
class IpMethod(Enum):
Manual = 0
Management = 1
Auto4 = 2
Auto6 = 3
Dhcp4 = 4
Dhcp6 = 5
class Interface:
def __init__(self, method: IpMethod, rate: Optional[int] = None):
self._method: IpMethod
self._node: Optional[Node] = None
self._rate: Optional[int] = None
self._bridge: Optional[Bridge] = None
self._method = method
self._rate = rate
self._address: ipaddress.ip_address = None
def get_method(self):
return self._method
def set_node(self, node):
self._node = node
def get_node(self):
return self._node
def set_bridge(self, bridge):
self._bridge = bridge
def get_bridge(self):
return self._bridge
def set_address(self, addr: ipaddress.ip_address):
self._address = addr
def get_address(self) -> ipaddress.ip_address:
return self._address
def get_rate(self) -> Optional[int]:
return self._rate
def set_rate(self, rate: Optional[int]):
self._rate = rate
class Bridge:
def __init__(self, *interfaces: Interface):
self._interfaces: List[Interface] = []
self._name: str = ''
for interface in interfaces:
self._interfaces.append(interface)
interface.set_bridge(self)
# Generate a random class c private range by default (10.0.0.0)
self.netmask = 24
self._addr: ipaddress.ip_address = ipaddress.ip_address('10.0.0.0') + random.randint(0, 16777216)
self._network_iterator = ipaddress.ip_network('{}/{}'.format(self._addr, self.netmask), False).hosts()
def get_interfaces(self) -> List[Interface]:
return self._interfaces
def set_name(self, name: str):
self._name = name
def get_name(self) -> str:
return self._name
def set_netmask(self, mask: int):
self.netmask = mask
self._network_iterator = ipaddress.ip_network('{}/{}'.format(self._addr, self.netmask), False).hosts()
def get_ip_address(self) -> ipaddress.ip_address:
return next(self._network_iterator)
def get_network(self) -> str:
return str(ipaddress.ip_network('{}/{}'.format(self._addr, self.netmask), False))
class Node:
def __init__(self, interfaces: List[Interface], setup_params: Dict = None):
self._id: Union[int, None] = None
self._interfaces: List[Interface] = interfaces
self._interfaces.append(Interface(IpMethod.Management))
for interface in self._interfaces:
interface.set_node(self)
self.setup_params = {} if setup_params is None else setup_params
def get_interfaces(self):
return self._interfaces
def set_id(self, new_id):
self._id = new_id
def get_id(self):
return self._id
def get_core_count(self) -> int:
return 2
def get_memory_mb(self) -> int:
return 2048
def get_internet_setup(self) -> Optional[str]:
return None
def get_setup(self) -> Optional[str]:
return None
def ssh(self, *args, **kwargs):
raise RuntimeError('ssh not implemented')
from structure import IpMethod, Interface, Bridge, Node
class SpeedTestServer(Node):
def client(self, server: Interface):
pass
def __init__(self, clone_interface: Interface = None, **kwargs):
super().__init__([Interface(IpMethod.Manual)], **kwargs)
# Entry method for running the serve with `with speedtest:`
def __enter__(self):
pass
self.clone_interface = clone_interface
def __exit__(self, exc_type, exc_val, exc_tb):
pass
def get_internet_setup(self) -> Optional[str]:
return textwrap.dedent('''
cloud-init status --wait || cloud-init status --long
sleep 2
sudo apt-get install -y iperf3
''')
def get_setup(self) -> Optional[str]:
if self.clone_interface is None:
return None
self.get_interfaces()[0].set_address(self.clone_interface.get_address())
return textwrap.dedent('''
set -e
sudo ip addr flush dev eth0
sudo ip addr add {} dev eth0
sudo ip route add 192.168.1.1 dev eth0
sudo ip route add default via 192.168.1.1 dev eth0
''').format(self.clone_interface.get_address())
def server(self):
self.ssh('iperf3 -s -1 -D', error_stdout=True, error_stderr=True)
def client(self, target, time=30, interval_size=2.0):
if isinstance(target, SpeedTestServer):
target = target.get_interfaces()[0].get_address()
command = 'iperf3 -c {target} -t {time} -O 6 -i {interval_size} -J'.format(
target=target,
time=time,
interval_size=interval_size,
)
return self.ssh(command, error_stdout=True, error_stderr=True, return_stdout=True)
class RemotePortal(Node):
@ -150,25 +60,18 @@ class RemotePortal(Node):
return textwrap.dedent('''
set -e
wget -q http://10.20.0.11/minio-client
chmod +x minio-client
./minio-client alias set s3 http://10.20.0.25:3900 {access_key} {secret_key} || \
./minio-client alias set s3 s3.us-west-001.backblazeb2.com {access_key} {secret_key}
./minio-client cp s3/dissertation/binaries/debian/{branch} mpbl3p
wget -q https://f001.backblazeb2.com/file/dissertation/binaries/debian/{branch} -O mpbl3p
chmod +x mpbl3p
cloud-init status --wait || cloud-init status --long
sudo apt-get install -y iperf3
''').format(**self.setup_params)
def get_setup(self) -> Optional[str]:
return textwrap.dedent('''
set -e
sudo sysctl -w net.ipv4.conf.all.arp_announce=1
sudo sysctl -w net.ipv4.conf.all.arp_ignore=2
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv4.conf.eth0.proxy_arp=1
cat << EOF > config.ini
[Host]
@ -184,24 +87,29 @@ class RemotePortal(Node):
(nohup sudo ./mpbl3p > mpbl3p.log 2>&1 & echo $! > mpbl3p.pid)
sleep 1
sudo ip link set up nc0
sudo ip addr add 172.19.152.2/31 dev nc0
sleep 10
ps $(cat mpbl3p.pid)
ps $(cat mpbl3p.pid) || cat mpbl3p.log
sudo ip addr add 172.19.152.2/31 dev nc0
sudo ip link set up nc0
sudo ip rule add from all table local priority 20
sudo ip rule del priority 0
sudo ip rule add to {local_host} dport 1234 table local priority 9
sudo ip route flush 10
sudo ip route add table 10 to {local_host} via 172.19.152.3 dev nc0
sudo ip rule add to {local_host} table 10 priority 10
ping -W 0.1 -c 1 172.19.152.3
ps $(cat mpbl3p.pid) || cat mpbl3p.log
''').format(
local_host=self.get_interfaces()[0].get_address(),
**self.setup_params,
)
def speedtest_server(self):
self.ssh('iperf3 -s -1 -D', error_stdout=True, error_stderr=True)
def speedtest_client(self, target, time=30):
command = 'iperf3 -c {target} -t {time} -O 5 -J'.format(target=target, time=time)
out = self.ssh(command, error_stdout=True, error_stderr=True, return_stdout=True)
return json.loads(out)
class LocalPortal(Node):
def __init__(self, wan_interfaces: List[Interface], child: Optional[Node], **kwargs):
@ -221,17 +129,10 @@ class LocalPortal(Node):
return textwrap.dedent('''
set -e
wget -q http://10.20.0.11/minio-client
chmod +x minio-client
./minio-client alias set s3 http://10.20.0.25:3900 {access_key} {secret_key} || \
./minio-client alias set s3 s3.us-west-001.backblazeb2.com {access_key} {secret_key}
./minio-client cp s3/dissertation/binaries/debian/{branch} mpbl3p
wget -q https://f001.backblazeb2.com/file/dissertation/binaries/debian/{branch} -O mpbl3p
chmod +x mpbl3p
cloud-init status --wait || cloud-init status --long
sudo apt-get install -y iperf3
''').format(**self.setup_params)
def get_setup(self) -> str:
@ -249,7 +150,7 @@ class LocalPortal(Node):
peers = '\n\n'.join([peer_string.format(
local_host=x.get_address(),
remote_host=self.remote_portal.get_interfaces()[0].get_address(),
) for x in self.get_interfaces()[:-1]])
) for x in self.get_interfaces()[:-2]])
policy_routing_string = textwrap.dedent('''
sudo ip route flush {table_number}
@ -258,17 +159,22 @@ class LocalPortal(Node):
''')
policy_routing = '\n\n'.join([policy_routing_string.format(
table_number=i+10,
table_number=i + 10,
device='eth{}'.format(i),
network=iface.get_bridge().get_network(),
network=iface.get_bridge().get_network_string(),
local_address=iface.get_address(),
) for i, iface in enumerate(self.get_interfaces()[:-1])])
) for i, iface in enumerate(self.get_interfaces()[:-2])])
return textwrap.dedent('''
set -e
sudo sysctl -w net.ipv4.conf.all.arp_announce=1
sudo sysctl -w net.ipv4.conf.all.arp_ignore=2
sudo sysctl -w net.ipv4.conf.all.arp_ignore=1
sudo sysctl -w net.ipv4.ip_forward=1
sudo ip addr flush dev {local_interface}
sudo ip addr add 192.168.1.1 dev {local_interface}
{policy_routing}
@ -281,17 +187,27 @@ class LocalPortal(Node):
(nohup sudo ./mpbl3p > mpbl3p.log 2>&1 & echo $! > mpbl3p.pid)
sleep 1
sudo ip link set up nc0
sleep 10
ps $(cat mpbl3p.pid) || cat mpbl3p.log
sudo ip addr add 172.19.152.3/31 dev nc0
sudo ip link set up nc0
ps $(cat mpbl3p.pid)
''').format(**self.setup_params, peers=peers, policy_routing=policy_routing)
sudo ip route flush 18
sudo ip route add table 18 default via 172.19.152.2 dev nc0
sudo ip rule add from {remote_host} iif {local_interface} table 18 priority 18
def speedtest_server(self):
self.ssh('iperf3 -s -1 -D', error_stdout=True, error_stderr=True)
sudo ip route flush 19
sudo ip route add to {remote_host} dev {local_interface} table 19
sudo ip rule add to {remote_host} table 19 priority 19
def speedtest_client(self, target, time=30):
command = 'iperf3 -c {target} -t {time} -O 5 -J'.format(target=target, time=time)
out = self.ssh(command, error_stdout=True, error_stderr=True, return_stdout=True)
return json.loads(out)
ping -W 0.1 -c 1 172.19.152.2
ps $(cat mpbl3p.pid) || cat mpbl3p.log
''').format(
**self.setup_params,
peers=peers,
policy_routing=policy_routing,
remote_host=self.remote_portal.get_interfaces()[0].get_address(),
local_interface='eth{}'.format(len(self.get_interfaces()) - 2),
)

137
structure/tests.py Normal file
View File

@ -0,0 +1,137 @@
import json
from typing import List, Dict, Tuple
import numpy as np
def repeat_until_satisfied(reducer, satisfied, initial=None, max_attempts=100, max_failures=3):
val = initial
for i in range(max_attempts):
for j in range(max_failures):
try:
val = reducer(val)
break
except Exception as e:
print('failed with {}'.format(e))
if j == max_failures - 1:
raise e
if satisfied(val):
return val
raise RuntimeError('too many attempts')
class StandardTest:
def __init__(
self,
rates: List[int],
events: Dict[float, Tuple[int, int]] = None,
duration: int = 10,
interval_variation_target: float = np.inf,
bandwidth_variation_target: float = np.inf,
max_failures: int = 3,
max_attempts: int = 60,
):
self.rates = rates
self.events = events if events is not None else dict()
self.duration = duration
self.interval_variation_target = interval_variation_target
self.bandwidth_variation_target = bandwidth_variation_target
self.max_failures = max_failures
self.max_attempts = max_attempts
def name(self) -> str:
name_builder = ['R{}-{}'.format(*y) for y in enumerate(self.rates)]
name_builder += ['E{}R{}-{}'.format(x, *y) for (x, y) in self.events.items()]
name_builder.append('T{}'.format(self.duration))
return ''.join(name_builder)
class DirectTest(StandardTest):
def __init__(self, rate: int, **kwargs):
super().__init__([rate], **kwargs)
def name(self) -> str:
return 'D{}'.format(super().name())
class IperfResult:
def __init__(self, test: StandardTest, iperf: str, interval_size=2.0):
self.test = test
self.interval_size = interval_size
# list containing an exact time and a value
self.interval_data: List[Tuple[float, float]] = []
# list containing the overall data transferred and the time taken
self.bandwidth_data: List[float] = []
self.num_tests = 0
self.add_results(iperf)
def add_results(self, iperf: str):
data = json.loads(iperf)
# grab the overall bandwidth
self.bandwidth_data.append(data['end']['sum_sent']['bits_per_second'])
# grab the sum data of all non omitted intervals, excluding any that are smaller than expected
intervals = [
x['sum'] for x in data['intervals'] if
(not x['sum']['omitted']) and (x['sum']['end'] - x['sum']['start'] > self.interval_size / 2)
]
for (time, result) in zip(
[((x['start'] + x['end']) / 2) for x in intervals],
[x['bits_per_second'] for x in intervals],
):
self.interval_data.append((time, result))
self.num_tests += 1
def bins(self) -> List[List[Tuple[float, float]]]:
bins: List[List[Tuple[float, float]]] = [[] for _ in np.arange(0, self.test.duration, self.interval_size)]
for time, result in self.interval_data:
index = int(np.round((time - self.interval_size / 2) / self.interval_size))
bins[index].append((time, result))
return bins
def interval_means(self) -> Dict[float, float]:
bins = self.bins()
means = [np.mean(x, axis=0)[1] for x in bins]
times = [i + self.interval_size / 2 for i in np.arange(0, self.test.duration, self.interval_size)]
return dict(zip(times, means))
def interval_standard_deviations(self) -> Dict[float, float]:
bins = self.bins()
stds = [np.std(x, axis=0)[1] for x in bins]
times = [i + self.interval_size / 2 for i in np.arange(0, self.test.duration, self.interval_size)]
return dict(zip(times, stds))
def interval_coefficient_variances(self) -> Dict[float, float]:
stds = self.interval_standard_deviations()
means = self.interval_means()
return {k: stds[k] / means[k] for k in stds.keys()}
def interval_time_ranges(self) -> Dict[float, Tuple[float, float]]:
bins = self.bins()
times = [i + self.interval_size / 2 for i in np.arange(0, self.test.duration, self.interval_size)]
ranges = [(-np.min(x, axis=0)[0] + time, np.max(x, axis=0)[0] - time) for (x, time) in zip(bins, times)]
return dict(zip(times, ranges))
def bandwidth_mean(self):
return np.mean(self.bandwidth_data)
def bandwidth_standard_deviation(self):
return np.std(self.bandwidth_data)
def bandwidth_coefficient_variance(self):
return self.bandwidth_standard_deviation() / self.bandwidth_mean()