X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=coresched_lxc.py;h=a6aef79c1ae1c3b51b06e7323cc6b32b51d46698;hb=1b4f53e648b13f7629970787b6ec03387e2d966a;hp=1134eefe69face8764b0731b207f3595a8948be1;hpb=e57432c1dfdfeaa52cc32799e2abbc34b7704ce9;p=nodemanager.git diff --git a/coresched_lxc.py b/coresched_lxc.py index 1134eef..a6aef79 100644 --- a/coresched_lxc.py +++ b/coresched_lxc.py @@ -1,5 +1,5 @@ -"""Whole core scheduling - +""" +Whole-core scheduling """ import logger @@ -11,16 +11,17 @@ glo_coresched_simulate = False joinpath = os.path.join class CoreSched: - """ Whole-core scheduler + """ + Whole-core scheduler - The main entrypoint is adjustCores(self, slivers) which takes a - dictionary of sliver records. The cpu_cores field is pulled from the - effective rspec (rec["_rspec"]) for each sliver. + The main entrypoint is adjustCores(self, slivers) which takes a + dictionary of sliver records. The cpu_cores field is pulled from the + effective rspec (rec["_rspec"]) for each sliver. - If cpu_cores > 0 for a sliver, then that sliver will reserve one or - more of the cpu_cores on the machine. + If cpu_cores > 0 for a sliver, then that sliver will reserve one or + more of the cpu_cores on the machine. - One core is always left unreserved for system slices. + One core is always left unreserved for system slices. """ def __init__(self, cgroup_var_name="cpuset.cpus", slice_attr_name="cpu_cores"): @@ -33,8 +34,9 @@ class CoreSched: self.cpu_siblings={} def get_cgroup_var(self, name=None, subsys=None, filename=None): - """ decode cpuset.cpus or cpuset.mems into a list of units that can - be reserved. + """ + decode cpuset.cpus or cpuset.mems into a list of units that can + be reserved. """ assert(filename!=None or name!=None) @@ -65,7 +67,8 @@ class CoreSched: return units def get_cpus(self): - """ return a list of available cpu identifiers: [0,1,2,3...] + """ + return a list of available cpu identifiers: [0,1,2,3...] """ # the cpus never change, so if it's already been computed then don't @@ -111,9 +114,10 @@ class CoreSched: return self.find_cpu_mostsiblings(cpus) def get_cgroups (self): - """ return a list of cgroups - this might change as vservers are instantiated, so always compute - it dynamically. + """ + return a list of cgroups + this might change as vservers are instantiated, + so always compute it dynamically. """ return cgroups.get_cgroups() #cgroups = [] @@ -124,9 +128,10 @@ class CoreSched: #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. + """ + 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 @@ -142,9 +147,10 @@ class CoreSched: return (cores, bestEffort) def adjustCores (self, slivers): - """ slivers is a dict of {sliver_name: rec} - rec is a dict of attributes - rec['_rspec'] is the effective rspec + """ + slivers is a dict of {sliver_name: rec} + rec is a dict of attributes + rec['_rspec'] is the effective rspec """ cpus = self.get_cpus()[:] @@ -232,27 +238,20 @@ class CoreSched: self.freezeUnits("freezer.state", freezeList) def freezeUnits (self, var_name, freezeList): - for (cgroup, freeze) in freezeList.items(): + for (slicename, freeze) in freezeList.items(): try: - logger.verbose("CoreSched: setting freezer for " + cgroup + " to " + freeze) - attempts = [] -# attempts.append("/dev/cgroup/{}/var_name".format(cgroup, var_name)) - attempts.append("/sys/fs/cgroup/freezer/libvirt/lxc/{}/{}".format(cgroup, var_name)) - attempts.append("/sys/fs/cgroup/freezer/machine.slice/machine-lxc\\x2d{}.scope/{}".format(cgroup, var_name)) + logger.verbose("CoreSched: setting freezer for " + slicename + " to " + freeze) + cgroup_path = cgroups.get_cgroup_path(slicename, 'freezer') + cgroup = os.path.join(cgroup_path, var_name) + if glo_coresched_simulate: - for attempt in attempts: print "F", attempt + print "F", cgroup else: - ok = False - for attempt in attempts: - if os.path.exists(attempt): - file(attempt, "w").write(freeze) - ok = True - break - if not ok: - logger.log("CoreSched: could not freezeUnits with {}".format(cgroup)) + with open(cgroup, "w") as f: + f.write(freeze) except Exception as e: # the cgroup probably didn't exit... - logger.log("CoreSched: exception while setting freeze for {} ({})".format(cgroup, e)) + logger.log("CoreSched: exception while setting freeze for {} ({})".format(slicename, e)) def reserveUnits (self, var_name, reservations): """ @@ -280,10 +279,9 @@ class CoreSched: cpus = default if glo_coresched_simulate: - print "R", "/dev/cgroup/" + cgroup + "/" + var_name, self.listToRange(cpus) + print "R", cgroup + "/" + var_name, self.listToRange(cpus) else: cgroups.write(cgroup, var_name, self.listToRange(cpus)) - #file("/dev/cgroup/" + cgroup + "/" + var_name, "w").write( self.listToRange(cpus) + "\n" ) def reserveDefault (self, var_name, cpus): #if not os.path.exists("/etc/vservers/.defaults/cgroup"): @@ -296,13 +294,15 @@ class CoreSched: pass def listToRange (self, list): - """ take a list of items [1,2,3,5,...] and return it as a range: "1-3,5" - for now, just comma-separate + """ + take a list of items [1,2,3,5,...] and return it as a range: "1-3,5" + for now, just comma-separate """ return ",".join( [str(i) for i in list] ) def get_mems(self): - """ return a list of available cpu identifiers: [0,1,2,3...] + """ + return a list of available cpu identifiers: [0,1,2,3...] """ # the cpus never change, so if it's already been computed then don't @@ -345,8 +345,9 @@ class CoreSched: return self.mems def find_associated_memnode(self, mems, cpu): - """ Given a list of memory nodes and a cpu, see if one of the nodes in - the list can be used with that cpu. + """ + Given a list of memory nodes and a cpu, see if one of the nodes in + the list can be used with that cpu. """ for item in mems: if cpu in self.mems_map[item]: @@ -354,8 +355,8 @@ class CoreSched: return None def get_memnode_cpus(self, index): - """ for a given memory node, return the CPUs that it is associated - with. + """ + for a given memory node, return the CPUs that it is associated with. """ fn = "/sys/devices/system/node/node" + str(index) + "/cpulist" if not os.path.exists(fn):