changeset 4:c2cff30df6dc

Add openvz_checker.pl (24:1c29ac915688) form local repo * check ovz setting consistency
author Peter Gervai <grin@grin.hu>
date Thu, 17 Oct 2013 08:49:10 +0200
parents 4cd907a693d1
children 464dea07deb8
files openvz_checker.pl
diffstat 1 files changed, 241 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/openvz_checker.pl	Thu Oct 17 08:49:10 2013 +0200
@@ -0,0 +1,241 @@
+#!/usr/bin/perl
+#$Id: openvz_checker.pl,v 1c29ac915688 2009/12/09 21:17:13 grin $
+#(c)Peter Gervai, 2009
+# GPLv2 / CC-BY-SA 3.0
+#
+# check openvz resource settings
+# based on wiki pages
+#
+
+use strict;
+use warnings;
+
+use IO::File;
+use Data::Dumper;
+
+my $dir_bc = "/proc/bc";
+
+my $CUR=0;
+my $MAX=1;
+my $BAR=2;
+my $LIM=3;
+
+# ia32...
+my $PAGESIZE=4096;
+
+my @allsocketbuf = qw( tcprcvbuf  tcpsndbuf  dgramrcvbuf  othersockbuf );
+
+opendir( DIR, $dir_bc );
+my @veids = grep { /^\d+/ && -d "$dir_bc/$_" }  readdir(DIR);
+closedir( DIR );
+
+my %res;
+for my $veid ( @veids ) {
+    next if $veid == 0;
+    my $f = new IO::File "< $dir_bc/$veid/resources" or next;
+    while( <$f> ) {
+        chomp;
+        # trim spaces
+        s/^\s*(.*?)\s*$/$1/;
+        my @data = split /\s+/;
+        #                        held, maxheld, barrier, limit, failcnt
+        $res{$veid}{$data[0]} = [ @data[1..5] ];
+    }
+}
+
+## total ram
+my $ram = qx( free | grep Mem: ); chomp $ram;
+$ram = (split /\s+/, $ram)[1];
+print "RAM=$ram\n";
+$ram *= 1024;
+
+## swap
+my $swap = qx( free | grep Swap: ); chomp $swap;
+$swap = (split /\s+/, $swap)[1];
+print "SWAP=$swap\n";
+$swap *= 1024;
+
+
+my $sum;
+### low mem x86_32
+# max lowram 832MB
+my $lowram = $ram > 832000000 ? 832000000 : $ram;
+
+
+###############################
+####### system wide config
+###############################
+
+
+###############################
+## utiliation
+$sum=0;
+foreach my $veid (keys %res) {
+    my $b = $res{$veid}{'kmemsize'}->[$CUR];
+    foreach my $sb (@allsocketbuf) {
+        $b += $res{$veid}{$sb}->[$CUR];
+    }
+    $sum += $b;
+}
+
+print "Low memory (x86_32) Utilisation: ", &pretty($sum / (0.4 * $lowram));
+print "  ( <1 OK; <2 unsafe; >2 dangerous)\n";
+
+
+###############################
+## commitment level
+$sum=0;
+foreach my $veid (keys %res) {
+    my $b = $res{$veid}{'kmemsize'}->[$LIM];
+    foreach my $sb (@allsocketbuf) {
+        $b += $res{$veid}{$sb}->[$LIM];
+    }
+    $sum += $b;
+}
+
+print "Low memory (x86_32) Commitment: ", &pretty($sum / (0.4 * $lowram));
+print "  ( <1 OK; <1.5 acceptable; >2 not recommended)\n";
+
+
+############################
+#### total ram
+## utilisation
+$sum=0;
+foreach my $veid (keys %res) {
+    my $b = $res{$veid}{'physpages'}->[$CUR] * $PAGESIZE;
+    $b += $res{$veid}{'kmemsize'}->[$CUR];
+    foreach my $sb (@allsocketbuf) {
+        $b += $res{$veid}{$sb}->[$CUR];
+    }
+    $sum += $b;
+}
+print "Total RAM utilisation: ", &pretty($sum / $ram);
+print "  ( <0.8 low; <1 ok; >1 impossible)\n";
+
+
+############################
+#### total ram+swap
+## utilisation
+$sum=0;
+foreach my $veid (keys %res) {
+    my $b = $res{$veid}{'oomguarpages'}->[$CUR] * $PAGESIZE;
+    $b += $res{$veid}{'kmemsize'}->[$CUR];
+    foreach my $sb (@allsocketbuf) {
+        $b += $res{$veid}{$sb}->[$CUR];
+    }
+    $sum += $b;
+}
+print "RAM+swap utilisation: ", &pretty($sum / ($ram+$swap));
+my $low_bound = &pretty($ram / ($ram+$swap));
+my $hi_bound  = &pretty(($ram + 0.5*$swap) / ($ram+$swap));
+print "  ( <$low_bound low; between ok; >$hi_bound bad)\n";
+
+
+## commitment
+$sum=0;
+foreach my $veid (keys %res) {
+    my $b = $res{$veid}{'oomguarpages'}->[$BAR] * $PAGESIZE;
+    $b += $res{$veid}{'kmemsize'}->[$LIM];
+    foreach my $sb (@allsocketbuf) {
+        $b += $res{$veid}{$sb}->[$LIM];
+    }
+    $sum += $b;
+}
+print "RAM+swap commitment: ", &pretty($sum / ($ram+$swap));
+print "  ( <0.8 low; <1 ok; >1 not recommended)\n";
+
+
+## allocations
+$sum=0;
+foreach my $veid (keys %res) {
+    my $b = $res{$veid}{'privvmpages'}->[$LIM] * $PAGESIZE;
+    $b += $res{$veid}{'kmemsize'}->[$LIM];
+    foreach my $sb (@allsocketbuf) {
+        $b += $res{$veid}{$sb}->[$LIM];
+    }
+    $sum += $b;
+}
+print "RAM+swap allocations: ", &pretty($sum / ($ram+$swap));
+print "  ( <1.5 low; <4 ok; >4 not recommended [oom])\n";
+
+
+###############################
+####### per VE configs
+###############################
+foreach my $veid (sort { $a <=> $b }  keys %res) {
+    #            <numproc> should be average process num
+    &compare( $veid, $res{$veid}{'kmemsize'}->[$BAR],
+    40*1024*$res{$veid}{'numproc'}->[$CUR] + $res{$veid}{'dcachesize'}->[$LIM],
+            "kmemsize(bar)", "numproc~dcachesize", "kmemsize low for # of processes" );
+    
+    &compare( $veid, $res{$veid}{'privvmpages'}->[$BAR], $res{$veid}{'vmguarpages'}->[$BAR],
+    "privvmpages","vmguarpages", "mem alloc less than guarantee" );
+
+    
+    &compare( $veid, $res{$veid}{'tcpsndbuf'}->[$LIM] - $res{$veid}{'tcpsndbuf'}->[$BAR], 
+    2.5*1024*$res{$veid}{'numtcpsock'}->[$LIM], 
+    "tcpsndbuf(lim-bar)", "numtcpsock(lim{bytes})", "tcp may hang");
+    
+    
+    &compare( $veid, $res{$veid}{'othersockbuf'}->[$LIM] - $res{$veid}{'othersockbuf'}->[$BAR],
+    2.5*1024*$res{$veid}{'numothersock'}->[$LIM],
+    "othersockbuf(lim-bar)", "numothersock{bytes}", "othersock may hang");
+    
+    
+    &compare( $veid, $res{$veid}{'tcprcvbuf'}->[$LIM] - $res{$veid}{'tcprcvbuf'}->[$BAR],
+    2.5*1024*$res{$veid}{'numothersock'}->[$LIM],
+    "tcprcvbuf(lim-bar)","numothersock{bytes}","may slow tcp" );
+    
+    
+    if( $res{$veid}{'tcprcvbuf'}->[$BAR] < 65535 ) {
+        print "$veid: tcprcvbuf too low (<64k)\n";
+    }
+    
+    
+    if( $res{$veid}{'tcpsndbuf'}->[$BAR] < 65535 ) {
+        print "$veid: tcpsndbuf too low (<64k)\n";
+    }
+    
+    
+    if( $res{$veid}{'dgramrcvbuf'}->[$BAR] < 131200 ) {
+        print "$veid: dgramrcvbuf too low (<129k)\n";
+    }
+    
+    
+    if( $res{$veid}{'othersockbuf'}->[$BAR] < 131200 ) {
+        print "$veid: othersockbuf too low (<129k)\n";
+    }
+    
+    
+    # numfile < avgnumproc*32
+    # ...
+    
+    if( $res{$veid}{'dcachesize'}->[$BAR] < 
+      $res{$veid}{'numfile'}->[$MAX] * 384 ) {
+        print "$veid: dcachesize likely low for dentry and inode allocs\n";
+    }
+    
+    
+    foreach my $param (keys %{$res{$veid}}) {
+        &compare( $veid, $res{$veid}{$param}->[$LIM], $res{$veid}{$param}->[$BAR],
+                "limit", "barrier", "problem with $param" );
+    }
+}
+
+
+
+sub compare {
+    my ($veid, $large, $small, $ltext, $stext, $text) = @_;
+    
+    if( $large < $small ) {
+        # bad...
+        print "VE $veid: $text ($ltext=$large < $stext=$small)\n";
+    }
+    return;
+}
+
+
+
+sub pretty($) {
+    return sprintf("%6.4f", shift);
+}