Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Performance / compilation d'un script perl

2 réponses
Avatar
Yves Martin
Bonjour,

Je suis en train de déployer SNMP mais j'ai de sérieux soucis de performance
car mes checks Nagios sont trop longs et la charge de la machine explose.

Pour information, je publie avec "exec OID scriptname scripfile" mes checks
Nagios sur chaque server et j'utilise un script sur la machine Nagios pour
récupérer les informations publiées. (script après ma signature)

En bytecompilant mon script, je gagne déjà pas mal:

$ time /usr/local/bin/check_snmp_exec target .1.3.6.1.4.1.15204.2.1
TCP OK - 0.003 second response time on port 10001|time= 0.003

real 0m0.438s
user 0m0.370s
sys 0m0.055s

$ time /usr/local/bin/check_snmp_exec.pl target .1.3.6.1.4.1.15204.2.1
TCP OK - 0.005 second response time on port 10001|time= 0.005

real 0m0.620s
user 0m0.368s
sys 0m0.058s

Si je compile entièrement. J'ai une "Segmentation Fault"...

Comme le script dépend de SNMP.pm qui fait bien 62 Ko, j'aimerai le
bytecompiler aussi. Comment m'y prendre ?

Sinon, reste l'option d'intégrer mon script dans le support Perl de Nagios
mais la documentation ne m'a pas inspiré confiance dans la faisabilité de la
chose.

Merci d'avance
--
Yves Martin

#!/usr/bin/perl

use strict;
use warnings;
use SNMP;
$SNMP::use_long_names = 1;
$SNMP::use_numeric = 1;

sub fail($) {
print $_[0] . "\n";
exit(3);
}

my $hostname = shift || &fail("No hostname specified");
my $baseoid = shift || &fail("No base OID specified");

sub check_return($) {
if ($_[0] =~ /NOSUCHOBJECT/ || $_[0] =~ /NOSUCHINSTANCE/) {
&fail("Unknown SNMP exec OID " . $baseoid);
}
}

my $session = new SNMP::Session(
DestHost => $hostname,
Community => 'nagios',
Version => '2c',
Timeout => '5000000');

my $oid_returncode = $baseoid . ".100.1";
my $var = new SNMP::Varbind([$oid_returncode]);
my $exec_returncode = $session->get($var);

&check_return($exec_returncode);

my $stdout = "";
my $oid_stdout = $baseoid . ".101";
$var = new SNMP::Varbind([$oid_stdout]);
my $instdout = 1;

while($instdout) {
my $val = $session->getnext($var);
my $oid = $var->[$SNMP::Varbind::tag_f] . "." . $var->[$SNMP::Varbind::iid_f];

if ($oid !~ /^$oid_stdout./) {
$instdout = 0;
} else {
$stdout .= $val . " ";
}
}

print $stdout . "\n";
exit($exec_returncode);

2 réponses

Avatar
Mark Clements
Yves Martin wrote:
Bonjour,

Je suis en train de déployer SNMP mais j'ai de sérieux soucis de performance
car mes checks Nagios sont trop longs et la charge de la machine explose.

Pour information, je publie avec "exec OID scriptname scripfile" mes checks
Nagios sur chaque server et j'utilise un script sur la machine Nagios pour
récupérer les informations publiées. (script après ma signature)

En bytecompilant mon script, je gagne déjà pas mal:

$ time /usr/local/bin/check_snmp_exec target .1.3.6.1.4.1.15204.2.1
TCP OK - 0.003 second response time on port 10001|time= 0.003

real 0m0.438s
user 0m0.370s
sys 0m0.055s

$ time /usr/local/bin/check_snmp_exec.pl target .1.3.6.1.4.1.15204.2.1
TCP OK - 0.005 second response time on port 10001|time= 0.005

real 0m0.620s
user 0m0.368s
sys 0m0.058s

Si je compile entièrement. J'ai une "Segmentation Fault"...

Comme le script dépend de SNMP.pm qui fait bien 62 Ko, j'aimerai le
bytecompiler aussi. Comment m'y prendre ?

Sinon, reste l'option d'intégrer mon script dans le support Perl de Nagios
mais la documentation ne m'a pas inspiré confiance dans la faisabilité de la
chose.



Tournez le script avec Apache et mod_perl. Comme ça, le script de nagios
en effet fait un requête HTTP, et le script qui charge SNMP.pm est un
script qui tourne avec ModPerl::Registry.

Mark

Avatar
Paul Gaborit
À (at) Thu, 02 Feb 2006 18:32:27 +0100,
Yves Martin écrivait (wrote):
Je suis en train de déployer SNMP mais j'ai de sérieux soucis de performance
car mes checks Nagios sont trop longs et la charge de la machine explose.
[...]

En bytecompilant mon script, je gagne déjà pas mal:


À mon avis, ce qui prend le plus de temps, c'est le lancement de
chacun des process plus que la compilation/exécution du process lui-même...

De plus, si la charge de la machine explose c'est que vous lancez trop
de process à la fois... qu'il soit semi-compilé ou pré-compilé n'y
changera pas grand chose.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>