web-dev-qa-db-fra.com

Mysql montrant 100% d'utilisation du CPU

Je rencontre des problèmes avec mon serveur MYSQL installé avec Cpanel. Mon serveur affiche 100% d'utilisation de mysql même si je n'ai pas trop de trafic sur le web.

J'utilise CentOS 6.5x64 avec SSD 80 Go et Ram 8 Go avec noyau 4CPU.

my.cnf:

[mysqld]
max_connections=500
key_buffer=128M
myisam_sort_buffer_size=35M
join_buffer_size=1M
read_buffer_size=1M
sort_buffer_size=2M
table_cache=4000
thread_cache_size=286
interactive_timeout=25
wait_timeout=7000
connect_timeout=10
max_allowed_packet=268435456
max_connect_errors=10
query_cache_limit=2M
query_cache_size=256M
query_cache_type=1
tmp_table_size=16M
innodb_buffer_pool_size=134217728
open_files_limit=10000
[mysqld_safe]
[mysqldump]
quick
max_allowed_packet=16M
[myisamchk]
key_buffer=64M
sort_buffer=64M
read_buffer=16M
write_buffer=16M

Voici la sortie de MySQLTuner:

-------- Storage Engine Statistics -------------------------------------------
[--] Status: +ARCHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MRG_MYISAM
[--] Data in MyISAM tables: 164M (Tables: 88)
[--] Data in InnoDB tables: 33M (Tables: 239)
[--] Data in PERFORMANCE_SCHEMA tables: 0B (Tables: 17)
[!!] Total fragmented tables: 129

-------- Security Recommendations  -------------------------------------------
[OK] All database users have passwords assigned

-------- Performance Metrics -------------------------------------------------
[--] Up for: 15m 2s (83K q [92.549 qps], 13K conn, TX: 44M, RX: 5M)
[--] Reads / Writes: 61% / 39%
[--] Total buffers: 544.0M global + 4.5M per thread (500 max threads)
[OK] Maximum possible memory usage: 2.7G (34% of installed RAM)
[OK] Slow queries: 0% (0/83K)
[OK] Highest usage of available connections: 23% (116/500)
[OK] Key buffer size / total MyISAM indexes: 128.0M/59.2M
[OK] Key buffer hit rate: 97.9% (24K cached / 527 reads)
[OK] Query cache efficiency: 54.3% (18K cached / 33K selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 1% (5 temp sorts / 388 sorts)
[OK] Temporary tables created on disk: 0% (0 on disk / 374 total)
[OK] Thread cache hit rate: 99% (116 created / 13K connections)
[OK] Table cache hit rate: 98% (465 open / 474 opened)
[OK] Open file limit used: 3% (311/10K)
[!!] Table locks acquired immediately: 58%
[OK] InnoDB buffer pool / data size: 128.0M/33.6M
[OK] InnoDB log waits: 0
-------- Recommendations -----------------------------------------------------
General recommendations:
Run OPTIMIZE TABLE to defragment tables for better performance
MySQL started within last 24 hours - recommendations may be inaccurate
Enable the slow query log to troubleshoot bad queries
Optimize queries and/or use InnoDB to reduce lock wait

Voici la sortie de mon TOP:

top - 12:01:06 up 1 day,  1:02,  1 user,  load average: 10.37, 9.22, 8.61
Tasks: 399 total,   1 running, 397 sleeping,   0 stopped,   1 zombie
Cpu(s): 84.1%us, 15.1%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.2%si,      0.7%st
Mem:   8191528k total,  6042780k used,  2148748k free,   242064k buffers
Swap:        0k total,        0k used,        0k free,  4785012k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
24515 mysql     20   0 2732m 165m 6264 S 303.8  2.1  42:43.18 mysqld
19471 root  20   0  174m  10m 6148 S  1.0  0.1   0:00.03 php
19523 root  20   0  172m  10m 5864 S  1.0  0.1   0:00.03 php
19533 root  20   0  172m   9m 5804 S  0.7  0.1   0:00.02 php
19535 root  20   0  172m  10m 5864 S  0.7  0.1   0:00.02 php

Quelle pourrait être la cause de ce problème?
Dois-je apporter des modifications à mon my.cnf pour empêcher le serveur de se bloquer?
Ou dois-je acheter un nouveau serveur avec 16 Go de RAM?

5
Rahukaal

En regardant vos coordonnées, nous pouvons conclure ces recommandations générales:

  1. Votre ratio LECTURE: ECRITURE (61: 39) donne l'indice que vos types de moteur doivent être changés en Innodb. Avant cela, vérifiez la sortie de

    SHOW ENGINE INNODB STATUS\G; SHOW FULL PROCESSLIST;

    pendant les heures de pointe. Vous verrez très probablement des requêtes dans l'état LOCK. Les verrous de table sont la seule grande limitation de MyISAM. Si vous avez un grand nombre d'écritures et de sélections simultanées et que les performances des requêtes doivent être constamment rapides, Innodb est le seul choix en raison d'un meilleur mécanisme de verrouillage (row-level)

  2. Total des tableaux fragmentés: 129. Courir OPTIMIZE TABLE et défragmenter le tout pour de meilleures performances

  3. Jetez un oeil dans votre slow_query.log, Vérifiez Query_time, Lock_time, Rows_sent, Rows_examined. Si vous trouvez des requêtes où le ratio de Rows Sent / Rows Examined set est élevé, alors cette requête est bonne pour optimization. Il est possible que certaines requêtes dans slow_query.log utilisent beaucoup de ressources CPU.

  4. Vérifiez l'état du serveur concernant RAM et espace disque disponible: free -m , df -h. Si vous avez de la mémoire disponible, augmentez le innodb_buffer_pool_size pour qu'il y ait plus de cache.

  5. Toujours bon pour régler ces paramètres dans la configuration MySQL

    innodb_fast_shutdown=0 innodb_log_buffer_size innodb_log_file_size innodb_flush_method=O_DIRECT query_cache_size=0

CAVEAT:

Liste de contrôle 1: CPU des processus MySQL, si possible pour augmenter la liste de contrôle CPU 2: RAM, si l'ensemble de données est adapté à la RAM. Liste de contrôle 3: paramètres liés à la connexion

Aborted_connects, CONNECTIONS, MAX_USED_CONNECTIONS, Open_files, Open_tables, OPENED_FILES, Opened_tables, requêtes, Slow_queries, Threads_connected, Threads_created, THREADS_RUNNING, PERFORMANCE_SCHEMA, query_cache_size, WAIT_TIMEOUT, long_query_time, interactive_timeout, connect_timeout, MAX_CONNECTIONS, LOCK_WAIT_TIMEOUT, TX_ISOLATION, max_allowed_packet, GENERAL_LOG, TABLE_OPEN_CACHE, SLOW_QUERY_LOG, OPEN_FILES_LIMIT, INNODB_LOCK_WAIT_TIMEOUT

Liste de contrôle 4: Paramètres liés à la mémoire key_buffer_size, query_cache_size, innodb_buffer_pool_size, innodb_log_buffer_size, max_connections, read_buffer_size, read_rnd_buffer_size, sort_buffer_size, join_buffer_size_size_size

Liste de contrôle 5: autres paramètres InnoDB importants innodb_log_file_size, innodb_file_per_table, innodb_flush_log_at_trx_commit, innodb_flush_method, innodb_fast_shutdown

Liste de contrôle 6: mysqltuner

Jointures effectuées sans index: Taux de réussite du cache de table:

-------- Métriques MyISAM ---------------------------------------- ----------------- [!!] [!!] Taux de réussite du tampon d'écriture: -------- Métriques InnoDB --------- ------------------------------------------------ [! !] Pool de mémoire tampon InnoDB/taille des données: [!!] Ratio taille du fichier journal InnoDB/taille du pool de mémoire tampon InnoDB: [!!] Instances de pool de mémoire tampon InnoDB:

Liste de contrôle 7: Liste de processus Les requêtes ci-dessous se trouvent dans l'état "Envoi de données" pendant longtemps

Liste de contrôle 8: journal des requêtes lentes - rapport Rows_examined vs Rows_sent très élevé,

Liste de contrôle 9: index en double (le cas échéant)

Liste de contrôle 10: expliquer le plan de quelques requêtes lentes

Liste de contrôle 11: vérifier si les colonnes de clause sont correctement indexées (requêtes non indexées)

Liste de contrôle 12: Vérifiez le verrouillage de la table, le verrouillage des métadonnées, le blocage, le cas échéant.

Liste de contrôle 13: Tout travail de maintenance s'exécute à intervalles (par exemple, mysqlcheck, mysqldump etc.)

Liste de contrôle 14: ressources matérielles, disques lents, reconstruction RAID, E/S disque, réseau saturé, bande passante réseau sans fil avec augmentation du nombre de threads.

13
Koustuv Chatterjee