Taille de la file d'attente pour IO::Socket::INET
Bonjour,
J'ai un petit soucis concernant la facon dont la queue est geree dans une IO::Socket::INET.
En fait, j'ai des evenements (que je ne controle pas) qui declenchent un script bash.
Il peut y en avoir plusieurs centaines et ils sont traites sequentiellement, chacun appelant le script bash lorsque l'evenement precedent est traite.
Pour faire simple, ces evenements sont de 2 types et c'est pourquoi j'aimerais mettre en place 2 daemons qui seraient utilises de la facon suivante:
- un evenement est declenche
- il declenche a son tour la script bash
- ce script determine la nature de l'evement (a l'aide d'une variable d'environment)
- en fonction du type d'evenement, il contacte un des 2 daemons
- le daemon fait sa tache
J'ai commence a faire des tests et ca m'a l'air de bien marcher mais j'ai un point qui me semble bloquant...
Avec un peu de code, c'est plus parlant... :-)
Script event.sh declenché par l'evenement
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
...
port=""
if [ "$type" = "type1" ];then
port=3333
else
port=3334
fi
perl client.pl $port<<EOF
des infos concernant l'evenement
EOF
... |
Script client.pl
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
#!/usr/local/bin/perl
use IO::Socket;
# Get port number (pour savoir a quel daemon le client doit envoyer ses donnees)
my $port = shift;
my @infos = @ARGV;
my ($value1, ...)=split(' ',@infos);
$sock = IO::Socket::INET->new(
Proto => "udp",
PeerPort => $port ) or die "Cannot open socket on port $port.\n";
print $sock "$value1 $value2 ..." |
Script daemon1.pl (le daemon2.pl est identique a part qu'il tourne sur un autre port)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
#!/usr/local/bin/perl -w
use IO::Socket;
$sock = IO::Socket::INET->new(
LocalPort => 3333,
Proto => 'udp'
) or die "\nCannot create server.\n";
print "\nSERVER IS RUNNING\n";
while(<$sock>){
my $params = $_;
# fait_des_trucs_avec_ces_params();
sleep(5); # pour simuler un traitement qui prendrait plusieurs secondes
} |
Alors en fait le probleme c'est que si je simule une centaine d'evenement (un while qui declenche le event.sh 100 fois),
je vois que le serveur prend les evenements un par un (normal) mais en fait il en effectue qu'environ 70 (!!!).
L'explication que je vois... comme le temps de processing d'une requete par le serveur peut prendre quelques secondes,
et que les requetes s'accumulent donc dans la queue (les 100 evenements et tentative de connexion au serveur sont creees en environ 5 secondes...), est ce qu'il y aurait des demandes de connexion qui sont perdues....
Est ce qu'il y par defaut un nombre de process max qui peuvent tenter de connecter le serveur et qui sont mis dans la queue?
DEsole d'avoir fait un post si long.
Merci beaucoup pour votre aide,
Bonne soiree,
Lucho