Merge pull request #369 from cdburkard/patches/hifi_multicore
Fix runCpuLimitTest with multiple cores
This commit is contained in:
+29
-20
@@ -94,6 +94,7 @@ import random
|
|||||||
import copy
|
import copy
|
||||||
from time import sleep
|
from time import sleep
|
||||||
from itertools import chain, groupby
|
from itertools import chain, groupby
|
||||||
|
from math import ceil
|
||||||
|
|
||||||
from mininet.cli import CLI
|
from mininet.cli import CLI
|
||||||
from mininet.log import info, error, debug, output, warn
|
from mininet.log import info, error, debug, output, warn
|
||||||
@@ -726,33 +727,41 @@ class Mininet( object ):
|
|||||||
duration: test duration in seconds
|
duration: test duration in seconds
|
||||||
returns a single list of measured CPU fractions as floats.
|
returns a single list of measured CPU fractions as floats.
|
||||||
"""
|
"""
|
||||||
|
cores = int( quietRun( 'nproc' ) )
|
||||||
pct = cpu * 100
|
pct = cpu * 100
|
||||||
info( '*** Testing CPU %.0f%% bandwidth limit\n' % pct )
|
info( '*** Testing CPU %.0f%% bandwidth limit\n' % pct )
|
||||||
hosts = self.hosts
|
hosts = self.hosts
|
||||||
|
cores = int( quietRun( 'nproc' ) )
|
||||||
|
# number of processes to run a while loop on per host
|
||||||
|
num_procs = int( ceil( cores * cpu ) )
|
||||||
|
pids = {}
|
||||||
for h in hosts:
|
for h in hosts:
|
||||||
|
pids[ h ] = []
|
||||||
|
for _core in range( num_procs ):
|
||||||
h.cmd( 'while true; do a=1; done &' )
|
h.cmd( 'while true; do a=1; done &' )
|
||||||
pids = [h.cmd( 'echo $!' ).strip() for h in hosts]
|
pids[ h ].append( h.cmd( 'echo $!' ).strip() )
|
||||||
pids_str = ",".join(["%s" % pid for pid in pids])
|
outputs = {}
|
||||||
cmd = 'ps -p %s -o pid,%%cpu,args' % pids_str
|
time = {}
|
||||||
# It's a shame that this is what pylint prefers
|
# get the initial cpu time for each host
|
||||||
outputs = []
|
for host in hosts:
|
||||||
for _ in range( duration ):
|
outputs[ host ] = []
|
||||||
|
with open( '/sys/fs/cgroup/cpuacct/%s/cpuacct.usage' % host, 'r' ) as f:
|
||||||
|
time[ host ] = float( f.read() )
|
||||||
|
for _ in range( 5 ):
|
||||||
sleep( 1 )
|
sleep( 1 )
|
||||||
outputs.append( quietRun( cmd ).strip() )
|
for host in hosts:
|
||||||
for h in hosts:
|
with open( '/sys/fs/cgroup/cpuacct/%s/cpuacct.usage' % host, 'r' ) as f:
|
||||||
h.cmd( 'kill $!' )
|
readTime = float( f.read() )
|
||||||
|
outputs[ host ].append( ( ( readTime - time[ host ] )
|
||||||
|
/ 1000000000 ) / cores * 100 )
|
||||||
|
time[ host ] = readTime
|
||||||
|
for h, pids in pids.items():
|
||||||
|
for pid in pids:
|
||||||
|
h.cmd( 'kill -9 %s' % pid )
|
||||||
cpu_fractions = []
|
cpu_fractions = []
|
||||||
for test_output in outputs:
|
for _host, outputs in outputs.items():
|
||||||
# Split by line. Ignore first line, which looks like this:
|
for pct in outputs:
|
||||||
# PID %CPU COMMAND\n
|
cpu_fractions.append( pct )
|
||||||
for line in test_output.split('\n')[1:]:
|
|
||||||
r = r'\d+\s*(\d+\.\d+)'
|
|
||||||
m = re.search( r, line )
|
|
||||||
if m is None:
|
|
||||||
error( '*** Error: could not extract CPU fraction: %s\n' %
|
|
||||||
line )
|
|
||||||
return None
|
|
||||||
cpu_fractions.append( float( m.group( 1 ) ) )
|
|
||||||
output( '*** Results: %s\n' % cpu_fractions )
|
output( '*** Results: %s\n' % cpu_fractions )
|
||||||
return cpu_fractions
|
return cpu_fractions
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user