use cgroups to calculate percentage of cpu used

This commit is contained in:
cody burkard
2014-09-04 04:21:25 -07:00
parent b85943dc0a
commit ce781a1832
+29 -20
View File
@@ -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