Sorry forgott to tag as v2
On 7/18/23 13:58, Philipp Hufnagl wrote:
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.hufn...@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} = {
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel