X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=coresched_lxc.py;h=50b53300b0890809db2891a6cae1621c4334cfed;hb=570d234b7d7b40416b296de71225f28c826ee991;hp=2aa81e79108751ecd360760315d963af64df3e0e;hpb=484212572bf9495e87c990f78e5ef5551b96a0ef;p=nodemanager.git diff --git a/coresched_lxc.py b/coresched_lxc.py index 2aa81e7..50b5330 100644 --- a/coresched_lxc.py +++ b/coresched_lxc.py @@ -185,7 +185,7 @@ class CoreSched: lastCpu = cpu logger.log("CoreSched: allocating unit " + str(cpu) + " to slice " + name) - reservations[name] = reservations.get(name,[]) + [cpu] + reservations[name] = reservations.get(name, []) + [cpu] # now find a memory node to go with the cpu if memSchedule: @@ -193,7 +193,7 @@ class CoreSched: if mem != None: mems.remove(mem) logger.log("CoreSched: allocating memory node " + str(mem) + " to slice " + name) - mem_reservations[name] = mem_reservations.get(name,[]) + [mem] + mem_reservations[name] = mem_reservations.get(name, []) + [mem] else: logger.log("CoreSched: failed to find memory node for cpu" + str(cpu)) @@ -226,9 +226,9 @@ class CoreSched: # note that if a reservation is [], then we don't need to add # bestEffort cores to it, since it is bestEffort by default. - if reservations.get(name,[]) != []: + if reservations.get(name, []) != []: reservations[name] = reservations[name] + reservations["_default"] - mem_reservations[name] = mem_reservations.get(name,[]) + mem_reservations["_default"] + mem_reservations[name] = mem_reservations.get(name, []) + mem_reservations["_default"] logger.log("CoreSched: adding besteffort units to " + name + ". new units = " + str(reservations[name])) self.reserveUnits(self.cgroup_var_name, reservations) @@ -238,27 +238,24 @@ 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)) + cgroup_path = cgroups.get_cgroup_path(slicename, 'freezer') + logger.verbose("CoreSched: setting freezer for {} to {} - path={} var={}" + .format(slicename,freeze, cgroup_path, var_name)) + cgroup = os.path.join(cgroup_path, var_name) + if not cgroup: + logger.log("Warning: Could not spot 'freezer' cgroup file for slice {} - ignored".format(slicename)) + break + 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): """ @@ -286,10 +283,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"): @@ -405,12 +401,12 @@ if __name__=="__main__": print "cpus:", x.listToRange(x.get_cpus()) print "sibling map:" for item in x.get_cpus(): - print " ", item, ",".join([str(y) for y in x.cpu_siblings.get(item,[])]) + print " ", item, ",".join([str(y) for y in x.cpu_siblings.get(item, [])]) print "mems:", x.listToRange(x.get_mems()) print "cpu to memory map:" for item in x.get_mems(): - print " ", item, ",".join([str(y) for y in x.mems_map.get(item,[])]) + print " ", item, ",".join([str(y) for y in x.mems_map.get(item, [])]) rspec_sl_test1 = {"cpu_cores": "1"} rec_sl_test1 = {"_rspec": rspec_sl_test1}