Configuration MySQL 5.1 InnoDB / 24 Go de RAM - charge élevée bi-xeon

10

je lance une application facebook qui compte actuellement 300 à 600 utilisateurs simultanés (et en pleine croissance). Pour préparer le matériel pour la croissance, j'ai changé mon i7 / 12 Go de RAM / 2 x 80 Go d'Intel x25 ssd (Debian 5.0 / mysql 5.0 / 64bit) en un bi-xeon / 24 Go de RAM / 2x 120 Go intel 320 ssd (ubuntu 10.10 / mysql 5.1 / 64 bits).

maintenant, je suis confronté au problème que les performances sont pires que sur la "petite boîte". Sur les deux serveurs, j'utilise nginx / php fcgi pour servir le contenu.

J'utilise innodb uniquement, avec des lectures / écritures d'environ 65% / 35%. Environ 800 - 1000 qps mais toutes les requêtes sont simples et ne rejoignent jamais plus d'une table supplémentaire. Tous les index sont définis et aucune requête individuelle n'est enregistrée dans le journal lent (> 2 s). Pour le moment, j'ai environ 400 Mo de données (environ 1 Go avec des index) qui devraient doubler chaque mois.

J'adorerais tous ceux qui pourraient me donner un indice sur ce qu'il faut changer pour que cela fonctionne mieux.

L'ancienne configuration sur la boîte i7 était comme ça (mixte myisam / innodb), fonctionnait assez bien jusqu'à 800+ utilisateurs.

vieux my.cnf

   key_buffer              = 3000M
   max_allowed_packet      = 128M
   thread_stack            = 192K
   thread_cache_size       = 8
   max_connections        = 400
   table_cache            = 8000
   thread_concurrency     = 16
   query_cache_limit       = 8M
   query_cache_size        = 128M
   wait_timeout            = 10
   interactive_timeout     = 10
   connect_timeout         = 600
   low_priority_updates    = 1
   join_buffer_size        = 8M
   read_buffer_size        = 2M
   sort_buffer_size        = 3M
   myisam_sort_buffer_size = 32M
   read_rnd_buffer_size    = 4M
   innodb_buffer_pool_size = 3G
   innodb_log_buffer_size  = 8M

La nouvelle configuration sur la boîte bi-xeon est comme ça (pur innodb), provoquant une charge élevée avec plus de 300 utilisateurs. Environ 30 processus mysql en haut de la liste des processus.

E / S disque:

    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
              36.28    0.00    1.60    0.17    0.00   61.95

my.cnf

    key_buffer              = 64M
    max_allowed_packet      = 1M
    thread_stack            = 192K
    thread_cache_size       = 128
    max_connections        = 500
    table_cache            = 512
    #thread_concurrency     = 10
    sort_buffer_size        = 256K
    read_buffer_size        = 256K
    read_rnd_buffer_size    = 256K
    tmp_table_size          = 32M
    max_heap_table_size     = 32M
    query_cache_limit       = 1M
    query_cache_size        = 128M
    query_cache_type        = 1

    innodb_file_per_table = 1
    innodb_data_file_path = ibdata1:1000M:autoextend
    innodb_buffer_pool_size = 16384M
    innodb_additional_mem_pool_size = 8M
    innodb_flush_log_at_trx_commit = 1
    innodb_support_xa = 0
    innodb_lock_wait_timeout = 50
    innodb_flush_method=O_DIRECT
    innodb_log_files_in_group = 2
    innodb_log_file_size = 128M
    innodb_log_buffer_size = 8M
    innodb_thread_concurrency = 12
Kilian
la source
Hmmm, est skip-name-resolvedésactivé et peut-il être activé?
Wrikken

Réponses:

7

J'ai écrit quelques articles dans le StackExchnage

  1. Optimisation de MySQL pour InnoDB et MyISAM
  2. Comment garder InnoDB Diskspace sous contrôle
  3. Un autre point de vue sur la gestion de l'espace disque MySQL
  4. Point de vue sur l'optimisation InnoDB
  5. InnoDB Fine Tuning

Veuillez les lire pour obtenir les conseils dont vous avez besoin.

Maintenant, pour des problèmes plus urgents: vous avez mentionné que vous disposez de 400 Mo de données, 1 Go avec des index. Cela me fait peur que vos index sont 50% plus gros que les données. Cependant, étant donné que toutes vos données sont InnoDB et que vous êtes satisfait des performances actuelles de la requête, vos paramètres sont plus que adéquats, notamment les 16384 Mo de innodb_buffer_pool_size. C'est 16 Go. Vous êtes tous là. Mais attendez !!! Votre innodb_log_file_size fait 128M? Beaucoup trop petit compte tenu du pool de mémoire tampon de 16 Go. Vous devez redimensionner les fichiers ib_logfile (définissez innodb_log_file_size sur 2047M).

Vous pouvez rencontrer une charge par thread. Essayez de définir vos tampons de connexion (join_buffer_size, sort_buffer_size, read_buffer_size, read_rnd_buffer_size)

De moi: pourquoi MySQL dit que je n'ai plus de mémoire?

De @DTest: Comment calculez-vous la variable mysql max_connections?

Essaie !!!

RolandoMySQLDBA
la source
il s'agissait de définir des index ... maintenant j'ai des colonnes qui sont double indexées dans d'autres combinaisons ... et j'ai maintenant 35 Go de données et 10'000qps ... et ça marche comme de la soie.
Kilian
0
  • Avez-vous converti certaines tables de MyISAM en InnoDB?
    Si tel est le cas, recherchez des améliorations / dégradations subtiles des performances dans http://mysql.rjweb.org/doc.php/myisam2innodb
  • innodb_flush_log_at_trx_commit = 1
    - provoque une écriture dans le journal après chaque transaction. Pensez à utiliser = 2.
  • max_connections- SHOW GLOBAL STATUS LIKE 'max_used_connections'
    - qui vous dira combien vous en aviez besoin depuis le démarrage.
  • cache de requête:

    query_cache_size        = 128M
    query_cache_type        = 1
    

    Cela peut faire mal. Par-dessus, disons, 50Mle QC passe trop de temps à l'entretien. L'avoir ONpeut aussi être un gaspillage. Faites SHOW GLOBAL STATUS LIKE 'Qc%'pour vérifier l'efficacité.

Rick James
la source