From 48216ca9553f32e48e23f7d4dbe77874f32295d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Gonz=C3=A1lez?= Date: Thu, 14 May 2020 17:21:31 +0200 Subject: [PATCH] F #4089: add CPU limitations --- src/vmm_mad/remotes/firecracker/deploy | 2 ++ src/vmm_mad/remotes/firecracker/firecrackerrc | 5 +++++ .../remotes/lib/firecracker/microvm.rb | 22 +++++++++++++++++++ .../remotes/lib/firecracker/opennebula_vm.rb | 9 ++++++-- 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/vmm_mad/remotes/firecracker/deploy b/src/vmm_mad/remotes/firecracker/deploy index e3b30aa146..c9501cd884 100755 --- a/src/vmm_mad/remotes/firecracker/deploy +++ b/src/vmm_mad/remotes/firecracker/deploy @@ -54,6 +54,8 @@ end # Start VNC (only started if necessary) microvm.vnc('start') +# Set cpu.shares (only if configured) +microvm.set_cpu_limit # Set deploy_id puts "one-#{vm_id}" diff --git a/src/vmm_mad/remotes/firecracker/firecrackerrc b/src/vmm_mad/remotes/firecracker/firecrackerrc index 28ce2fe537..df99b25bac 100644 --- a/src/vmm_mad/remotes/firecracker/firecrackerrc +++ b/src/vmm_mad/remotes/firecracker/firecrackerrc @@ -58,6 +58,11 @@ # # Timeout to wait a cgroup to be empty after shutdown/cancel a microVM :cgroup_delete_timeout: 60 +# +# If true the cpu.shares will be set acording to the VM CPU value if false the +# cpu.shares is left by default which means that all the resources are shared +# equally acrros the VMs +:cgroup_cpu_shares: true ################################################################################ # NUMA placement Options diff --git a/src/vmm_mad/remotes/lib/firecracker/microvm.rb b/src/vmm_mad/remotes/lib/firecracker/microvm.rb index b334e99b23..b58d24844e 100644 --- a/src/vmm_mad/remotes/lib/firecracker/microvm.rb +++ b/src/vmm_mad/remotes/lib/firecracker/microvm.rb @@ -148,6 +148,18 @@ class MicroVM rescue Errno::ENOENT # rubocop:disable Lint/SuppressedException end + def cpu_shares(cpu) + # default value for cpu.shares + default_value = 1024 + + shares_val = (cpu * default_value).round + + # The value specified in the cpu.shares file must be 2 or higher. + shares_val = 2 if shares_val < 2 + + shares_val + end + #--------------------------------------------------------------------------- # VNC #--------------------------------------------------------------------------- @@ -253,4 +265,14 @@ class MicroVM # rubocop:enable Naming/AccessorMethodName # rubocop:enable Layout/LineLength + def set_cpu_limit + return unless @one.fcrc[:cgroup_cpu_shares] + + shares_location = "#{@one.fcrc[:cgroup_location]}/cpu/" \ + "firecracker/one-#{@one.vm_id}/cpu.shares" + + cmd = "echo #{cpu_shares(@one.get_cpu)} > #{shares_location}" + `echo "AAA#{Command.execute_once(cmd, false)}" > /tmp/a` + end + end diff --git a/src/vmm_mad/remotes/lib/firecracker/opennebula_vm.rb b/src/vmm_mad/remotes/lib/firecracker/opennebula_vm.rb index 5f1016a1c5..fabbe7f841 100644 --- a/src/vmm_mad/remotes/lib/firecracker/opennebula_vm.rb +++ b/src/vmm_mad/remotes/lib/firecracker/opennebula_vm.rb @@ -99,6 +99,10 @@ class OpenNebulaVM @vm_name && !@vm_name.include?('one-') end + def get_cpu + Float(@xml['//TEMPLATE/CPU']) + end + # Returns a Hash representing the LXC configuration for this OpenNebulaVM def to_fc fc = {} @@ -127,9 +131,10 @@ class OpenNebulaVM end #--------------------------------------------------------------------------- - # Container Attribute Mapping + # MicroVM Attribute Mapping #--------------------------------------------------------------------------- - # Creates a dictionary for Firecracker containing $MEMORY RAM allocated + # Creates a dictionary for Firecracker containing vm information + def boot_source(hash) hash['kernel_image_path'] = 'kernel' hash['boot_args'] = @boot_args