From: smbaker Date: Tue, 5 Apr 2011 23:50:10 +0000 (-0700) Subject: add optional besteffort flag to core scheduler X-Git-Tag: nodemanager-2.0-32~5^2 X-Git-Url: http://git.onelab.eu/?p=nodemanager.git;a=commitdiff_plain;h=bf8e9a674484cb0aecca7f7319068e562c705877 add optional besteffort flag to core scheduler --- diff --git a/coresched.py b/coresched.py index cc0282b..dd6dd04 100644 --- a/coresched.py +++ b/coresched.py @@ -60,6 +60,24 @@ class CoreSched: cgroups.append(filename) return cgroups + def decodeCoreSpec (self, cores): + """ Decode the value of the core attribute. It's a number, followed by + an optional letter "b" to indicate besteffort cores should also + be supplied. + """ + bestEffort = False + + if cores.endswith("b"): + cores = cores[:-1] + bestEffort = True + + try: + cores = int(cores) + except ValueError: + cores = 0 + + return (cores, bestEffort) + def adjustCores (self, slivers): """ slivers is a dict of {sliver_name: rec} rec is a dict of attributes @@ -72,9 +90,12 @@ class CoreSched: reservations = {} + # allocate the cores to the slivers that have them reserved for name, rec in slivers.iteritems(): rspec = rec["_rspec"] cores = rspec.get("cpu_cores", 0) + (cores, bestEffort) = self.decodeCoreSpec(cores) + while (cores>0): # one cpu core reserved for best effort and system slices if len(cpus)<=1: @@ -90,6 +111,22 @@ class CoreSched: logger.log("CoreSched: allocating cpus " + str(cpus) + " to _default") reservations["_default"] = cpus[:] + # now check and see if any of our reservations had the besteffort flag + # set + for name, rec in slivers.iteritems(): + rspec = rec["_rspec"] + cores = rspec.get("cpu_cores", 0) + (cores, bestEffort) = self.decodeCoreSpec(cores) + + if not (reservations.get(name,[])): + # if there is no reservation for this slice, then it's already + # besteffort by default. + continue + + if bestEffort: + reservations[name] = reservations[name] + reservations["_default"] + logger.log("CoreSched: adding besteffort cores to " + name + ". new cores = " + str(reservations[name])) + self.reserveCores(reservations) def reserveCores (self, reservations): diff --git a/slivermanager.py b/slivermanager.py index 70c2186..383379e 100644 --- a/slivermanager.py +++ b/slivermanager.py @@ -29,7 +29,7 @@ DEFAULT_ALLOCATION = { # CPU parameters 'cpu_pct': 0, # percent CPU reserved 'cpu_share': 1, # proportional share - 'cpu_cores': 0, # reserved cpu cores + 'cpu_cores': "0b", # reserved cpu cores [b] # bandwidth parameters 'net_min_rate': bwmin / 1000, # kbps 'net_max_rate': bwmax / 1000, # kbps