Latest revision |
Your text |
Line 322: |
Line 322: |
| | | |
| sub check_maxulong { | | sub check_maxulong { |
− | </source>
| |
− |
| |
− |
| |
− |
| |
− |
| |
− | Here is another modified version vzcomits.pl with some caculation addons and consistency checks.
| |
− | Also every possible value will be stored stored in hashes which makes it easy to add some more calculations.
| |
− |
| |
− |
| |
− | Additional Output:
| |
− | <pre>
| |
− | Total RAM: 4154634240
| |
− | Total SWAP: 8589926400
| |
− |
| |
− | lowmem current utilization: 2.61%
| |
− | lowmem maximum utilization: 6.88%
| |
− | lowmem barrier: 54.80%
| |
− | lowmem commitment: 105.00%
| |
− | lowmem limit: 1584.87mb
| |
− |
| |
− | oomguarpages utilization can be between 32.60% and 66.30%
| |
− | oomguarpages current utilization: 14.84%
| |
− | oomguarpages commitment (80-100%): 36.12%
| |
− |
| |
− | privvmpages of a single container should not be higher than: 2377.30mb
| |
− | allocated memory (privvmpages) current utilization: 25.39%
| |
− | allocation (privvmpages) limit: 126.77%
| |
− | allocation memory guarantee (vmguarpages <100%): 39.43%
| |
− |
| |
− | ########################################################################
| |
− | </pre>
| |
− |
| |
− |
| |
− |
| |
− |
| |
− | <source lang=perl>
| |
− | #!/usr/bin/perl
| |
− |
| |
− | ##############################################################################
| |
− | # vzcomits.pl
| |
− | #
| |
− | # this script reads /proc/user_beancounters on openvz HNs and VEs and displays
| |
− | # the values in human-readable format (megabytes/kilobytes).
| |
− | #
| |
− | # The script can be distributed freely for everybody who finds it usable.
| |
− | #
| |
− | # Christian Anton <mail |_at_| christiananton.de> 2008-09-18
| |
− | #
| |
− | # modified by PVCE Andreas Neuhold <nean[at]hd-recording[dot]at> for additional advanced calculations
| |
− | #
| |
− |
| |
− | my %beancounters;
| |
− | my %sumbeancounters;
| |
− | my %calc;
| |
− |
| |
− | my $ram=$1 if (qx(free -b) =~ /.*Mem:\s*(\d+)\s*/);
| |
− | my $swap=$1 if (qx(free -b) =~ /.*Swap:\s*(\d+)\s*/);
| |
− |
| |
− |
| |
− | open(BEANS,"/proc/user_beancounters");
| |
− | chomp ($arch = `uname -m`);
| |
− |
| |
− | sub check_maxulong {
| |
− | my $number = shift;
| |
− |
| |
− | if ($arch eq "x86_64") {
| |
− | if ($number == 9223372036854775807) {
| |
− | return 1;
| |
− | } else {
| |
− | return undef;
| |
− | }
| |
− | } else {
| |
− | if ($number == 2147483647) {
| |
− | return 1;
| |
− | } else {
| |
− | return undef;
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− | sub recalc_bytes {
| |
− | my $bytes = shift;
| |
− |
| |
− | if (defined(&check_maxulong($bytes))) { return "unlimited"; }
| |
− |
| |
− | my $kbytes = $bytes / 1024;
| |
− | my $ret;
| |
− |
| |
− | # if over 1mb, show mb values
| |
− | if ($kbytes > 1024) {
| |
− | my $mbytes = $kbytes / 1024;
| |
− | $ret = sprintf("%.2f", $mbytes) . " mb";
| |
− | return $ret;
| |
− | } else {
| |
− | $ret = sprintf("%.2f", $kbytes) . " kb";
| |
− | return $ret;
| |
− | }
| |
− | }
| |
− |
| |
− | sub recalc_pages {
| |
− | my $pages = shift;
| |
− |
| |
− | if ($pages == 0) { return "0"; }
| |
− | if (defined(&check_maxulong($pages))) { return "unlimited"; }
| |
− |
| |
− | my $kbytes = $pages * 4;
| |
− | my $ret;
| |
− |
| |
− | if ($kbytes > 1024) {
| |
− | my $mbytes = $kbytes / 1024;
| |
− | $ret = sprintf("%.2f", $mbytes) . " mb";
| |
− | return $ret;
| |
− | } else {
| |
− | $ret = sprintf("%.2f", $kbytes) . " kb";
| |
− | return $ret;
| |
− | }
| |
− | }
| |
− |
| |
− | sub recalc_nothing {
| |
− | my $number = shift;
| |
− | if (defined(&check_maxulong($number))) { return "unlimited"; }
| |
− |
| |
− | return $number;
| |
− | }
| |
− |
| |
− | sub printline {
| |
− | my $mode = shift; # 0=normal, 1=bytes, 2=pages
| |
− | my $ident = shift;
| |
− | my $held = shift;
| |
− | my $maxheld = shift;
| |
− | my $barrier = shift;
| |
− | my $limit = shift;
| |
− | my $failcnt = shift;
| |
− |
| |
− | if ($mode == 0) {
| |
− | printf ("%-15s",$ident);
| |
− | printf ("%18s",&recalc_nothing($held));
| |
− | printf ("%21s",&recalc_nothing($maxheld));
| |
− | printf ("%21s",&recalc_nothing($barrier));
| |
− | printf ("%21s",&recalc_nothing($limit));
| |
− | printf ("%21s",$failcnt);
| |
− | print "\n";
| |
− | } elsif ($mode == 1) {
| |
− | printf ("%-15s",$ident);
| |
− | printf ("%18s",&recalc_bytes($held));
| |
− | printf ("%21s",&recalc_bytes($maxheld));
| |
− | printf ("%21s",&recalc_bytes($barrier));
| |
− | printf ("%21s",&recalc_bytes($limit));
| |
− | printf ("%21s",$failcnt);
| |
− | print "\n";
| |
− | } elsif ($mode == 2) {
| |
− | printf ("%-15s",$ident);
| |
− | printf ("%18s",&recalc_pages($held));
| |
− | printf ("%21s",&recalc_pages($maxheld));
| |
− | printf ("%21s",&recalc_pages($barrier));
| |
− | printf ("%21s",&recalc_pages($limit));
| |
− | printf ("%21s",$failcnt);
| |
− | print "\n";
| |
− | }
| |
− | }
| |
− |
| |
− | sub work_line {
| |
− | my $cid = shift;
| |
− | my $line = shift;
| |
− | my $ident = $line;
| |
− | my $held = $line;
| |
− | my $maxheld = $line;
| |
− | my $barrier = $line;
| |
− | my $limit = $line;
| |
− | my $failcnt = $line;
| |
− |
| |
− |
| |
− | $ident =~ s/^\s+(\w+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)$/$1/;
| |
− | $held =~ s/^\s+(\w+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)$/$2/;
| |
− | $maxheld =~ s/^\s+(\w+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)$/$3/;
| |
− | $barrier =~ s/^\s+(\w+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)$/$4/;
| |
− | $limit =~ s/^\s+(\w+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)$/$5/;
| |
− | $failcnt =~ s/^\s+(\w+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)$/$6/;
| |
− |
| |
− | # save everything in hashes
| |
− | $beancounters{$cid}{$ident}{"held"}=$held;
| |
− | $beancounters{$cid}{$ident}{"maxheld"}=$maxheld;
| |
− | $beancounters{$cid}{$ident}{"bar"}=$barrier;
| |
− | $beancounters{$cid}{$ident}{"lim"}=$limit;
| |
− | $beancounters{$cid}{$ident}{"failcnt"}=$failcnt;
| |
− |
| |
− | # 0=normal, 1=bytes, 2=pages
| |
− | if ($ident eq "dummy") {
| |
− | # do nothing, skip this line
| |
− | } elsif ($ident =~ /pages/) {
| |
− | &printline(2,$ident,$held,$maxheld,$barrier,$limit,$failcnt);
| |
− | } elsif ($ident =~ /^num/) {
| |
− | &printline(0,$ident,$held,$maxheld,$barrier,$limit,$failcnt);
| |
− | } else {
| |
− | &printline(1,$ident,$held,$maxheld,$barrier,$limit,$failcnt);
| |
− | }
| |
− |
| |
− | }
| |
− |
| |
− | sub print_header {
| |
− | my $cid = shift;
| |
− |
| |
− | print "\n########################################################################\n";
| |
− | print "CID $cid\n";
| |
− | print "resource held maxheld barrier limit failcnt\n";
| |
− | }
| |
− |
| |
− | # now eat your beans baby
| |
− | while (<BEANS>) {
| |
− | chomp($line = $_);
| |
− |
| |
− | # skip processing of headline
| |
− | if ($line =~ /^\s+uid/) {
| |
− | # do nothing, skip this
| |
− | } elsif ($line =~ /^Ver/) {
| |
− | # do nothing, skip this
| |
− | } elsif ($line =~ /^\s+\d+:\s+kmem/) {
| |
− | $cid = $line;
| |
− | $line =~ s/^(\s+)(\d+):/$1/;
| |
− | $cid =~ s/^(\s+)(\d+):.*$/$2/;
| |
− |
| |
− | &print_header($cid);
| |
− | &work_line($cid,$line);
| |
− |
| |
− | } else {
| |
− | &work_line($cid,$line);
| |
− |
| |
− | }
| |
− | }
| |
− |
| |
− | close(BEANS);
| |
− |
| |
− |
| |
− |
| |
− | print "########################################################################\n\n";
| |
− | print "Total RAM: $ram \nTotal SWAP: $swap\n\n";
| |
− |
| |
− | # summarize all values of all containers
| |
− | foreach my $cid (keys %beancounters) {
| |
− | if ($cid > 0 ) {
| |
− | #print "\n$cid :\n";
| |
− | foreach my $ident (keys %{$beancounters{$cid}}) {
| |
− | foreach my $stat (keys %{$beancounters{$cid}{$ident}}) {
| |
− | # summarize all values of all containers
| |
− | $sumbeancounters{$ident}{$stat} += $beancounters{$cid}{$ident}{$stat};
| |
− |
| |
− | # summarize all socket buffers
| |
− | $sumbeancounters{"buf"}{$stat} += $beancounters{$cid}{$ident}{$stat} if ($ident =~ /.*buf/i);
| |
− | }
| |
− | }
| |
− | # checks
| |
− | print "WARNING! CID $cid: numiptent should not be greater than 200-300!\n vzvtl set --numiptent 200:200\n" if ($beancounters{$cid}{"numiptent"}{"lim"} > 200);
| |
− | print "WARNING! CID $cid: numsiginfo hould not be greater than 1024!\n vzvtl set --numsiginfo 1024:1024\n" if ($beancounters{$cid}{"numsiginfo"}{"lim"} > 1024);
| |
− | print "WARNING! CID $cid: kmemsize barrier to small or numproc to high!\n $beancounters{$cid}{'kmemsize'}{'bar'} > (40960*$beancounters{$cid}{'numproc'}{'held'}+$beancounters{$cid}{'dcachesize'}{'lim'})\n" if ($beancounters{$cid}{"kmemsize"}{"bar"} < (40960*$beancounters{$cid}{"numproc"}{"held"}+$beancounters{$cid}{"dcachesize"}{"lim"}));
| |
− | print "WARNING! CID $cid: tcpsndbuf to small or numtcpsock to high!\n($beancounters{$cid}{'tcpsndbuf'}{'lim'}-$beancounters{$cid}{'tcpsndbuf'}{'bar'}) > (2560*$beancounters{$cid}{'numtcpsock'}{'maxheld'})\n" if (($beancounters{$cid}{"tcpsndbuf"}{"lim"}-$beancounters{$cid}{"tcpsndbuf"}{"bar"}) < (2560*$beancounters{$cid}{"numtcpsock"}{"maxheld"}));
| |
− | print "WARNING! CID $cid: othersockbuf to small or numothersock to high!\n ($beancounters{$cid}{'othersockbuf'}{'lim'}-$beancounters{$cid}{'othersockbuf'}{'bar'}) > (2560*$beancounters{$cid}{'numothersock'}{'maxheld'})\n" if (($beancounters{$cid}{"othersockbuf"}{"lim"}-$beancounters{$cid}{"othersockbuf"}{"bar"}) < (2560*$beancounters{$cid}{"numothersock"}{"maxheld"}));
| |
− |
| |
− | }
| |
− |
| |
− |
| |
− | }
| |
− | #print "########################################################################\n\n";
| |
− |
| |
− |
| |
− | $calc{"lowmem"}{"util"}=(($sumbeancounters{"kmemsize"}{"held"}+$sumbeancounters{"buf"}{"held"})/($ram*0.4))*100;
| |
− | $calc{"lowmem"}{"maxutil"}=(($sumbeancounters{"kmemsize"}{"maxheld"}+$sumbeancounters{"buf"}{"maxheld"})/($ram*0.4))*100;
| |
− | $calc{"lowmem"}{"bar"}=(($sumbeancounters{"kmemsize"}{"bar"}+$sumbeancounters{"buf"}{"bar"})/($ram*0.4))*100;
| |
− | $calc{"lowmem"}{"comit"}=(($sumbeancounters{"kmemsize"}{"lim"}+$sumbeancounters{"buf"}{"lim"})/($ram*0.4))*100;
| |
− | $calc{"lowmem"}{"limit"}=(($ram*0.4)/(1024*1024));
| |
− |
| |
− | printf("lowmem current utilization: %.2f%\n", $calc{"lowmem"}{"util"});
| |
− | printf("lowmem maximum utilization: %.2f%\n", $calc{"lowmem"}{"maxutil"});
| |
− | printf("lowmem barrier: %.2f%\n", $calc{"lowmem"}{"bar"});
| |
− | printf("lowmem commitment: %.2f%\n", $calc{"lowmem"}{"comit"});
| |
− | printf("lowmem limit: %.2fmb\n", $calc{'lowmem'}{'limit'});
| |
− |
| |
− |
| |
− |
| |
− | $calc{"oomguarpages"}{"min"}=(($ram/($ram+$swap))*100);
| |
− | $calc{"oomguarpages"}{"max"}=((($ram+($swap*0.5))/($ram+$swap))*100);
| |
− | $calc{"oomguarpages"}{"util"}=((($sumbeancounters{"oomguarpages"}{"held"}*4096)+$sumbeancounters{"buf"}{"held"})/($ram+$swap))*100;
| |
− | $calc{"oomguarpages"}{"comit"}=((($sumbeancounters{"oomguarpages"}{"bar"}*4096)+$sumbeancounters{"buf"}{"lim"})/($ram+$swap))*100;
| |
− |
| |
− | printf "\noomguarpages utilization can be between %.2f% and %.2f%\n", $calc{'oomguarpages'}{'min'}, $calc{'oomguarpages'}{'max'};
| |
− | printf("oomguarpages current utilization: %.2f%\n", $calc{"oomguarpages"}{"util"});
| |
− | printf("oomguarpages commitment (80-100%): %.2f%\n", $calc{"oomguarpages"}{"comit"});
| |
− |
| |
− |
| |
− |
| |
− | $calc{"privvmpages"}{"min"}=(($ram/($ram+$swap))*100);
| |
− | $calc{"privvmpages"}{"max"}=($ram*0.6)/(1024*1024);
| |
− | $calc{"privvmpages"}{"util"}=((($sumbeancounters{"privvmpages"}{"held"}*4096)+$sumbeancounters{"buf"}{"held"})/($ram+$swap))*100;
| |
− | $calc{"vmguarpages"}{"comit"}=((($sumbeancounters{"vmguarpages"}{"bar"}*4096)+$sumbeancounters{"buf"}{"lim"})/($ram+$swap))*100;
| |
− | $calc{"privvmpages"}{"lim"}=((($sumbeancounters{"privvmpages"}{"lim"}*4096)+$sumbeancounters{"buf"}{"lim"})/($ram+$swap))*100;
| |
− |
| |
− | printf("\nprivvmpages of a single container should not be higher than: %.2fmb\n", $calc{'privvmpages'}{'max'});
| |
− | printf("allocated memory (privvmpages) current utilization: %.2f%\n", $calc{"privvmpages"}{"util"});
| |
− | printf("allocation (privvmpages) limit: %.2f%\n", $calc{"privvmpages"}{"lim"});
| |
− | printf("allocation memory guarantee (vmguarpages <100%): %.2f%\n", $calc{"vmguarpages"}{"comit"});
| |
− |
| |
− | # numiptent 200-300
| |
− |
| |
− |
| |
− | print "\n########################################################################\n\n";
| |
− |
| |
− |
| |
− | #EOF
| |
| </source> | | </source> |