IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation et administration système Perl Discussion :

Proxy thread queue multithread probleme performance


Sujet :

Programmation et administration système Perl

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 139
    Points : 57
    Points
    57
    Par défaut Proxy thread queue multithread probleme performance
    Bonjour,

    J'ai un gros problème je ne vois pas comment optimiser ce code simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    #!/usr/bin/perl
     
    # Load modules
    use Net::PcapUtils;
    use NetPacket::Ethernet qw(:strip);
    use NetPacket::UDP;
    use NetPacket::IP qw(:strip);
    use IO::Socket;
    use threads;
    use Thread::Queue;
     
     
    use Socket;
    use constant SIMPLE_UDP_PORT => 516;
    use constant REMOTE_HOST => '192.168.10.10';
    my $trans_serv = getprotobyname( 'udp' );
    my $remote_host = gethostbyname( REMOTE_HOST );
    my $remote_port = SIMPLE_UDP_PORT;
    my $destination = sockaddr_in( $remote_port, $remote_host );
    socket( UDP_SOCK, PF_INET, SOCK_DGRAM, $trans_serv );
     
    $SIG{CHLD} = 'IGNORE';
     
    #my $socket=IO::Socket::INET->new(
    #                PeerAddr => '192.168.10.10',
    #                PeerPort => '516',
    #                Proto => 'udp' );
     
    my $queue = Thread::Queue -> new;
     
     
    if($> != 0)
    {
    die "You need EUID 0 to use this tool!\n\n";
    }
    my $monitor = threads->create ("monitor", $queue);
    $monitor->detach();
    my $monitor2 = threads->create ("monitor", $queue);
    $monitor2->detach();
    my $monitor3 = threads->create ("monitor", $queue);
    $monitor3->detach();
     
    sub monitor {
    	while(1){
              #     print "send packet debut fils \n";
    	        while (my $request = $queue->dequeue()){
    		        send(UDP_SOCK, $packet, 0, $destination);
    			threads->yield();		
    		}
    	}
    	print "fin";
    }
     
    # Callback
    sub sniffit
    {
    my ($args,$header,$packet) = @_;
    #print eth_strip($packet)."\n";
    #my $ip = NetPacket::IP->decode(eth_strip($packet));
    #my $udp = NetPacket::UDP->decode($ip->{data});
    $queue->enqueue($request);
    }
     
     
    # Start sniffin in promisc mode
    Net::PcapUtils::loop(\&sniffit,
    Promisc => 1,
    SNAPLEN => 1000,
    FILTER => 'udp and port 516',
    DEV => 'eth3');
    Je recois des paquets que je forward par la suite à une autre machine.
    je n'arrive pas à optimiser la lecture dans ma thread queue: plus j'ai de thread qui lit dedans au plus je consomme en CPU. Mes threads font donc l'inverse de leur boulot... Avez vous une idée pour me debloquer car je recois pas mal de paquet sur mon interface ce qui me fait monter facilement à 30 % d'occupation CPU ce qui est énorme pour ce petit programme...


    Merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Août 2008
    Messages : 505
    Points : 712
    Points
    712
    Par défaut
    Perso, je suis surpris qu'il soit nécessaire de threader l'envoi de paquet udp. Entrer dans un système de gestion de thread pour envoyer un paquet, puis passer au suivant, c'est pas optimal, il me semble.
    En fait, dans un cas pareil, je me demande si tout n'irait pas mieux sans thread du tout.

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 139
    Points : 57
    Points
    57
    Par défaut
    Oui, je suis d'accord avec toi mais sans thread, j'ai une occupation CPU qui dépasse les 30% et ca de façon linéaire. Donc je cherche un moyen d'optimiser l'envoie de paquet.

Discussions similaires

  1. Petit soucis avec Thread::Queue et une classe
    Par vodevil dans le forum Web
    Réponses: 16
    Dernier message: 09/06/2006, 21h41
  2. Réponses: 2
    Dernier message: 27/10/2005, 14h44
  3. Probleme Performance Procedure stockee
    Par DaxTaz dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 16/09/2005, 18h43
  4. Réponses: 14
    Dernier message: 31/08/2005, 17h21
  5. multithreading et performance
    Par philippe V dans le forum C++
    Réponses: 9
    Dernier message: 20/11/2004, 01h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo