2014-05-21 1 views
4

J'ai une application web qui doit gérer une simultanéité élevée, comme 100 utilisateurs interrogeant les mêmes 5 tables (l'une d'entre elles, renvoie plus de 500 lignes) et d'autres utilisateurs insérant dans ces tableaux en même temps.Ce qui serait une bonne configuration bonecp pour une haute simultanéité

Lorsque trop d'utilisateurs utilisent, la concurrence est trop élevée, mon application se bloque et je dois redémarrer tomcat. Je ne pouvais pas trouver beaucoup dans les journaux. Quand j'exécute "afficher la liste des processus"; dans MySQL, il y a des processus pour chaque connexion et la plupart sont avec le statut "Query" ... avant que l'application ne se bloque, un processus par un, passe en statut "Sleep", jusqu'à ce que tous les processus aient ce statut et l'application se bloque.

Il est très difficile de diagnostiquer ce qui se passe ... J'essaie de mieux synchroniser le code, sans aucun succès ... eh bien, je suis ici pour demander des opinions sur si j'utilise un bon bonecp configuration à utiliser dans cet environnement:

<property name="bonecp.idleMaxAgeInMinutes">10</property> 
      <property name="bonecp.maxConnectionAgeInSeconds">3000</property> 
      <property name="bonecp.idleConnectionTestPeriodInMinutes">5</property> 
      <property name="bonecp.connectionTestStatement">/* ping */ SELECT 1</property> 
      <property name="bonecp.partitionCount">2</property> 
      <property name="bonecp.acquireIncrement">2</property> 
      <property name="bonecp.maxConnectionsPerPartition">12</property> 
      <property name="bonecp.minConnectionsPerPartition">5</property> 
      <property name="bonecp.statementsCacheSize">50</property> 
      <property name="bonecp.releaseHelperThreads">3</property> 

Selon ma configuration MySQL, j'utilise par défaut de tout, sauf ce deux:

autocommit = 0 
innodb_thread_concurrency = 8 

(le serveur a 3 CPU et 1 disque)

Est-ce que vous me conseilleriez de changer quelque chose? Merci!

Répondre

3

Si vous utilisez HikariCP, je recommande de commencer par les valeurs par défaut et de voir comment cela fonctionne pour vous. Je recommande également de lire le MySQL configuration tips sur le wiki. Si vous avez des questions, vous obtiendrez des réponses plus rapides dans notre groupe Google, mais vous pouvez bien sûr également demander ici (mais nous vérifions ici moins souvent).

8

Comme l'auteur de BoneCP, je vous conseille de jeter un oeil à cette piscine à la place: https://github.com/brettwooldridge/HikariCP

parce BoneCP est maintenant à la fois ancienne et superseeded par HikariCP qui offre des performances supérieures.

+0

merci pour le partage –

1

Avant d'utiliser boneCP vous devez avoir une bonne compréhension de toutes les configurations comme belows

# Whether auto commit should be used 
    autoCommit = true 

    # If non null, the transaction isolation level to use. 
    isolation = null 

    # Whether the database should be treated as read only 
    readOnly = false 

    # Whether opened statements should be automatically closed 
    closeOpenStatements = true 

    # The pool partition count 
    partitionCount = 1 

    # The maximum number of connections per partition 
    maxConnectionsPerPartition = 50 

    # The minimum number of connections per partition 
    minConnectionsPerPartition = 5 

    # The increment to acquire connections in 
    acquireIncrement = 1 

    # The acquire retry attempts 
    acquireRetryAttempts = 10 

    # The delay to wait before retrying to acquire a connection 
    acquireRetryDelay = 1 second 

    # The connection timeout 
    connectionTimeout = 1 second 

    # The idle age to expire connections 
    idleMaxAge = 10 minutes 

    # The maximum a connection should live for 
    maxConnectionAge = 1 hour 

    # Whether JMX reporting should be disabled 
    disableJMX = true 

    # Whether statistics should be kept 
    statisticsEnabled = false 

    # How frequently idle connections should be tested 
    idleConnectionTestPeriod = 1 minute 

    # Disable connection tracking 
    disableConnectionTracking = true 

    # The time limit for executing queries. 0 means no time limit. 
    queryExecuteTimeLimit = 0 

    # Whether the connection should be reset when closed 
    resetConnectionOnClose = false 

    # Whether unresolved transations should be detected 
    detectUnresolvedTransactions = false 

    # An SQL statement to execute to test if a connection is ok after it is created. 
    # Null turns this feature off. 
    initSQL = null 

    # An SQL statement to execute to test if a connection is ok before giving it out of the pool. 
    # Null turns this feature off. 
    connectionTestStatement = null 

    # Whether SQL statements should be logged 
    logStatements = true 

Tune votre application en changeant params ci-dessus et prend celui qui conviennent le mieux à vous. le réglage ci-dessus fonctionne bien pour mon application [Java Play framework]

Questions connexes