| 1 |
1 |
dpavlin |
#!/usr/bin/perl -w |
| 2 |
|
|
|
| 3 |
|
|
use strict; |
| 4 |
|
|
|
| 5 |
|
|
use Data::Dump qw/dump/; |
| 6 |
|
|
|
| 7 |
15 |
dpavlin |
my $watch_current = 'held'; |
| 8 |
|
|
my $watch_max = 'limit'; |
| 9 |
|
|
|
| 10 |
|
|
# tune optimizer |
| 11 |
|
|
my $increase_over = 0.95; # 95% of resource $watch used |
| 12 |
|
|
my $increase_limit = 1.1; |
| 13 |
|
|
my $increase_barrier = 1.2; |
| 14 |
|
|
|
| 15 |
|
|
($watch_current,$watch_max) = ('maxheld','barrier'); |
| 16 |
|
|
|
| 17 |
|
|
my $debug = 0; |
| 18 |
|
|
|
| 19 |
1 |
dpavlin |
my $proc='/proc/user_beancounters'; |
| 20 |
|
|
$proc='./user_beancounters' if (! -e $proc); |
| 21 |
|
|
|
| 22 |
|
|
open(my $bc, '<', $proc) || die "can't open $proc: $!"; |
| 23 |
|
|
|
| 24 |
|
|
my @cols; |
| 25 |
|
|
my $vmid; |
| 26 |
|
|
|
| 27 |
|
|
my $d; |
| 28 |
|
|
|
| 29 |
15 |
dpavlin |
warn "increasing $proc if $watch_current > $watch_max * $increase_over\n"; |
| 30 |
3 |
dpavlin |
|
| 31 |
1 |
dpavlin |
while(<$bc>) { |
| 32 |
|
|
chomp; |
| 33 |
|
|
next if (/^Version/); |
| 34 |
|
|
|
| 35 |
|
|
$vmid = $1 if (s/^\s+(\d+):\s+//); |
| 36 |
|
|
s/^\s+//; |
| 37 |
|
|
|
| 38 |
|
|
my @d = split(/\s+/,$_); |
| 39 |
|
|
|
| 40 |
|
|
if ($#d == 6 && $d[0] =~ m/^\w+$/) { |
| 41 |
|
|
@cols = splice(@d,1); |
| 42 |
|
|
# warn "## found cols: ", dump(@cols), "\n"; |
| 43 |
|
|
next; |
| 44 |
|
|
} |
| 45 |
|
|
|
| 46 |
|
|
my $res = $d[0]; |
| 47 |
|
|
|
| 48 |
|
|
foreach my $i ( 1 .. $#cols ) { |
| 49 |
|
|
$d->{ $vmid }->{ $res }->{ $cols[$i] } = $d[$i]; |
| 50 |
|
|
} |
| 51 |
|
|
|
| 52 |
|
|
my $r = $d->{ $vmid }->{ $res }; |
| 53 |
|
|
|
| 54 |
|
|
|
| 55 |
|
|
if ($r->{failcnt} > 0) { |
| 56 |
15 |
dpavlin |
if ( ($r->{ $watch_current } / $r->{ $watch_max }) > $increase_over ) { |
| 57 |
|
|
my $new_limit = int( $r->{ $watch_max } * $increase_limit ); |
| 58 |
|
|
my $new_barr = int( $r->{ $watch_max } * $increase_barrier ); |
| 59 |
|
|
warn "# $vmid $res $r->{ $watch_max } -> $new_limit:$new_barr\n"; |
| 60 |
14 |
dpavlin |
my $cmd = "vzctl set $vmid --${res} $new_limit:$new_barr --save"; |
| 61 |
|
|
warn $cmd,$/; |
| 62 |
15 |
dpavlin |
system $cmd if (! $debug); |
| 63 |
1 |
dpavlin |
} else { |
| 64 |
3 |
dpavlin |
warn sprintf("%s/%s failed, but not used %d%% [%d/%d %d%%]\n", |
| 65 |
15 |
dpavlin |
$vmid, $res, $increase_over * 100, $r->{ $watch_current }, $r->{ $watch_max }, ($r->{ $watch_current }/$r->{ $watch_max })*100 |
| 66 |
3 |
dpavlin |
); |
| 67 |
1 |
dpavlin |
} |
| 68 |
|
|
|
| 69 |
|
|
} |
| 70 |
|
|
} |
| 71 |
|
|
close($bc); |
| 72 |
|
|
|
| 73 |
|
|
#print dump($d); |