Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
merge the HL13 VM model into the main VirtualMachine class
authorMartin Quinson <martin.quinson@loria.fr>
Wed, 31 Aug 2016 19:38:42 +0000 (21:38 +0200)
committerMartin Quinson <martin.quinson@loria.fr>
Wed, 31 Aug 2016 19:38:46 +0000 (21:38 +0200)
- that's the only model, and I don't see no alternative solution here
- The goal with that part of the code is to make a plugin out of it,
  to let the users have the whole VM implementation in one file only,
  that they can modify completely.

src/surf/virtual_machine.cpp
src/surf/virtual_machine.hpp
src/surf/vm_hl13.cpp [deleted file]
src/surf/vm_hl13.hpp [deleted file]
tools/cmake/DefinePackages.cmake

index dfb0d1a..13b0e67 100644 (file)
@@ -13,9 +13,17 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_vm, surf, "Logging specific to the SURF VM
 
 simgrid::surf::VMModel *surf_vm_model = nullptr;
 
+void surf_vm_model_init_HL13(){
+  if (surf_cpu_model_vm) {
+    surf_vm_model = new simgrid::surf::VMModel();
+    all_existing_models->push_back(surf_vm_model);
+  }
+}
+
 namespace simgrid {
 namespace surf {
 
+
 /*************
  * Callbacks *
  *************/
@@ -30,17 +38,108 @@ simgrid::xbt::signal<void(simgrid::surf::VirtualMachine*)> onVmStateChange;
 
 std::deque<VirtualMachine*> VirtualMachine::allVms_;
 
+s4u::Host *VMModel::createVM(const char *name, sg_host_t host_PM)
+{
+  VirtualMachine* vm = new VirtualMachine(this, name, host_PM);
+  onVmCreation(vm);
+  return vm->piface_;
+}
+
+/* In the real world, processes on the guest operating system will be somewhat degraded due to virtualization overhead.
+ * The total CPU share these processes get is smaller than that of the VM process gets on a host operating system. */
+// const double virt_overhead = 0.95;
+const double virt_overhead = 1;
+
+double VMModel::next_occuring_event(double now)
+{
+  /* TODO: update action's cost with the total cost of processes on the VM. */
+
+  /* 1. Now we know how many resource should be assigned to each virtual
+   * machine. We update constraints of the virtual machine layer.
+   *
+   * If we have two virtual machine (VM1 and VM2) on a physical machine (PM1).
+   *     X1 + X2 = C       (Equation 1)
+   * where
+   *    the resource share of VM1: X1
+   *    the resource share of VM2: X2
+   *    the capacity of PM1: C
+   *
+   * Then, if we have two process (P1 and P2) on VM1.
+   *     X1_1 + X1_2 = X1  (Equation 2)
+   * where
+   *    the resource share of P1: X1_1
+   *    the resource share of P2: X1_2
+   *    the capacity of VM1: X1
+   *
+   * Equation 1 was solved in the physical machine layer.
+   * Equation 2 is solved in the virtual machine layer (here).
+   * X1 must be passed to the virtual machine laye as a constraint value.
+   **/
+
+  /* iterate for all virtual machines */
+  for (VirtualMachine *ws_vm : VirtualMachine::allVms_) {
+    Cpu *cpu = ws_vm->cpu_;
+    xbt_assert(cpu, "cpu-less host");
+
+    double solved_value = ws_vm->action_->getVariable()->value;
+    XBT_DEBUG("assign %f to vm %s @ pm %s", solved_value, ws_vm->getName(), ws_vm->getPm()->name().c_str());
+
+    // TODO: check lmm_update_constraint_bound() works fine instead of the below manual substitution.
+    // cpu_cas01->constraint->bound = solved_value;
+    xbt_assert(cpu->getModel() == surf_cpu_model_vm);
+    lmm_system_t vcpu_system = cpu->getModel()->getMaxminSystem();
+    lmm_update_constraint_bound(vcpu_system, cpu->getConstraint(), virt_overhead * solved_value);
+  }
+
+  /* 2. Calculate resource share at the virtual machine layer. */
+  adjustWeightOfDummyCpuActions();
+
+  /* 3. Ready. Get the next occuring event */
+  return surf_cpu_model_vm->next_occuring_event(now);
+}
+
+
 /************
  * Resource *
  ************/
 
-VirtualMachine::VirtualMachine(HostModel *model, const char *name, simgrid::s4u::Host *hostPM)
+VirtualMachine::VirtualMachine(HostModel *model, const char *name, simgrid::s4u::Host *host_PM)
 : HostImpl(model, name, nullptr, nullptr, nullptr)
-, hostPM_(hostPM)
+, hostPM_(host_PM)
 {
+  /* Register this VM to the list of all VMs */
   allVms_.push_back(this);
   piface_ = simgrid::s4u::Host::by_name_or_create(name);
   piface_->extension_set<simgrid::surf::HostImpl>(this);
+
+  /* Currently, we assume a VM has no storage. */
+  storage_ = nullptr;
+
+  /* Currently, a VM uses the network resource of its physical host. In
+   * host_lib, this network resource object is referred from two different keys.
+   * When deregistering the reference that points the network resource object
+   * from the VM name, we have to make sure that the system does not call the
+   * free callback for the network resource object. The network resource object
+   * is still used by the physical machine. */
+  sg_host_t host_VM = simgrid::s4u::Host::by_name_or_create(name);
+  host_VM->pimpl_netcard = host_PM->pimpl_netcard;
+
+  vmState_ = SURF_VM_STATE_CREATED;
+
+  // //// CPU  RELATED STUFF ////
+  // Roughly, create a vcpu resource by using the values of the sub_cpu one.
+  CpuCas01 *sub_cpu = dynamic_cast<CpuCas01*>(host_PM->pimpl_cpu);
+
+  cpu_ = surf_cpu_model_vm->createCpu(host_VM, // the machine hosting the VM
+      sub_cpu->getSpeedPeakList(), 1 /*cores*/);
+  if (sub_cpu->getPState() != 0)
+    cpu_->setPState(sub_cpu->getPState());
+
+  /* We create cpu_action corresponding to a VM process on the host operating system. */
+  /* FIXME: TODO: we have to periodically input GUESTOS_NOISE to the system? how ? */
+  action_ = sub_cpu->execution_start(0);
+
+  XBT_VERB("Create VM(%s)@PM(%s) with %ld mounted disks", name, hostPM_->name().c_str(), xbt_dynar_length(storage_));
 }
 
 /*
@@ -54,6 +153,8 @@ VirtualMachine::~VirtualMachine()
   /* Free the cpu_action of the VM. */
   XBT_ATTRIB_UNUSED int ret = action_->unref();
   xbt_assert(ret == 1, "Bug: some resource still remains");
+
+  delete cpu_;
 }
 
 e_surf_vm_state_t VirtualMachine::getState() {
@@ -106,5 +207,50 @@ sg_host_t VirtualMachine::getPm() {
   return hostPM_;
 }
 
+/* Update the physical host of the given VM */
+void VirtualMachine::migrate(sg_host_t host_dest)
+{
+   HostImpl *surfHost_dst = host_dest->extension<HostImpl>();
+   const char *vm_name = getName();
+   const char *pm_name_src = hostPM_->name().c_str();
+   const char *pm_name_dst = surfHost_dst->getName();
+
+   /* update net_elm with that of the destination physical host */
+   sg_host_by_name(vm_name)->pimpl_netcard = sg_host_by_name(pm_name_dst)->pimpl_netcard;
+
+   hostPM_ = host_dest;
+
+   /* Update vcpu's action for the new pm */
+   {
+     /* create a cpu action bound to the pm model at the destination. */
+     CpuAction *new_cpu_action = static_cast<CpuAction*>(host_dest->pimpl_cpu->execution_start(0));
+
+     Action::State state = action_->getState();
+     if (state != Action::State::done)
+       XBT_CRITICAL("FIXME: may need a proper handling, %d", static_cast<int>(state));
+     if (action_->getRemainsNoUpdate() > 0)
+       XBT_CRITICAL("FIXME: need copy the state(?), %f", action_->getRemainsNoUpdate());
+
+     /* keep the bound value of the cpu action of the VM. */
+     double old_bound = action_->getBound();
+     if (old_bound != 0) {
+       XBT_DEBUG("migrate VM(%s): set bound (%f) at %s", vm_name, old_bound, pm_name_dst);
+       new_cpu_action->setBound(old_bound);
+     }
+
+     XBT_ATTRIB_UNUSED int ret = action_->unref();
+     xbt_assert(ret == 1, "Bug: some resource still remains");
+
+     action_ = new_cpu_action;
+   }
+
+   XBT_DEBUG("migrate VM(%s): change PM (%s to %s)", vm_name, pm_name_src, pm_name_dst);
+}
+
+void VirtualMachine::setBound(double bound){
+ action_->setBound(bound);
+}
+
+
 }
 }
index 0bdad3a..d3aee1a 100644 (file)
@@ -72,12 +72,12 @@ public:
   virtual void restore();
 
   /** @brief Migrate the VM to the destination host */
-  virtual void migrate(sg_host_t dest_PM)=0;
+  virtual void migrate(sg_host_t dest_PM);
 
   /** @brief Get the physical machine hosting the VM */
   sg_host_t getPm();
 
-  virtual void setBound(double bound)=0;
+  virtual void setBound(double bound);
 
   /* The vm object of the lower layer */
   CpuAction *action_ = nullptr;
@@ -105,8 +105,8 @@ protected:
  */
 class VMModel : public HostModel {
 public:
-  VMModel() :HostModel(){}
-  ~VMModel(){};
+  VMModel() :HostModel() {}
+  ~VMModel() = default;
 
   /**
    * @brief Create a new VM
@@ -114,8 +114,12 @@ public:
    * @param name The name of the new VM
    * @param host_PM The real machine hosting the VM
    */
-  virtual s4u::Host *createVM(const char *name, sg_host_t host_PM)=0;
+  s4u::Host *createVM(const char *name, sg_host_t host_PM);
   void adjustWeightOfDummyCpuActions() {};
+
+  double next_occuring_event(double now) override;
+  void updateActionsState(double /*now*/, double /*delta*/) {};
+
 };
 
 }
diff --git a/src/surf/vm_hl13.cpp b/src/surf/vm_hl13.cpp
deleted file mode 100644 (file)
index 41b183d..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-/* Copyright (c) 2013-2015. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <simgrid/host.h>
-
-#include "cpu_cas01.hpp"
-#include "vm_hl13.hpp"
-
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_vm);
-
-void surf_vm_model_init_HL13(){
-  if (surf_cpu_model_vm) {
-    surf_vm_model = new simgrid::surf::VMHL13Model();
-    all_existing_models->push_back(surf_vm_model);
-  }
-}
-
-namespace simgrid {
-namespace surf {
-
-/*********
- * Model *
- *********/
-VMHL13Model::VMHL13Model() : VMModel() {}
-
-void VMHL13Model::updateActionsState(double /*now*/, double /*delta*/) {}
-
-s4u::Host *VMHL13Model::createVM(const char *name, sg_host_t host_PM)
-{
-  VirtualMachine* vm = new VMHL13(this, name, host_PM);
-  onVmCreation(vm);
-  return vm->piface_;
-}
-
-/* In the real world, processes on the guest operating system will be somewhat degraded due to virtualization overhead.
- * The total CPU share these processes get is smaller than that of the VM process gets on a host operating system. */
-// const double virt_overhead = 0.95;
-const double virt_overhead = 1;
-
-double VMHL13Model::next_occuring_event(double now)
-{
-  /* TODO: update action's cost with the total cost of processes on the VM. */
-
-  /* 1. Now we know how many resource should be assigned to each virtual
-   * machine. We update constraints of the virtual machine layer.
-   *
-   * If we have two virtual machine (VM1 and VM2) on a physical machine (PM1).
-   *     X1 + X2 = C       (Equation 1)
-   * where
-   *    the resource share of VM1: X1
-   *    the resource share of VM2: X2
-   *    the capacity of PM1: C
-   *
-   * Then, if we have two process (P1 and P2) on VM1.
-   *     X1_1 + X1_2 = X1  (Equation 2)
-   * where
-   *    the resource share of P1: X1_1
-   *    the resource share of P2: X1_2
-   *    the capacity of VM1: X1
-   *
-   * Equation 1 was solved in the physical machine layer.
-   * Equation 2 is solved in the virtual machine layer (here).
-   * X1 must be passed to the virtual machine laye as a constraint value.
-   **/
-
-  /* iterate for all virtual machines */
-  for (VirtualMachine *ws_vm : VirtualMachine::allVms_) {
-    Cpu *cpu = ws_vm->cpu_;
-    xbt_assert(cpu, "cpu-less host");
-
-    double solved_value = ws_vm->action_->getVariable()->value;
-    XBT_DEBUG("assign %f to vm %s @ pm %s", solved_value, ws_vm->getName(), ws_vm->getPm()->name().c_str());
-
-    // TODO: check lmm_update_constraint_bound() works fine instead of the below manual substitution.
-    // cpu_cas01->constraint->bound = solved_value;
-    xbt_assert(cpu->getModel() == surf_cpu_model_vm);
-    lmm_system_t vcpu_system = cpu->getModel()->getMaxminSystem();
-    lmm_update_constraint_bound(vcpu_system, cpu->getConstraint(), virt_overhead * solved_value);
-  }
-
-  /* 2. Calculate resource share at the virtual machine layer. */
-  adjustWeightOfDummyCpuActions();
-
-  /* 3. Ready. Get the next occuring event */
-  return surf_cpu_model_vm->next_occuring_event(now);
-}
-
-/************
- * Resource *
- ************/
-VMHL13::VMHL13(VMModel *model, const char* name, sg_host_t host_PM)
- : VirtualMachine(model, name, host_PM)
-{
-  /* Currently, we assume a VM has no storage. */
-  storage_ = nullptr;
-
-  /* Currently, a VM uses the network resource of its physical host. In
-   * host_lib, this network resource object is referred from two different keys.
-   * When deregistering the reference that points the network resource object
-   * from the VM name, we have to make sure that the system does not call the
-   * free callback for the network resource object. The network resource object
-   * is still used by the physical machine. */
-  sg_host_t host_VM = simgrid::s4u::Host::by_name_or_create(name);
-  host_VM->pimpl_netcard = host_PM->pimpl_netcard;
-
-  vmState_ = SURF_VM_STATE_CREATED;
-
-  // //// CPU  RELATED STUFF ////
-  // Roughly, create a vcpu resource by using the values of the sub_cpu one.
-  CpuCas01 *sub_cpu = dynamic_cast<CpuCas01*>(host_PM->pimpl_cpu);
-
-  cpu_ = surf_cpu_model_vm->createCpu(host_VM, // the machine hosting the VM
-      sub_cpu->getSpeedPeakList(), 1 /*cores*/);
-  if (sub_cpu->getPState() != 0)
-    cpu_->setPState(sub_cpu->getPState());
-
-  /* We create cpu_action corresponding to a VM process on the host operating system. */
-  /* FIXME: TODO: we have to periodically input GUESTOS_NOISE to the system? how ? */
-  action_ = sub_cpu->execution_start(0);
-
-  XBT_VERB("Create VM(%s)@PM(%s) with %ld mounted disks", name, hostPM_->name().c_str(), xbt_dynar_length(storage_));
-}
-VMHL13::~VMHL13() {
-  delete cpu_;
-}
-
-
-/* Update the physical host of the given VM */
-void VMHL13::migrate(sg_host_t host_dest)
-{
-   HostImpl *surfHost_dst = host_dest->extension<HostImpl>();
-   const char *vm_name = getName();
-   const char *pm_name_src = hostPM_->name().c_str();
-   const char *pm_name_dst = surfHost_dst->getName();
-
-   /* update net_elm with that of the destination physical host */
-   sg_host_by_name(vm_name)->pimpl_netcard = sg_host_by_name(pm_name_dst)->pimpl_netcard;
-
-   hostPM_ = host_dest;
-
-   /* Update vcpu's action for the new pm */
-   {
-     /* create a cpu action bound to the pm model at the destination. */
-     CpuAction *new_cpu_action = static_cast<CpuAction*>(host_dest->pimpl_cpu->execution_start(0));
-
-     Action::State state = action_->getState();
-     if (state != Action::State::done)
-       XBT_CRITICAL("FIXME: may need a proper handling, %d", static_cast<int>(state));
-     if (action_->getRemainsNoUpdate() > 0)
-       XBT_CRITICAL("FIXME: need copy the state(?), %f", action_->getRemainsNoUpdate());
-
-     /* keep the bound value of the cpu action of the VM. */
-     double old_bound = action_->getBound();
-     if (old_bound != 0) {
-       XBT_DEBUG("migrate VM(%s): set bound (%f) at %s", vm_name, old_bound, pm_name_dst);
-       new_cpu_action->setBound(old_bound);
-     }
-
-     XBT_ATTRIB_UNUSED int ret = action_->unref();
-     xbt_assert(ret == 1, "Bug: some resource still remains");
-
-     action_ = new_cpu_action;
-   }
-
-   XBT_DEBUG("migrate VM(%s): change PM (%s to %s)", vm_name, pm_name_src, pm_name_dst);
-}
-
-void VMHL13::setBound(double bound){
- action_->setBound(bound);
-}
-
-}
-}
diff --git a/src/surf/vm_hl13.hpp b/src/surf/vm_hl13.hpp
deleted file mode 100644 (file)
index e50883a..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Copyright (c) 2013-2015. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/base.h"
-
-#include "host_clm03.hpp"
-#include "virtual_machine.hpp"
-
-#ifndef SURF_VM_HPP_
-#define SURF_VM_HPP_
-
-#define GUESTOS_NOISE 100 // This value corresponds to the cost of the global action associated to the VM
-                          // It corresponds to the cost of a VM running no tasks.
-
-namespace simgrid {
-namespace surf {
-
-/***********
- * Classes *
- ***********/
-
-class XBT_PRIVATE VMHL13Model;
-class XBT_PRIVATE VMHL13;
-
-/*********
- * Model *
- *********/
-class VMHL13Model : public VMModel {
-public:
-  VMHL13Model();
-  ~VMHL13Model(){};
-
-  s4u::Host *createVM(const char *name, sg_host_t host_PM) override;
-  double next_occuring_event(double now) override;
-  void adjustWeightOfDummyCpuActions() override {};
-  void updateActionsState(double /*now*/, double /*delta*/) override;
-};
-
-/************
- * Resource *
- ************/
-
-class VMHL13 : public VirtualMachine {
-public:
-  VMHL13(VMModel *model, const char* name, sg_host_t host_PM);
-  ~VMHL13();
-
-  void migrate(sg_host_t ind_dst_pm) override;
-  void setBound(double bound) override;
-};
-
-/**********
- * Action *
- **********/
-
-}
-}
-
-#endif /* SURF_VM_HPP_ */
index f834d07..d2d4821 100644 (file)
@@ -79,7 +79,6 @@ set(EXTRA_DIST
   src/surf/surf_interface.hpp
   src/surf/surf_private.h
   src/surf/surf_routing.hpp
-  src/surf/vm_hl13.hpp
   src/surf/PropertyHolder.hpp
   src/surf/virtual_machine.hpp
   src/surf/host_clm03.hpp
@@ -330,7 +329,6 @@ set(SURF_SRC
   src/surf/xml/surfxml_parseplatf.cpp
   src/surf/trace_mgr.hpp
   src/surf/trace_mgr.cpp
-  src/surf/vm_hl13.cpp
   src/surf/virtual_machine.cpp
   src/surf/host_clm03.cpp
   src/surf/HostImpl.cpp