web-dev-qa-db-fra.com

MySQL 5.5 High CPU Usage

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
3
adinindu

Observation n ° 1

Lorsqu'il vous engageait à utiliser InnoDB, vous devez également vous engager à régler pour plusieurs cœurs.

Observation n ° 2

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.

Observation n ° 3

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).

Observation n ° 4

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

ÉPILOGUE

Voici quelques-uns de mes messages passés sur le réglage innodub

Essaie !!!

3
RolandoMySQLDBA

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.

2
redguy