Unlike 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($); #<a href="/blog/files/xen_cloud.tar.gz" title="xen_cloud.tar.gz" target="_blank">xen_cloud.tar.gz</a> # 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: %d\n", $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: %d\n“, $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.