# HG changeset patch # User Peter Gervai # Date 1381992550 -7200 # Node ID c2cff30df6dc7fc7efa6cbe941814f9c3838e2e6 # Parent 4cd907a693d1dd7495c33dfd6a4fd98d954795ca Add openvz_checker.pl (24:1c29ac915688) form local repo * check ovz setting consistency diff -r 4cd907a693d1 -r c2cff30df6dc openvz_checker.pl --- /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) { + # 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); +}