3
0
mirror of https://github.com/pragma-/pbot.git synced 2024-11-20 10:59:29 +01:00
pbot/modules/compiler_vm/compiler_server_watchdog.pl
Pragmatic Software 10c17bd3ad Add watchdog to monitor VM cpu load and reset for excessive load
Detect if VM is running under excessive load (e.g., due to fork bombing)
for longer than a certain period and reset the VM state if so.
2015-04-20 21:33:01 -07:00

60 lines
1.3 KiB
Perl
Executable File

#!/usr/bin/env perl
use warnings;
use strict;
use Proc::ProcessTable;
use IO::Socket;
my $SLEEP = 15;
my $MAX_PCTCPU = 25;
my $QEMU = 'qemu-system-x86';
my $MONITOR_PORT = 3335;
my $last_pctcpu = 0;
sub reset_vm {
print "Resetting vm\n";
my $sock = IO::Socket::INET->new(PeerAddr => '127.0.0.1', PeerPort => $MONITOR_PORT, Prot => 'tcp');
if(not defined $sock) {
print "[vm_reset] Unable to connect to monitor: $!\n";
return;
}
print $sock "loadvm 1\n";
close $sock;
print "Reset vm\n";
}
while (1) {
my $t = new Proc::ProcessTable(enable_ttys => 0);
my ($pids, $p);
foreach $p (@{$t->table}) {
$pids->{$p->pid} = { fname => $p->fname, ppid => $p->ppid };
}
foreach $p (keys %$pids) {
if ($pids->{$p}->{fname} eq $QEMU) {
my $ppid = $pids->{$p}->{ppid};
if ($pids->{$ppid}->{fname} eq 'compiler_server') {
my $pctcpu = `top -b -n 1 -p $p | tail -n 1 | awk '{print \$9}'`;
$pctcpu =~ s/^\s+|\s+$//g;
print scalar localtime, " :: Got compiler qemu pid: $p; using $pctcpu cpu\n";
if ($pctcpu >= $last_pctcpu and $last_pctcpu >= $MAX_PCTCPU) {
reset_vm;
$last_pctcpu = 0;
} else {
$last_pctcpu = $pctcpu;
}
}
}
}
sleep $SLEEP;
}