Xen VMs performance collection
Saturday, October 18th, 2008Unlike VMware Server, Xen’s HyperVisor does not allow an easy collection of performance information. The management machine, called “Domain-0” is actually a privileged virtual machine, and thus – get its own small share of CPUs and RAM. Collecting performance information on it will lead to, well, collecting performance information for a single VM, and not the whole bunch.
Local tools, such as “xentop” allows collection of information, however, combining this with Cacti, or any other SNMP-based collection tool is a bit tricky.
A great solution is provided by Ian P. Christian in his blog post about Xen monitoring. He has created a Perl script to collect information. I have taken the liberty to fix several minor things with his permission. The modified scripts are presented below. Name the script (according to your version of Xen) “/usr/local/bin/xen_stats.pl” and set it to be executable:
For Xen 3.1
#!/usr/bin/perl -w
use strict;
# declare...
sub trim($);
#xen_cloud.tar.gz
# we need to run 2 iterations because CPU stats show 0% on the first, and I'm putting .1 second betwen them to speed it up
my @result = split(/n/, `xentop -b -i 2 -d.1`);
# remove the first line
shift(@result);
shift(@result) while @result && $result[0] !~ /^xentop - /;
# the next 3 lines are headings..
shift(@result);
shift(@result);
shift(@result);
shift(@result);
foreach my $line (@result)
{
my @xenInfo = split(/[t ]+/, trim($line));
printf("name: %s, cpu_sec: %d, cpu_percent: %.2f, vbd_rd: %d, vbd_wr: %dn",
$xenInfo[0],
$xenInfo[2],
$xenInfo[3],
$xenInfo[14],
$xenInfo[15]
);
}
# trims leading and trailing whitespace
sub trim($)
{
my $string = shift;
$string =~ s/^s+//;
$string =~ s/s+$//;
return $string;
}
For Xen 3.2 and Xen 3.3
#!/usr/bin/perl -w
use strict;
# declare…
sub trim($);
# we need to run 2 iterations because CPU stats show 0% on the first, and I’m putting .1 second between them to speed it up
my @result = split(/n/, `/usr/sbin/xentop -b -i 2 -d.1`);
# remove the first line
shift(@result);
shift(@result) while @result && $result[0] !~ /^[t ]+NAME/;
shift(@result);
foreach my $line (@result)
{
my @xenInfo = split(/[t ]+/, trim($line));
printf(“name: %s, cpu_sec: %d, cpu_percent: %.2f, vbd_rd: %d, vbd_wr: %dn“,
$xenInfo[0],
$xenInfo[2],
$xenInfo[3],
$xenInfo[14],
$xenInfo[15]
);
}
# trims leading and trailing whitespace
sub trim($)
{
my $string = shift;
$string =~ s/^s+//;
$string =~ s/s+$//;
return $string;
}
Cron settings for Domain-0
Create a file “/etc/cron.d/xenstat” with the following contents:
# This will run xen_stats.pl every minute
*/1 * * * * root /usr/local/bin/xen_stats.pl > /tmp/xen-stats.new && cat /tmp/xen-stats.new > /var/run/xen-stats
SNMP settings for Domain-0
Add the line below to “/etc/snmp/snmpd.conf” and then restart the snmpd service
extend xen-stats /bin/cat /var/run/xen-stats
Cacti
I reduced Ian Cacti script to be based on a per-server setup, meaning this script gets the host (dom-0) name from Cacti, but cannot support live migrations. I will try to deal with combining live migrations with Cacti in the future.
Download and extract my modified xen_cloud.tar.gz file. Extract it, place the script and config in its relevant location, and import the template into Cacti. It should work like charm.
A note – the PHP script will work only on PHP5 and above. Works flawlessly on Centos5.2 for me.