Je travaille avec un client avec un site Web élevé de trafic (500k visiteurs et 600-800 utilisateurs actifs à une heure). Cela utilise wordpress et la base de données utilise Myisam Moteur. Le problème que nous avions était une utilisation élevée du processeur dans le serveur. Tout le temps de charge de la CPU est 15-20. Nous avons utilisé LIPESPEED et MYSQL 5.1 avec CENTOS 5.9 Dans Dual Xeon L5506, 12GB RAM Server avec HDD SATA.
J'ai donc analysé la base de données et trouvé qu'il n'y a que 4 Go de données et de taille d'index de cette dB et ont décidé de convertir en InnoDB. Une fois que nous l'avons fait, nous avons fini par avoir 80-150 CPU Charge et Server était sur le point de planter. Nous avons donc transféré MySQL vers un autre serveur avec la même configuration, mais à MySQL 5.5.
Dans la nouvelle charge de la CPU de serveur DB est de 1-2 et un serveur Web toujours sur la charge CPU 4-6 constante.
Voici mon my.cnf
[mysqld]
innodb_file_per_table=1
local-infile = 0
default-storage-engine = InnoDB
max_connections = 1000
innodb_buffer_pool_size = 8G
innodb_flush_method = O_DIRECT
innodb_log_file_size = 256M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 2
innodb_thread_concurrency = 8
innodb_file_format = Barracuda
myisam_sort_buffer_size = 16MB
query_cache_type = 1
query_cache_limit = 2M
query_cache_size = 256M
thread_cache_size = 16K
key_buffer_size = 128M
max_heap_table_size = 128M
tmp_table_size = 128M
join_buffer_size = 32M
read_buffer_size = 32M
read_rnd_buffer_size = 1M
sort_buffer_size = 32M
table_cache = 4K
open_files_limit = 65535
log-slow-queries = /var/log/mysql/slowqueries.log
long_query_time = 3
PS: Toutes nos données ne sont pas innovées. Les valeurs de MyISAM sont donc placées après une bonne analyse.
Statistiques: pendant 4 heures
Questions since startup: 7,339,471 Documentation
ø per hour: 1,704,102
ø per minute: 28,402
ø per second: 473
Traffic ø per hour
Received 4.8 GiB 1.1 GiB
Sent 248.5 GiB 57.7 GiB
Total 253.3 GiB 58.8 Gi
Lorsqu'il vous engageait à utiliser InnoDB, vous devez également vous engager à régler pour plusieurs cœurs.
Je vois que tu as innodb_thread_concurrency = 8
. Si vous définissez innodb_thread_concurrency sur 0 (qui correspond à la valeur par défaut), vous aurez une concurrence infinie. Cela permettrons au moteur de stockage InnoDB décider de la manière de faire de nombreux threads qu'il convient et peut gérer.
Votre serveur DB a 12 Go de RAM. Votre pool de tampons InnoDb est plus grand que la moitié de la RAM. Vous devez partitionner la piscine tampon en réglant innodb_buffer_pool_instances à 2. En conjonction avec cela, vous devez exécuter numactl --interleave=all
(Non applicable à la VMS).
Je vois que tu as innodb_file_format = Barracuda
. Je souhaite que vous puissiez revenir à innodb_file_format = Antelope
. Pourquoi revenir à un non compressé? Il a tendance à bloquer le pool tampon InnoDb car les données compressées et non compressées et les pages d'index coexistent dans le pool tampon. Je viens d'écrire à ce sujet: voir mon post innodb_file_format barracuda
Voici quelques-uns de mes messages passés sur le réglage innodub
Oct 22, 2012
: Quelle devrait être mysql innodb_buffer_pool_size?Jul 23, 2012
: Comment tirer le meilleur parti de MySQL sur une machine quadcore avec 16 Go de RAM?Jul 21, 2012
: InnoDB - Haute disque Ecrire des E/S sur ibdata1 File et ib_logfileSep 20, 2011
: Multi Cores et MySQL PerformanceSep 12, 2011
: possible de rendre MySQL utiliser plus d'un noyau?Feb 12, 2011
: Comment syntonisez-vous MySQL pour une charge de travail innovée lourde?Je suppose que vous êtes inquiet par la charge de la CPU du serveur Web en ce moment, puisque la charge 1-2 sur une base de données occupée est assez agréable. J'ai remarqué que vous avez:
long_query_time = 3
dans votre configuration. Avec ce paramètre, vous n'atteignez pas toutes les requêtes de course longue - 3 secondes est très longue pour un site Web occupé. Quand PHP== Demande à une base de données et attend 3 secondes, le processus du serveur Web est en état exécutable et augmente la charge. Pour voir cet effet, écrivez A PHP Script qui bouclait une requête Select Sleep (3), exécutez une centaine de ces scripts en parallèle et voyez comment cela affecte la charge).
Ma suggestion est de réduire long_query_time
à quelque chose de plus raisonnable (0,2? 0,1?), Traitez le journal de requête lent avec Pt-Query-Digest et traiter avec les requêtes qui prennent la plupart du temps cumulativement. Puisque vous ne pouvez éventuellement pas changer les requêtes elles-mêmes, vous pourriez avoir une chance avec l'indexation des tables populaires.