-"""Whole core scheduling
-
+"""
+Whole-core scheduling
"""
import logger
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"):
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)
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
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 = []
#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
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()[:]
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
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]:
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):