Merge branch 'master' of github.com:mpeuster/son-emu
authorpeusterm <manuel.peuster@uni-paderborn.de>
Mon, 25 Apr 2016 08:58:32 +0000 (10:58 +0200)
committerpeusterm <manuel.peuster@uni-paderborn.de>
Mon, 25 Apr 2016 08:58:32 +0000 (10:58 +0200)
1  2 
src/emuvim/dcemulator/resourcemodel/upb/simple.py

@@@ -9,6 -9,8 +9,8 @@@ from emuvim.dcemulator.resourcemodel im
  LOG = logging.getLogger("rm.upb.simple")
  LOG.setLevel(logging.DEBUG)
  
+ CPU_PERIOD = 1000000
  
  class UpbSimpleCloudDcRM(BaseResourceModel):
      """
          # calculate cpu time fraction of a single compute unit
          self.single_cu = float(e_cpu) / sum([rm.dc_max_cu for rm in list(self.registrar.resource_models)])
          # calculate cpu time fraction for container with given flavor
-         cpu_time_percentage = single_cu * number_cu
-         # calculate cpu period and quota for CFS
+         cpu_time_percentage = self.single_cu * number_cu
+         # calculate input values for CFS scheduler bandwidth limitation
+         cpu_period, cpu_quota = self._calculate_cpu_cfs_values(cpu_time_percentage)
+         # apply limits to container if changed
+         if d.cpu_period != cpu_period or d.cpu_quota != cpu_quota:
+             LOG.debug("Setting CPU limit for %r: cpu_quota = cpu_period * limit = %f * %f = %f" % (
+                       d.name, cpu_period, cpu_time_percentage, cpu_quota))
+             d.updateCpuLimit(cpu_period=int(cpu_period), cpu_quota=int(cpu_quota))
+     def _calculate_cpu_cfs_values(self, cpu_time_percentage):
+         """
+         Calculate cpu period and quota for CFS
+         :param cpu_time_percentage: percentage of overall CPU to be used
+         :return: cpu_period, cpu_quota
+         """
          # (see: https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt)
          # Attention minimum cpu_quota is 1ms (micro)
-         cpu_period = 1000000  # lets consider a fixed period of 1000000 microseconds for now
+         cpu_period = CPU_PERIOD  # lets consider a fixed period of 1000000 microseconds for now
          cpu_quota = cpu_period * cpu_time_percentage  # calculate the fraction of cpu time for this container
          # ATTENTION >= 1000 to avoid a invalid argument system error ... no idea why
          if cpu_quota < 1000:
              cpu_quota = 1000
-             LOG.warning("Increased CPU quota for %r to avoid system error." % d.name)
-         # apply to container if changed
-         if d.cpu_period != cpu_period or d.cpu_quota != cpu_quota:
-             LOG.debug("Setting CPU limit for %r: cpu_quota = cpu_period * limit = %f * %f = %f" % (
-                       d.name, cpu_period, cpu_time_percentage, cpu_quota))
-             d.updateCpuLimit(cpu_period=int(cpu_period), cpu_quota=int(cpu_quota))
+             LOG.warning("Increased CPU quota to avoid system error.")
+         return cpu_period, cpu_quota
  
      def _apply_mem_limits(self, d):
          """
          # calculate amount of memory for a single mu
          self.single_mu = float(e_mem) / sum([rm.dc_max_mu for rm in list(self.registrar.resource_models)])
          # calculate mem for given flavor
-         mem_limit = single_mu * number_mu
-         # ATTENTION minimum mem_limit per container is 4MB
-         if mem_limit < 4:
-             mem_limit = 4
-             LOG.warning("Increased MEM limit for %r because it was less than 4.0 MB." % d.name)
-         # to byte!
-         mem_limit = int(mem_limit*1024*1024)
+         mem_limit = self.single_mu * number_mu
+         mem_limit = self._calculate_mem_limit_value(mem_limit)
          # apply to container if changed
          if d.mem_limit != mem_limit:
              LOG.debug("Setting MEM limit for %r: mem_limit = %f MB" % (d.name, mem_limit/1024/1024))
              d.updateMemoryLimit(mem_limit=mem_limit)
  
+     def _calculate_mem_limit_value(self, mem_limit):
+         """
+         Calculate actual mem limit as input for cgroup API
+         :param mem_limit: abstract mem limit
+         :return: concrete mem limit
+         """
+         # ATTENTION minimum mem_limit per container is 4MB
+         if mem_limit < 4:
+             mem_limit = 4
+             LOG.warning("Increased MEM limit because it was less than 4.0 MB.")
+         # to byte!
+         return int(mem_limit*1024*1024)
      def get_state_dict(self):
          """
          Return the state of the resource model as simple dict.
          l["rm_state"] = self.get_state_dict()
          # append to logfile
          with open(path, "a") as f:
 -            f.write("%s\n" % json.dumps(l))
 +            f.write("%s\n" % json.dumps(l))