#!/usr/bin/python | |
""" | |
Test bandwidth (using iperf) on linear networks of varying size, | |
using both kernel and user datapaths. | |
We construct a network of N hosts and N-1 switches, connected as follows: | |
h1 <-> s1 <-> s2 .. sN-1 | |
| | | | |
h2 h3 hN | |
WARNING: by default, the reference controller only supports 16 | |
switches, so this test WILL NOT WORK unless you have recompiled | |
your controller to support 100 switches (or more.) | |
In addition to testing the bandwidth across varying numbers | |
of switches, this example demonstrates: | |
- creating a custom topology, LinearTestTopo | |
- using the ping() and iperf() tests from Mininet() | |
- testing both the kernel and user switches | |
""" | |
from mininet.net import Mininet | |
from mininet.node import UserSwitch, OVSKernelSwitch | |
from mininet.topo import Topo | |
from mininet.log import lg | |
from mininet.util import irange | |
import sys | |
flush = sys.stdout.flush | |
class LinearTestTopo( Topo ): | |
"Topology for a string of N hosts and N-1 switches." | |
def __init__( self, N, **params ): | |
# Initialize topology | |
Topo.__init__( self, **params ) | |
# Create switches and hosts | |
hosts = [ self.addHost( 'h%s' % h ) | |
for h in irange( 1, N ) ] | |
switches = [ self.addSwitch( 's%s' % s ) | |
for s in irange( 1, N - 1 ) ] | |
# Wire up switches | |
last = None | |
for switch in switches: | |
if last: | |
self.addLink( last, switch ) | |
last = switch | |
# Wire up hosts | |
self.addLink( hosts[ 0 ], switches[ 0 ] ) | |
for host, switch in zip( hosts[ 1: ], switches ): | |
self.addLink( host, switch ) | |
def linearBandwidthTest( lengths ): | |
"Check bandwidth at various lengths along a switch chain." | |
results = {} | |
switchCount = max( lengths ) | |
hostCount = switchCount + 1 | |
switches = { 'reference user': UserSwitch, | |
'Open vSwitch kernel': OVSKernelSwitch } | |
topo = LinearTestTopo( hostCount ) | |
for datapath in switches.keys(): | |
print "*** testing", datapath, "datapath" | |
Switch = switches[ datapath ] | |
results[ datapath ] = [] | |
net = Mininet( topo=topo, switch=Switch ) | |
net.start() | |
print "*** testing basic connectivity" | |
for n in lengths: | |
net.ping( [ net.hosts[ 0 ], net.hosts[ n ] ] ) | |
print "*** testing bandwidth" | |
for n in lengths: | |
src, dst = net.hosts[ 0 ], net.hosts[ n ] | |
print "testing", src.name, "<->", dst.name, | |
bandwidth = net.iperf( [ src, dst ] ) | |
print bandwidth | |
flush() | |
results[ datapath ] += [ ( n, bandwidth ) ] | |
net.stop() | |
for datapath in switches.keys(): | |
print "*** Linear network results for", datapath, "datapath:" | |
result = results[ datapath ] | |
print "SwitchCount\tiperf Results" | |
for switchCount, bandwidth in result: | |
print switchCount, '\t\t', | |
print bandwidth[ 0 ], 'server, ', bandwidth[ 1 ], 'client' | |
if __name__ == '__main__': | |
lg.setLogLevel( 'info' ) | |
sizes = [ 1, 10, 20, 40, 60, 80, 100 ] | |
print "*** Running linearBandwidthTest", sizes | |
linearBandwidthTest( sizes ) |