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
la source
skip-name-resolve
désactivé et peut-il être activé?Réponses:
J'ai écrit quelques articles dans le StackExchnage
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 !!!
la source
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:
Cela peut faire mal. Par-dessus, disons,
50M
le QC passe trop de temps à l'entretien. L'avoirON
peut aussi être un gaspillage. FaitesSHOW GLOBAL STATUS LIKE 'Qc%'
pour vérifier l'efficacité.la source