[haizea-commit] r550 - in trunk/src/haizea/resourcemanager: . enact

haizea-commit at mailman.cs.uchicago.edu haizea-commit at mailman.cs.uchicago.edu
Thu Dec 4 17:09:26 CST 2008


Author: borja
Date: 2008-12-04 17:09:18 -0600 (Thu, 04 Dec 2008)
New Revision: 550

Modified:
   trunk/src/haizea/resourcemanager/configfile.py
   trunk/src/haizea/resourcemanager/enact/opennebula.py
   trunk/src/haizea/resourcemanager/enact/simulated.py
   trunk/src/haizea/resourcemanager/scheduler.py
Log:
* Fork suspendresume rate into separate suspend and resume rates
* Take into account enactment overhead in shutdown (this includes adding a delay when sending commands to OpenNebula)

Modified: trunk/src/haizea/resourcemanager/configfile.py
===================================================================
--- trunk/src/haizea/resourcemanager/configfile.py	2008-11-26 21:11:23 UTC (rev 549)
+++ trunk/src/haizea/resourcemanager/configfile.py	2008-12-04 23:09:18 UTC (rev 550)
@@ -192,6 +192,24 @@
              - all: any lease can be suspended                
             """),
 
+     Option(name        = "suspend-rate",
+            getter      = "suspend-rate",
+            type        = OPTTYPE_FLOAT,
+            required    = True,
+            doc         = """
+            Rate at which VMs are assumed to suspend (in MB of
+            memory per second)                
+            """),
+
+     Option(name        = "resume-rate",
+            getter      = "resume-rate",
+            type        = OPTTYPE_FLOAT,
+            required    = True,
+            doc         = """
+            Rate at which VMs are assumed to resume (in MB of
+            memory per second)                
+            """),
+
      Option(name        = "suspendresume-exclusion",
             getter      = "suspendresume-exclusion",
             type        = OPTTYPE_STRING,
@@ -237,6 +255,26 @@
             situations where a lease starts and immediately gets suspended.               
             """),
 
+     Option(name        = "override-suspend-time",
+            getter      = "override-suspend-time",
+            type        = OPTTYPE_INT,
+            required    = False,
+            default     = None,
+            doc         = """
+            Overrides the time it takes to suspend a VM to a fixed value
+            (i.e., not computed based on amount of memory, enactment overhead, etc.)
+            """),
+
+     Option(name        = "override-resume-time",
+            getter      = "override-resume-time",
+            type        = OPTTYPE_INT,
+            required    = False,
+            default     = None,
+            doc         = """
+            Overrides the time it takes to suspend a VM to a fixed value
+            (i.e., not computed based on amount of memory, enactment overhead, etc.)
+            """),
+
      Option(name        = "force-scheduling-threshold",
             getter      = "force-scheduling-threshold",
             type        = OPTTYPE_TIMEDELTA,
@@ -398,15 +436,6 @@
             node where the images are stored.                
             """),
 
-     Option(name        = "suspendresume-rate",
-            getter      = "simul.suspendresume-rate",
-            type        = OPTTYPE_FLOAT,
-            required    = True,
-            doc         = """
-            Rate at which VMs are assumed to suspend (in MB of
-            memory per second)                
-            """),
-
      Option(name        = "stop-when",
             getter      = "stop-when",
             type        = OPTTYPE_STRING,
@@ -635,16 +664,6 @@
             doc         = """
             Location of OpenNebula "onevm" command.                
             """),
-
-     Option(name        = "suspendresume-rate-estimate",
-            getter      = "one.suspendresume-rate-estimate",
-            type        = OPTTYPE_FLOAT,
-            required    = False,
-            default     = 32,
-            doc         = """
-            Rate at which VMs are estimated to suspend (in MB of
-            memory per second)                
-            """),
             
      Option(name        = "stop-when-no-more-leases",
             getter      = "stop-when-no-more-leases",

Modified: trunk/src/haizea/resourcemanager/enact/opennebula.py
===================================================================
--- trunk/src/haizea/resourcemanager/enact/opennebula.py	2008-11-26 21:11:23 UTC (rev 549)
+++ trunk/src/haizea/resourcemanager/enact/opennebula.py	2008-12-04 23:09:18 UTC (rev 550)
@@ -34,7 +34,6 @@
         ResourcePoolInfo.__init__(self)
         config = get_config()
         self.logger = logging.getLogger("ENACT.ONE.INFO")
-        self.suspendresumerate = config.get("one.suspendresume-rate-estimate")
 
         # Get information about nodes from DB
         conn = sqlite.connect(config.get("one.db"))
@@ -77,9 +76,6 @@
                 (constants.RES_DISK, constants.RESTYPE_INT, "Disk"),
                 (constants.RES_NETIN, constants.RESTYPE_INT, "Net (in)"),
                 (constants.RES_NETOUT, constants.RESTYPE_INT, "Net (out)")]
-        
-    def get_suspendresume_rate(self):
-        return self.suspendresumerate
 
     def get_bandwidth(self):
         return 0
@@ -130,6 +126,10 @@
                 self.logger.debug("Command returned succesfully.")
             else:
                 raise Exception, "Error when running onevm shutdown (status=%i, output='%s')" % (status, output)
+            # TODO: We should spawn out a thread to do this, so Haizea isn't
+            # blocking until all these commands end
+            interval = get_config().get("enactment-overhead").seconds
+            sleep(interval)
 
     def suspend(self, action):
         for vnode in action.vnodes:

Modified: trunk/src/haizea/resourcemanager/enact/simulated.py
===================================================================
--- trunk/src/haizea/resourcemanager/enact/simulated.py	2008-11-26 21:11:23 UTC (rev 549)
+++ trunk/src/haizea/resourcemanager/enact/simulated.py	2008-12-04 23:09:18 UTC (rev 550)
@@ -28,7 +28,6 @@
         ResourcePoolInfo.__init__(self)
         self.logger = logging.getLogger("ENACT.SIMUL.INFO")
         config = get_config()
-        self.suspendresumerate = config.get("simul.suspendresume-rate")
                 
         numnodes = config.get("simul.nodes")
 
@@ -57,9 +56,6 @@
             resourcecapacity = r.split(",")[1]
             capacity.set_by_type(desc2type[resourcename], int(resourcecapacity))
         return capacity
-
-    def get_suspendresume_rate(self):
-        return self.suspendresumerate
     
     def get_migration_bandwidth(self):
         return 100 # TODO: Get from config file

Modified: trunk/src/haizea/resourcemanager/scheduler.py
===================================================================
--- trunk/src/haizea/resourcemanager/scheduler.py	2008-11-26 21:11:23 UTC (rev 549)
+++ trunk/src/haizea/resourcemanager/scheduler.py	2008-12-04 23:09:18 UTC (rev 550)
@@ -922,10 +922,10 @@
                 prev_end = t[1]
         
         return times
-
+    
     def __schedule_shutdown(self, vmrr):
         config = get_config()
-        shutdown_time = config.get("shutdown-time")
+        shutdown_time = self.__estimate_shutdown_time(vmrr.lease)
 
         start = vmrr.end - shutdown_time
         end = vmrr.end
@@ -946,7 +946,7 @@
         from haizea.resourcemanager.rm import ResourceManager
         config = ResourceManager.get_singleton().config
         susp_exclusion = config.get("suspendresume-exclusion")        
-        rate = self.resourcepool.info.get_suspendresume_rate()
+        rate = config.get("suspend-rate") 
 
         if suspend_by < vmrr.start or suspend_by > vmrr.end:
             raise SchedException, "Tried to schedule a suspension by %s, which is outside the VMRR's duration (%s-%s)" % (suspend_by, vmrr.start, vmrr.end)
@@ -988,7 +988,7 @@
         from haizea.resourcemanager.rm import ResourceManager
         config = ResourceManager.get_singleton().config
         resm_exclusion = config.get("suspendresume-exclusion")        
-        rate = self.resourcepool.info.get_suspendresume_rate()
+        rate = config.get("resume-rate") 
 
         if resume_at < vmrr.start or resume_at > vmrr.end:
             raise SchedException, "Tried to schedule a resumption at %s, which is outside the VMRR's duration (%s-%s)" % (resume_at, vmrr.start, vmrr.end)
@@ -1076,14 +1076,14 @@
             vmrr.pre_rrs.insert(0, migr_rr)
 
     def __compute_suspend_resume_time(self, mem, rate):
+        force = get_config().get("suspendresume-exclusion")
         time = float(mem) / rate
         time = round_datetime_delta(TimeDelta(seconds = time))
         return time
     
-    def __estimate_suspend_resume_time(self, lease):
+    def __estimate_suspend_resume_time(self, lease, rate):
         susp_exclusion = get_config().get("suspendresume-exclusion")        
         enactment_overhead = get_config().get("enactment-overhead") 
-        rate = self.resourcepool.info.get_suspendresume_rate()
         mem = lease.requested_resources.get_by_type(constants.RES_MEM)
         if susp_exclusion == constants.SUSPRES_EXCLUSION_GLOBAL:
             return lease.numnodes * (self.__compute_suspend_resume_time(mem, rate) + enactment_overhead)
@@ -1092,14 +1092,24 @@
             return lease.numnodes * (self.__compute_suspend_resume_time(mem, rate) + enactment_overhead)
 
     def __estimate_shutdown_time(self, lease):
-        # Always uses fixed value in configuration file
-        return get_config().get("shutdown-time")
+        enactment_overhead = get_config().get("enactment-overhead").seconds
+        return get_config().get("shutdown-time") + (enactment_overhead * lease.numnodes)
 
     def __estimate_suspend_time(self, lease):
-        return self.__estimate_suspend_resume_time(lease)
+        rate = get_config().get("suspend-rate")
+        override = get_config().get("override-suspend-time")
+        if override != None:
+            return override
+        else:
+            return self.__estimate_suspend_resume_time(lease, rate)
 
     def __estimate_resume_time(self, lease):
-        return self.__estimate_suspend_resume_time(lease)
+        rate = get_config().get("resume-rate") 
+        override = get_config().get("override-resume-time")
+        if override != None:
+            return override
+        else:
+            return self.__estimate_suspend_resume_time(lease, rate)
 
 
     def __estimate_migration_time(self, lease):



More information about the Haizea-commit mailing list