From: Wolfgang Bumiller <w.bumil...@proxmox.com> Signed-off-by: Wolfgang Bumiller <w.bumil...@proxmox.com> --- src/PVE/LXC/CGroup.pm | 66 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+)
diff --git a/src/PVE/LXC/CGroup.pm b/src/PVE/LXC/CGroup.pm index b3e31c0..8261748 100644 --- a/src/PVE/LXC/CGroup.pm +++ b/src/PVE/LXC/CGroup.pm @@ -343,4 +343,70 @@ sub change_memory_limit { die "trying to change memory cgroup values: container not running\n"; } +# Change the cpu quota for a container. +# +# Dies on error (including a not-running or currently-shutting-down guest). +sub change_cpu_quota { + my ($self, $quota, $period) = @_; + + die "quota without period not allowed\n" if !defined($period) && defined($quota); + + if (cgroup_mode() == 2) { + if (defined(my $path = $self->get_path('cpu'))) { + # cgroupv2 environment, an undefined (unlimited) quota is defined as "max" + # in this interface: + $quota //= 'max'; # unlimited + if (defined($quota)) { + PVE::ProcFSTools::write_proc_entry("$path/cpu.max", "$quota $period"); + } else { + # we're allowed to only write the quota: + PVE::ProcFSTools::write_proc_entry("$path/cpu.max", 'max'); + } + return 1; + } + } elsif (defined(my $path = $self->get_path('cpu'))) { + $quota //= -1; # unlimited + $period //= -1; + PVE::ProcFSTools::write_proc_entry("$path/cpu.cfs_period_us", $period); + PVE::ProcFSTools::write_proc_entry("$path/cpu.cfs_quota_us", $quota); + return 1; + } + + die "trying to change cpu quota cgroup values: container not running\n"; +} + +# Change the cpu "shares" for a container. +# +# In cgroupv1 we used a value in `[0..500000]` with a default of 1024. +# +# In cgroupv2 we do not have "shares", we have "weights" in the range +# of `[1..10000]` with a default of 100. +# +# Since the default values don't match when scaling linearly, we use the +# values we get as-is and simply error for values >10000 in cgroupv2. +# +# It is left to the user to figure this out for now. +# +# Dies on error (including a not-running or currently-shutting-down guest). +sub change_cpu_shares { + my ($self, $shares, $cgroupv1_default) = @_; + + if (cgroup_mode() == 2) { + if (defined(my $path = $self->get_path('cpu'))) { + # the cgroupv2 documentation defines the default to 100 + $shares //= 100; + die "cpu weight (shares) must be in range [1, 10000]\n" if $shares < 1 || $shares > 10000; + PVE::ProcFSTools::write_proc_entry("$path/cpu.weight", $shares); + return 1; + } + } elsif (defined(my $path = $self->get_path('cpu'))) { + $shares //= 100; + PVE::ProcFSTools::write_proc_entry("$path/cpu.shares", $shares // $cgroupv1_default); + return 1; + } + + # container most likely isn't running + die "trying to change cpu shares/weight cgroup values: container not running\n"; +} + 1; -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel