[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-users] Monitoring domU resource usage



On Wed, 8 Jun 2005, Andy Smith wrote:

> Using 2.0-testing, what methods are people using to monitor
> individual domU CPU usage?
>
> Obviously I can run an snmpd in each domU and see how busy the CPU
> is, but that could be tampered with from inside the domU, and as the
> domU doesn't know it doesn't have the whole cpu needs some
> interpretation.
>
> I can see CPU time used in "xm list" but that looks like rather a
> blunt tool - would I have to do something like this for example:

AFAIK, from what you describe you don't have much choice, you are going to
have to watch from _both_ the inside and the outside. I guess you might be
able to guess which domU is requesting CPU if the total CPU on the box
goes to 100%.

I have a script that polls xm list ever 60 seconds and logs the results.
>From this I can get a feeling for what % of the CPU is being consumed and
which dom is using it...

e.g.

[root@xen1 ~]# more ~tbrown/uptime.log.xen
Wed Jun  8 00:00:01 PDT 2005
  Domain-0  2.48% cpu usage  102461.38 sec over 47.91 days
domain-dns 16.91% cpu usage  501043.99 sec over 34.30 days
   mailman  0.70% cpu usage  6938.28 sec over 11.53 days
        mx 27.56% cpu usage  605861.02 sec over 25.44 days

  1   7   1  20  68
  1  11   2  27  55
  3  96   0  35 -36
  2  48   0  26  21
  1   8   0  32  56
  1   5   0  31  60
  2   6   0  38  51
  1  12   0  21  64
  2  13   0  34  49
  2  21   0  36  37
  1   8   0  31  57
  2  14   0  34  48


Where the columns are the doms in the order described in the header... and
the last column being idle time.

hhmm, the script is only 67 lines... I will include it...
The polling frequency and number of samples to take are
commandline parameters, I run it hourly as "script 60 59" in my
crontab.

here goes:

#!/usr/bin/perl
#
# script to dump CPU stats for VMs
#
# vim:ai

use strict;

my $interval = shift || 5;
my $num_samples = shift || 0;

my $uptime = `cat /proc/uptime`;
$uptime =~ s/ .*$//g; # trim from first space, should leave us uptime in
secs

my $XM="/usr/sbin/xm";


my $loop = 0;
my $lasttimestamp = 0;
my %lastcpu = ();
while ( ++$loop ) { # loop forever
   my $buf = '';
   my $count = 0;
   my $dat = `$XM list -l`
      or die "no output from $XM list ?? maybe it isn't in your path?";
   my $datatimestamp = time();
   $dat =~ tr/\(\)/{}/;  # for readability of regex below.
   my $totcpu = 0;

   while ( my($dom,$rest) = ($dat =~ m/^(.*?\n})(.*)$/gs ) ) {
      my ($domcpu) = ($dom =~ m/{cpu_time\s([\d\.]+)}/)
         or die "couldn't extract cpu_time from $dom on dom $count\n";
      my ($domup) = $uptime;
      if ($count > 0 ) {
         ($domup) = ($dom =~ m/{up_time\s([\d\.]+)}/)
            or die "couldn't extract up_time from $dom on dom $count\n";
      }
      my $domname = "dom-$count";
      {
         my ($tmp) = ($dom =~ m/{name\s(.+)}/);
         $domname = $tmp if ($tmp);
      }

      if ($loop <= 1) {
         $buf .= sprintf "%10s %5.2f%% cpu usage  %.2f sec over %.2f days\n",
            $domname, 100 * $domcpu/$domup, $domcpu, $domup/24/3600;
      } else {
         my $cpu = $domcpu-$lastcpu{$count};
         $totcpu += $cpu;
         $buf .= sprintf "%3d ",
            100 * $cpu/$interval;
      }
      $lastcpu{$count} = $domcpu;
      $dat = $rest;
      $count++;
      die "count exceeded" if ($count > 100);
   }
   my $period = ($datatimestamp - $lasttimestamp);
   if ($loop > 1) {  # add on idle cpu
      $buf .= sprintf "%3d", 100 * ($interval - $totcpu)/$period;
   }
   $lasttimestamp = $datatimestamp;
   print "$buf\n";
   exit if ($num_samples && $loop > $num_samples);
   sleep $interval;
}


_______________________________________________
Xen-users mailing list
Xen-users@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-users


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.