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

Plateformes (Java EE, Jakarta EE, Spring) et Serveurs Discussion :

Lancer des milliers de threads sur un VPS


Sujet :

Plateformes (Java EE, Jakarta EE, Spring) et Serveurs

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 22
    Points : 21
    Points
    21
    Par défaut Lancer des milliers de threads sur un VPS
    Bonsoir !

    Je viens de souscrire à un VPS M chez LWS. (2Go de RAM. caractéristiques dispo sur http://www.lws.fr/serveur_dedie_linux.php)

    Mon but est de faire tourner environ 2000 threads sur ce serveur. Le problème c'est que quand je lance mon programme, j'ai une erreur après avoir lancé entre 900 et 1200 threads.

    message from server: "Erreur de connexion à la BDD.java.sql.SQLException: null, message from server: "Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug"

    Je ne sais pas si ça vient du fait que j'ai pas assez de RAM ou si c'est une autre limitation qui entre en jeu. (A priori il resterait de la RAM dispo au moment ou j'obtiens l'erreur mais je n'en suis pas trop sûr, comment vérifier ?)

    Voici le contenu de mon fichier /etc/mysql/my.cnf

    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
    [client] 
    port = 3306 
    socket = /var/run/mysqld/mysqld.sock 
     
    # Here is entries for some specific programs 
    # The following values assume you have at least 32M ram 
     
    # This was formally known as [safe_mysqld]. Both versions are currently parsed. 
    [mysqld_safe] 
    socket = /var/run/mysqld/mysqld.sock 
    nice = 0 
     
    [mysqld] 
    # 
    # * Basic Settings 
    # 
    user = mysql 
    pid-file = /var/run/mysqld/mysqld.pid 
    socket = /var/run/mysqld/mysqld.sock 
    socket = /var/run/mysqld/mysqld.sock 
    port = 3306 
    basedir = /usr 
    datadir = /var/lib/mysql 
    tmpdir = /tmp 
    language = /usr/share/mysql/english 
    skip-external-locking 
     
     
    ############################################## 
    ############### Configuration 2Go 
    ############################################## 
    # 
    # * Fine Tuning 
    # 
    key_buffer = 256M 
    max_allowed_packet = 16M 
    table_cache = 128 
    thread_stack = 192K 
    thread_cache_size = 8 
    sort_buffer_size = 256M 
    read_buffer_size = 128M 
    read_rnd_buffer_size = 128M 
    net_buffer_length = 8M 
     
    # 
    # * Query Cache Configuration 
    # 
    query_cache_limit = 1M 
    query_cache_size = 16M 
     
    ############################################## 
     
    # This replaces the startup script and checks MyISAM tables if needed 
    # the first time they are touched 
    myisam-recover = BACKUP 
    max_connections = 1000 
    #table_cache = 64 
    #thread_concurrency = 10 
    expire_logs_days = 10 
    max_binlog_size = 100M 
     
    [isamchk] 
    key_buffer = 16M 
     
    [mysqldump] 
    quick 
    quote-names 
    max_allowed_packet = 16M 
     
    [mysql] 
    #no-auto-rehash # faster start of mysql but no tab completition

    Je sais que ça doit être l'un de ces paramètres que je dois modifier mais je ne sais lequel.

    Quelqu'un saurait d'où cela peut venir ?

    Merci d'avance, et bonne soirée !

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 072
    Points : 7 974
    Points
    7 974
    Par défaut
    Nous non plus, car c'est le fichier de configuration de mysql que tu postes là...
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    Visiblement quand on tappe l'erreur dans google tout le monde a l'air de dire que ça vient de là

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 072
    Points : 7 974
    Points
    7 974
    Par défaut
    Non. Je pense que ton erreur se situe du coté java qui essaye d'initialiser trop de thread pour la mémoire disponible.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    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
    Bonjour,

    des threads, ca consomme de la mémoire, en java comme en C. Si chacun de tes threads java crée un connexion à la base de données, celle-ci va s'écrouler. On a des serveur oracle ici, et je t'assure que si je crée un appli qui demande 2000 connexion DB, je vais me faire trucider par le DBA

    Donc la première chose, c'est de limiter le nombre de connexion que tu crée, par exemple en utilisant un connection pool.


    Ensuite, une autre limitation, c'est le nombre de threads autorisé par process. Souvent, c'est de l'ordre de 1024, on monte parfois à 2048 sur certains serveur... Mais l'intérêt est limité, 90% de ces threads se tourneront les pouces en attendant leur tour, tu va écrouler tes performances parce que tu va passer plus de temps à faire du switch de contexte qu'à faire les calculs. Faudrait penser à revoir le design de ce coté là.

    Coté consommation mémoire, en java, chaque thread à sa propre stack. Qui fait typiquement 512k. Donc 2000 threads consommeront déjà 1G pour leur propre existence. Ca représente quand même la moitié de ta RAM. Il faut savoir aussi que sur les machine 64bit, c'est plus, et qu'on peux monter à 2M par thread (donc 4G juste pour les threads). Tu peux ajuster cette taille avec -Xss, il semble que la pluspart des appli java peuvent vivre avec un Xss à 128k, à tester. Si tu descend à 500 thread de 128k, on arrive à 62M de RAM consommé par les threads, c'est déjà plus raisonnable.


    Tu n'as que 2 core sur ton serveur, je vois mal l'intérêt d'aller tapper 2000 threads dessus ^^

Discussions similaires

  1. souci pour lancer des Thread simultanément
    Par Tyrael62 dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 18/08/2008, 15h21
  2. utilisation des threads sur C++ builder 6
    Par badardar dans le forum C++
    Réponses: 3
    Dernier message: 16/04/2008, 13h17
  3. Lancer plusieur thread sur la meme fonction
    Par daviddu54 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 17/01/2008, 12h34
  4. Réponses: 8
    Dernier message: 09/05/2007, 01h35

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