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?
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%.
Ce genre de sons comme un mauvais comportement de rinçage, idéalement, vous verriez cohérent IO pas étire de 90 et 25.
Pourrait être une grande aide pour faire ceci:
http://www.percona.com/blog/2013/12/03/innodb_stats_on_metadata-slow-queries-information_schema/