web-dev-qa-db-fra.com

Identifier la cause des I / O élevés

J'essaie de diagnostiquer le goulot d'étranglement pour une activité d'E/S High-Ecrire sur un maître Percona (avec une réplication à un esclave). Le modèle de comportement est grossièrement cyclique et régulier: 60 minutes de 75 à 90% en écriture IO UTILISATION suivie de 10 minutes d'~ 25%. De temps en temps, ces pointes à un tel point que la frontage WebService n'est pas réagissant pendant quelques minutes.

Faire une liste de traitement montre le processus de réplication, puis un certain nombre de fils inactifs (bien que de temps en temps, il y a 1-2 commettre qui complète à l'époque où je réie la commande de la liste de processus) mais rien indiquant une requête active spécifique.

Variables d'état de la mémoire tampon InnoDb: mysql> SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_%'; +-----------------------------------------+-----------+ | Variable_name | Value | +-----------------------------------------+-----------+ | Innodb_buffer_pool_pages_data | 1678714 | | Innodb_buffer_pool_pages_dirty | 718 | | Innodb_buffer_pool_pages_flushed | 195847729 | | Innodb_buffer_pool_pages_LRU_flushed | 0 | | Innodb_buffer_pool_pages_free | 5299854 | | Innodb_buffer_pool_pages_made_not_young | 0 | | Innodb_buffer_pool_pages_made_young | 59369 | | Innodb_buffer_pool_pages_misc | 99319 | | Innodb_buffer_pool_pages_old | 619661 | | Innodb_buffer_pool_pages_total | 7077887 | +-----------------------------------------+-----------+ 10 rows in set (0.00 sec)

SHOW ENGINE INNODB STATUS donneBuffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000.

La section mysqld de my.cnf est

[mysqld]

user                           = mysql
default-storage-engine         = InnoDB
socket                         = /var/run/mysqld/mysqld.sock
pid-file                       = /var/run/mysqld/mysqld.pid

key-buffer-size                = 32M
myisam-recover                 = FORCE,BACKUP

max-allowed-packet             = 16M
max-connect-errors             = 1000000
innodb                         = FORCE

datadir                        = /srv/mysql/

server_id                      = 30
log-bin                        = /srv/mysql/mysql-bin
expire-logs-days               = 14
sync-binlog                    = 1 

tmp-table-size                 = 32M
max-heap-table-size            = 32M
query-cache-type               = 0 
query-cache-size               = 0 
max-connections                = 500
thread-cache-size              = 50
open-files-limit               = 65535
table-definition-cache         = 1024
table-open-cache               = 2048
tmpdir                         = /tmp

innodb-flush-method            = O_DIRECT
innodb-log-files-in-group      = 2 
innodb-log-file-size           = 512M
innodb-flush-log-at-trx-commit = 1
innodb-file-per-table          = 1 
innodb-buffer-pool-size        = 108G

log-error                      = /var/log/mysql/mysql-error.log
log-queries-not-using-indexes  = 1
slow-query-log                 = 1 
slow-query-log-file            = /var/log/mysql/mysql-slow.log

Le journal de requête lente a un certain nombre d'entrées, mais aucun d'entre eux n'est vécu de longue date. Un extrait d'échantillon est: use xxxxxxxxx; SET timestamp=1411484104; SELECT amnews_article.aid, amnews_article.sid_id, amnews_article.fid_id, amnews_article.url, amnews_article.url_hash, amnews_article.title, amnews_article.sha1, amnews_article.date_ts, amnews_article.summary, amnews_article.author_feed, amnews_article.author, amnews_article.language, amnews_article.fetched, amnews_article.processed, amnews_article.ngrams, amnews_article.indexed_ngram, amnews_article.topics_ngram, amnews_article.journals, amnews_article.persons, amnews_article.links, amnews_article.dois, amnews_article.verified, amnews_article.journals_version, amnews_article.duplicate_of_id, amnews_article.external, amnews_article.blog, amnews_article.last_updated, amnews_article.grouped de amnews_article COMMANDÉ PAR amnews_article.aid de la limite de descente 1;</ code>

En plus, je ne suis pas sûr de savoir pourquoi cette requête en fait dans le journal des requêtes lentes, car elle fonctionne rapidement et utilise des index, comme indiqué par une explication

[.____] + ---- + -------------- + ------------------------ + ------- + ----------------- + --------- + --------- + ----- + ------ + + ------- + [.____] | id | SELECT_TYPE | Table | Type | possible_keys | clé | key_len | Ref | rangées | Extra | [.____] + ---- + -------------- + ---------------- + ------ - + ----------------- + --------- + --------- + ----- + -------- - + -------- + 
 | 1 | Simple | Amnews_article | Index | Null | Primaire | 4 | Null | 1 | | [.____] + ---- + -------------- + ------------------------ + ------- + ----------------- + --------- + --------- + ----- + ------ + + ------- + 

Sous-jacents, les disques sont des plateaux de filature configurés comme une partition EXT4 LVM sur RAID1 et la machine est physique (bien que gérée) plutôt qu'à un VM. La partition de données est sur les mêmes disques (groupe de volumes LVM) en tant que partition du journal. RAM L'utilisation est d'environ 90% de 128g et échange est disponible mais non utilisé.

$ free -m
             total       used       free     shared    buffers     cached
Mem:        128912     117370      11542          0        516      36092
-/+ buffers/cache:      80761      48151
Swap:         2045          0       2045

La version est 5.5.36-34.2-648.Precise-journal

Modifier pour ajouter des informations demandées par Vérace:

Votre serveur Web est-il sur la même boîte? Le serveur Web est sur une boîte différente de la DB.

Y a-t-il des emplois cron? Il y a des cronjobs liés à la base de données, mais ils sont passés de divers hôtes différents. (Mais avec des requêtes ne montrant pas dans la liste de processus, je ne sais pas où diriger l'attention).

Comment déterminez-vous qu'il y a un goulot d'étranglement d'E/S? Nous utilisons NewRelic pour la surveillance du serveur et du service. Il produit des graphiques qui montrent les longues périodes de High IO Utilisation avec la floconneuse à 100 Mo/s. iotop -ao Plus de 10 minutes montrent que les processus responsables sont MySQL. (Eh bien, JDB est le top même mais qui est probablement attendu avec la configuration du disque)

Mes questions sont Twofold: Qu'est-ce que MySQL rédige tant de données si rien n'est affiché dans la liste de processus (c'est-à-dire comment puis-je savoir quelles requêtes sont responsables)? Y a-t-il des modifications de configuration que je peux apporter pour alléger l'IO haute presque perpétuel?

4
mattp

Le commentaire de Mattu ci-dessus sur la mise en cache était suffisant pour m'aider à trouver une solution. Alors que la lecture de ces paramètres mentionnés, je suis tombé sur innodb-flush-log-at-trx-commit qui a été réglé sur 1 mais je suis maintenant réglé sur 2. Il y a quelques tables que nous utilisons comme une file d'attente (refactorise cela dans une architecture différente plus adaptée à notre liste de TODO) et recevait donc beaucoup de Mises à jour par seconde, parfois même à la même rangée.

Étant donné que le travail effectué est de nature idempotente, la réduction de la fréquence de rinçage ne constituerait pas une perte de données perdue dans un scénario de défaillance. Effet On IO a été profond: il est maintenant stable à environ 40%, hésitant peut-être +/- 5%.

2
mattp

Ce genre de sons comme un mauvais comportement de rinçage, idéalement, vous verriez cohérent IO pas étire de 90 et 25.

  • Quelle est la méthode de rinçage adaptative utilisée (ou est-elle éteinte)? Garder_oovery?
  • Les pages voisines de rinçage sont-elles activées? Parfois, cela aide, parfois, ce n'est pas vraiment efficace. Généralement, c'est bon sur la filature des disques donc probablement pas le problème ici
  • Je dirais que la piscine tampon est trop grande si ses 108g/128g, mais je suppose que cela était comparé à un certain niveau
  • Quelles sont les pages sales?
  • innodb_write_io_threads?
  • innodb_read_io_threads?
  • innodb_io_capacité?

Pourrait être une grande aide pour faire ceci:

  • innodb_stats_on_metadata = 0

http://www.percona.com/blog/2013/12/03/innodb_stats_on_metadata-slow-queries-information_schema/

4
Matt Ullmer