If we want to observe a monotonic affect, we should make sure that we are in fact CPU limited where it matters. In this case, we are CPU limiting the hosts, and the iperf client uses a lot of CPU. We need to reduce the CPU allocation so that iperf is in fact CPU bound. We also correct the CPU allocation so that the client and server each receive 50% of the total. Previously we were specifying the per-host CPU allocation, so 45% meant we were allocating 90% of the overall CPU, which seems a bit confusing. On the other hand, now at 40% each host gets 20% of the CPU, which could also be considered slightly confusing! Although the client transmit rate is going to be the limiting factor, we still measure the received data rate at the server, because that is more interesting than the initial burst of buffering at the client. Measuring at the server becomes more important as we reduce the iperf time. The output is also changed slightly, and the test has been updated appropriately.
53 lines
1.3 KiB
Python
Executable File
53 lines
1.3 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
"""
|
|
Test for cpu.py
|
|
|
|
results format:
|
|
|
|
sched cpu received bits/sec
|
|
cfs 50% 8.14e+09
|
|
cfs 40% 6.48e+09
|
|
cfs 30% 4.56e+09
|
|
cfs 20% 2.84e+09
|
|
cfs 10% 1.29e+09
|
|
|
|
"""
|
|
|
|
import unittest
|
|
import pexpect
|
|
import sys
|
|
|
|
class testCPU( unittest.TestCase ):
|
|
|
|
prompt = 'mininet>'
|
|
|
|
@unittest.skipIf( '-quick' in sys.argv, 'long test' )
|
|
def testCPU( self ):
|
|
"Verify that CPU utilization is monotonically decreasing for each scheduler"
|
|
p = pexpect.spawn( 'python -m mininet.examples.cpu' )
|
|
# matches each line from results( shown above )
|
|
opts = [ '([a-z]+)\t([\d\.]+)%\t([\d\.e\+]+)',
|
|
pexpect.EOF ]
|
|
scheds = []
|
|
while True:
|
|
index = p.expect( opts, timeout=600 )
|
|
if index == 0:
|
|
sched = p.match.group( 1 )
|
|
cpu = float( p.match.group( 2 ) )
|
|
bw = float( p.match.group( 3 ) )
|
|
if sched not in scheds:
|
|
scheds.append( sched )
|
|
else:
|
|
self.assertTrue( bw < previous_bw,
|
|
"%f should be less than %f\n" %
|
|
( bw, previous_bw ) )
|
|
previous_bw = bw
|
|
else:
|
|
break
|
|
|
|
self.assertTrue( len( scheds ) > 0 )
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|