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

Langage Java Discussion :

Probléme lors de l'exécution de plusieurs jars en parallél


Sujet :

Langage Java

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Probléme lors de l'exécution de plusieurs jars en parallél
    Bonjour,
    je suis actuellement sur un projet ou j'ai développé un jar exécutable qui appel un Web service qui met jusqu'à 10 secondes à répondre.

    ce jar est appelé par un programme perl.
    Pour des raison historique nous ne pouvons pas modifier cet architecture.

    afin accélérer le traitement nous devons appeler le jar plusieurs fois de façon parallèle, nous faisons donc un fork dans le code perl qui exécute la commande:
    java -jar callWS.jar

    Le problème que nous rencontrons est que les jars ne sont s'exécutent en rafale mais avec des pause, comme le montre les logs ci-dessous

    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
    début de l'exécution de l'appel 1: 15:39:10:054
    début de l'exécution de l'appel 2: 15:39:10:668
    début de l'exécution de l'appel 3: 15:39:11:017
    début de l'exécution de l'appel 4: 15:39:12:369
    début de l'exécution de l'appel 5: 15:39:13:837
    début de l'exécution de l'appel 6: 15:39:18:084
     
    fin l'exécution de l'appel 3: 15:39:19,126
    fin l'exécution de l'appel 1: 15:39:19,530
     
    début de l'exécution de l'appel 6: 15:39:20:109
     
    fin l'exécution de l'appel 4: 15:39:20,592
    fin l'exécution de l'appel 2: 15:39:20,654
     
    debut de l'exécution de l'appel 7: 15:39:22,329
     
    fin l'exécution de l'appel 5: 15:39:23,911
    Comme on peut le voire les jar sont bien exécuté en parallèle, et non séquentiellement.
    le problème, est dans le démarrage on voit des temps de pause, en effet on voit:
    614ms entre le début de l'appel 1 et le début de l'appel 2
    349ms entre le 2 et le 3
    1s352ms entre le 3 et le 4
    1,5s entre le 4 et le 5
    5s entre le 5 et le 6
    les pauses sont en moyenne de 4s sur le reste des appels

    Je ne sais pas à quoi sont du ces pause, j'imagine que étant un jar exécutable, il lui faut le temps de démarré la jvm (mais je n'en suis pas sur).

    est ce que quelqu'un aurait une solution ou un conseil afin supprimer ces pauses.
    P.S: nous avons vérifié coté perl les appels sont fait toutes les 10ms

    Merci par avance.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    est-ce que vous avez vérifié que la machine est capable (temps CPU, IOS) de lancer toutes ces jvms en parallèle?

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Comment puis-je faire cette vérification ?
    la machine dispose de 4Go de ram, le traitement effectué par le jar étant assez simple (juste un appel à un web service), j'ai exécuté le jar en limitant la mémoire de la jvm à 64Mo (-Mxm64m), mais cela n'a pas modifié le comportement. Par contre je n'ai pas d'information sur le processeur.

    Est il possible de n'exécuter qu'une seul JVM, puis d'y faire s'y exécuter les jars, sans que ses derniers ne lancent leurs propre JVM à chaque fois

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ces messages (début/fin) sont générés par le jar ou par le script appelant?

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    ce sont tous les logs du jar

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    il faudrait voir dans le jar ce que tu fais avant de commencer à logguer. Il est possible que le delai soit du à l'un ou l'autre serveur qui mette du temps à répondre.

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    La seule chose que je fais avant de logguer "début de l'exécution de l'appel" est de récupéré les argument passés en paramètre de l'appel au jar par le biais d'une classe utils dont j'ai déjà mesuré les performances, elle répond en quelques millisecondes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    		Map<String, String> parameters = Utils.getParameters(args);
    		maxRetry = Integer.parseInt(parameters.get(MAX_RETRY));
    		delay = Long.parseLong(parameters.get(DELAY));
    		id = parameters.get(ID);
    		long t1 = Calendar.getInstance().getTimeInMillis();
    		logger.fatal("début de l'exécution de l'appel "+id+" + new SimpleDateFormat("HH:mm:ss:SSS").format(new Date(t1)));

  8. #8
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Il faudrait également ajouter un log dans le code perl pour connaître le temps entre l'ordre de démarrage de la JVM et le début du code Java.

    Sinon, au lieu de forker en Perl, ne serait-il pas plus judicieux de faire des thread en Java, pour ne lancer qu'une seule JVM (si le projet le permet, bien entendu) ? Il suffirait de donner en paramètre le nombre de Thread à créer, et le programme Java pourrait se débrouiller.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    en effet c'est ce qui serait le mieux, ce qu'il y a c'est que chaque appel perl, envoie des paramètres au jar.
    Donc on échappera de toutes façon pas aux fork en perl.
    Je cherchais une solution qui nous aurais permis de ne pas changer l'architecture, mais visiblement ce n'est pas possible, (1 appel à un jar exécutable = une JVM de lancé) et donc le projet ou ce fonctionnement est répliqué 4 fois, on se retrouve donc avec 80 JVM exécuté en même ce qui n'est pas tenable.
    nous allons donc probablement revoir notre architecture, et donc passer les argument du perl vers java avec des sockets.

    Merci à ceux qui ont tenté de m'aider.
    Bonne continuation

    P.S: @dinobogan j'adore ta signature, j'aurai sans doute du la lire avant de démarré ce projet

Discussions similaires

  1. problème lors de l'exécution de mon .jar
    Par Bruninhoo dans le forum Général Java
    Réponses: 15
    Dernier message: 07/01/2009, 13h02
  2. Réponses: 10
    Dernier message: 30/01/2007, 09h29
  3. [Procédure] problème lors de l'exécution
    Par pinocchio dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 31/10/2006, 14h23
  4. Problème lors de l'exécution d'un trigger
    Par Madoka dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 30/06/2006, 08h33
  5. Problème lors de l'exécution de mes programmes
    Par darkmalak01 dans le forum Langage
    Réponses: 7
    Dernier message: 27/09/2005, 18h35

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