]> git.proxmox.com Git - pve-container.git/commitdiff
fix bug #770: CPU usage stats for containers
authorWolfgang Link <w.link@proxmox.com>
Thu, 29 Oct 2015 12:11:07 +0000 (13:11 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Thu, 29 Oct 2015 12:25:06 +0000 (13:25 +0100)
debian/changelog
src/PVE/LXC.pm

index d2c4be02d0c43e522cb1b876d4e6abc0d5be0f5b..6732ba419564a963df3c62a6436c25929875bdaf 100644 (file)
@@ -1,3 +1,11 @@
+pve-container (1.0-17) unstable; urgency=medium
+
+  * fix bug #770: CPU usage stats for containers
+  
+  * added symlink testcase
+
+ -- Proxmox Support Team <support@proxmox.com>  Thu, 29 Oct 2015 13:09:29 +0100
+
 pve-container (1.0-16) unstable; urgency=medium
 
   * fix bug #770: implement Network stats for containers
index 0fd2ec8535754c40b90d866337e36432217aab1e..e3160e48bb4c3e9faf5981218fdd9ea4c44dddb2 100644 (file)
@@ -18,11 +18,14 @@ use PVE::Tools qw($IPV6RE $IPV4RE dir_glob_foreach);
 use PVE::Network;
 use PVE::AccessControl;
 use PVE::ProcFSTools;
+use Time::HiRes qw (gettimeofday);
 
 use Data::Dumper;
 
 my $nodename = PVE::INotify::nodename();
 
+my $cpuinfo= PVE::ProcFSTools::read_cpuinfo();
+
 cfs_register_file('/lxc/', \&parse_pct_config, \&write_pct_config);
 
 my $rootfs_desc = {
@@ -761,6 +764,25 @@ sub get_container_disk_usage {
     return $res;
 }
 
+my $last_proc_vmid_stat;
+
+my $parse_cpuacct_stat = sub {
+    my ($vmid) = @_;
+
+    my $raw = read_cgroup_value('cpuacct', $vmid, 'cpuacct.stat', 1);
+
+    my $stat = {};
+
+    if ($raw =~ m/^user (\d+)\nsystem (\d+)\n/) {
+
+       $stat->{utime} = $1;
+       $stat->{stime} = $2;
+
+    }
+
+    return $stat;
+};
+
 sub vmstatus {
     my ($opt_vmid) = @_;
 
@@ -768,6 +790,12 @@ sub vmstatus {
 
     my $active_hash = list_active_containers();
 
+    my $cpucount = $cpuinfo->{cpus} || 1;
+
+    my $cdtime = gettimeofday;
+
+    my $uptime = (PVE::ProcFSTools::read_proc_uptime(1))[0];
+
     foreach my $vmid (keys %$list) {
        my $d = $list->{$vmid};
 
@@ -834,6 +862,35 @@ sub vmstatus {
                $d->{diskwrite} = $2 if $key eq 'Write';
            }
        }
+
+       my $pstat = &$parse_cpuacct_stat($vmid);
+
+       my $used = $pstat->{utime} + $pstat->{stime};
+
+       my $old = $last_proc_vmid_stat->{$vmid};
+       if (!$old) {
+           $last_proc_vmid_stat->{$vmid} = {
+               time => $cdtime,
+               used => $used,
+               cpu => 0,
+           };
+           next;
+       }
+
+       my $dtime = ($cdtime -  $old->{time}) * $cpucount * $cpuinfo->{user_hz};
+
+       if ($dtime > 1000) {
+           my $dutime = $used -  $old->{used};
+
+           $d->{cpu} = (($dutime/$dtime)* $cpucount) / $d->{cpus};
+           $last_proc_vmid_stat->{$vmid} = {
+               time => $cdtime,
+               used => $used,
+               cpu => $d->{cpu},
+           };
+       } else {
+           $d->{cpu} = $old->{cpu};
+       }
     }
 
     my $netdev = PVE::ProcFSTools::read_proc_net_dev();