public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [pve-devel] [PATCH pve-container] pct: fix cpu load calculation on command line
@ 2023-07-18 11:58 Philipp Hufnagl
  2023-07-18 12:00 ` Philipp Hufnagl
  0 siblings, 1 reply; 4+ messages in thread
From: Philipp Hufnagl @ 2023-07-18 11:58 UTC (permalink / raw)
  To: pve-devel

 When called from the command line, it was not possible to calculate
 cpu load because there was no 2nd data point available for the
 calculation. Now (when called) from the command line, cpu stats will
 be fetched twice with a minimum delta of 20ms. That way the load can
 be calculated

fixes #4765

Signed-off-by: Philipp Hufnagl <p.hufnagl@proxmox.com>
---
 src/PVE/CLI/pct.pm |  4 ++--
 src/PVE/LXC.pm     | 32 +++++++++++++++++++++++++++++---
 2 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/src/PVE/CLI/pct.pm b/src/PVE/CLI/pct.pm
index ff75d33..e531b27 100755
--- a/src/PVE/CLI/pct.pm
+++ b/src/PVE/CLI/pct.pm
@@ -60,8 +60,8 @@ __PACKAGE__->register_method ({
 
 	# test if CT exists
 	my $conf = PVE::LXC::Config->load_config ($param->{vmid});
-
-	my $vmstatus = PVE::LXC::vmstatus($param->{vmid});
+	# workaround to get cpu usage is to fetch cpu stats twice with a delay
+	my $vmstatus = PVE::LXC::vmstatus($param->{vmid}, 20);
 	my $stat = $vmstatus->{$param->{vmid}};
 	if ($param->{verbose}) {
 	    foreach my $k (sort (keys %$stat)) {
diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm
index a531ea5..9fc171f 100644
--- a/src/PVE/LXC.pm
+++ b/src/PVE/LXC.pm
@@ -12,7 +12,7 @@ use IO::Poll qw(POLLIN POLLHUP);
 use IO::Socket::UNIX;
 use POSIX qw(EINTR);
 use Socket;
-use Time::HiRes qw (gettimeofday);
+use Time::HiRes qw (gettimeofday usleep);
 
 use PVE::AccessControl;
 use PVE::CGroup;
@@ -171,11 +171,37 @@ our $vmstatus_return_properties = {
     }
 };
 
+sub get_first_cpu {
+    my ($list, $measure_timespan_ms) = @_;
+    my $cdtime = gettimeofday;
+
+    foreach my $vmid (keys %$list) {
+	my $cgroups = PVE::LXC::CGroup->new($vmid);
+	if (defined(my $cpu = $cgroups->get_cpu_stat())) {
+	    # Total time (in milliseconds) used up by the cpu.
+	    my $used_ms = $cpu->{utime} + $cpu->{stime};
+	    $last_proc_vmid_stat->{$vmid} = {
+		time => $cdtime,
+		used => $used_ms,
+		cpu => 0,
+	    };
+	}
+    }
+    usleep($measure_timespan_ms * 1000);
+}
+
 sub vmstatus {
-    my ($opt_vmid) = @_;
+    my ($opt_vmid, $measure_timespan_ms) = @_;
 
     my $list = $opt_vmid ? { $opt_vmid => { type => 'lxc', vmid => int($opt_vmid) }} : config_list();
 
+    if (defined($measure_timespan_ms))
+    {
+	get_first_cpu($list, $measure_timespan_ms);
+    }
+
+    $measure_timespan_ms //= 1000;
+
     my $active_hash = list_active_containers();
 
     my $cpucount = $cpuinfo->{cpus} || 1;
@@ -285,7 +311,7 @@ sub vmstatus {
 	    }
 
 	    my $delta_ms = ($cdtime - $old->{time}) * $cpucount * 1000.0;
-	    if ($delta_ms > 1000.0) {
+	    if ($delta_ms > $measure_timespan_ms) {
 		my $delta_used_ms = $used_ms - $old->{used};
 		$d->{cpu} = (($delta_used_ms / $delta_ms) * $cpucount) / $d->{cpus};
 		$last_proc_vmid_stat->{$vmid} = {
-- 
2.39.2





^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-07-18 13:48 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-07-18 11:58 [pve-devel] [PATCH pve-container] pct: fix cpu load calculation on command line Philipp Hufnagl
2023-07-18 12:00 ` Philipp Hufnagl
2023-07-18 13:02   ` Thomas Lamprecht
2023-07-18 13:48     ` Philipp Hufnagl

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal