web-dev-qa-db-fra.com

IO Attendez autant de ralentissement (EXT4 JDB2 à 99% IO) lors de la commission MySQL

J'écris un indexeur, à l'aide de Python, qui indexe les documents et insérez-les dans la base de données, avant qu'il ne s'agissait d'un processus unique, mais je l'ai désormais effectué à la multiproduction avec 4 processus parallèles en cours d'exécution.Après chaque extraction de texte, elle insère dans la base de données et fait une commission.

Maintenant, il frappe IO Problème, le problème principal IO n'est pas mon processus, mais le système de trafic de JDB2 EXT4. Il est à 99,99% et CPU CUTUME à attendre IO à chaque commit MySQL.

J'ai vu beaucoup avoir ce problème sur Internet et leur solution consiste à monter à l'aide de la barrière = 0. Cela désactiverait-il totalement la journalisation? Mes serveurs ont des hauts et tentant de le faire, devrais-je?

14
Phyo Arkar Lwin

Il y a toujours un compromis entre la résilience et la performance.

Avec MySQL sur EXT4, les barrières = 1 défaut provoquent effectivement un ralentissement, mais la première action ne doit pas être de désactiver la journalisation ou d'activer les données = ré-retour.

Premièrement, si la résilience est de grande importance, un raid reculé de la batterie en vaut certainement la peine.

Les options de montage que j'ai choisies, en particulier sur le raid non-batterie, sont les suivantes:

/dev/mapper/vg-mysql--data  /var/lib/mysql/data ext4  defaults,noatime,nodiratime,barrier=1,data=ordered  0 0

Cela n'utilise intentionnellement pas de données = ré-retour car je ne veux pas risquer la corruption du système de fichiers entraînant des "anciennes données à apparaître dans des fichiers après une récupération de crash et de journal" (Devis it de man mount).

La configuration idéale dans My.cnf pour une résilience totale autour des paramètres associés aux E/S sont les suivants:

[mysqld]
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1

J'ai opté pour la séquence de compromis suivante pour augmenter les performances:

  1. sync_binlog = 0: Ceci est la première configuration MySQL que je change de la résilience totale. La raison en est qu'il donne une amélioration significative des performances, en particulier lorsque binlog_format=row (Malheureusement requis pour la JIRA). J'utilise suffisamment de réplicas MySQL dans le groupe que si le binlog devait corrompre par un scénario de perte de puissance, je ferais une copie binaire d'une autre réplique.
  2. innodb_flush_log_at_trx_commit = 2: Tandis qu'une valeur de 1 est requise pour la conformité acide complète, avec une valeur de 2 ", le tampon de journal est écrit dans le fichier à chaque validation, mais l'opération d'affleurement sur disque n'est pas effectuée. Cependant, le rinçage sur le fichier journal a lieu une fois par seconde également lorsque la valeur est 2. Notez que la rinçage une fois par seconde n'est pas garantie à 100% de se produire chaque seconde, due aux problèmes de planification des processus. " (citation de MySQL Docs)
  3. Mettez à jour les options de montage pour utiliser data=writeback. Notez que si vous utilisez votre système de fichiers racine, vous devez également passer une option de ligne de commande de noyau. Je mets ensemble quelques étapes sur cela à coderwall .
  4. Testez diverses valeurs de innodb_flush_method. O_Direct est montré pour améliorer les performances de certaines charges de travail, mais ce n'est pas une donnée que cela fonctionnera dans votre environnement.
  5. Mise à niveau vers SSDS, dans ce cas, vous voudrez également augmenter innodb_io_capacity Et régler les paramètres tels que innodb_adaptive_flushing, innodb_read_io_threads, innodb_write_io_threads, innodb_purge_threads, Et autres paramètres possibles.
4
JinnKo

Placez la base de données sur un système de fichiers non-journalistes. Les serveurs au moins plus gros (Oracle, SQL Server) ont leur propre fonction de journal (journal de transaction) et optimisent leur IO en conséquence. Vous avez des journaux et une base de données sur des systèmes de fichiers et des disques distincts et comptez sur la base de données interne fonctionnalité pour la manipulation de la mauvaise gestion IO. Normalement, aucune modification du système de fichiers (configuration plus large), à ​​l'exception de la date d'écriture, car les fichiers ne se développaient pas - ils seraient générés avec leur taille "finale" (OK, les administrateurs peuvent changer cela) et les modifications sont aussi modifiées. J'ai dit suivi par le journal de transaction de niveau de la base de données.

Vous voudrez peut-être aussi nous dire quelle est votre couche matérielle. La plupart des gens sous-estiment que [~ # ~ # ~] [~ # ~ ~] est le facteur de limitation d'une base de données et pense qu'un petit jeu de disque est un environnement approprié pour une grande base de données. Bien que certains d'entre nous travaillent sur des bases de données à l'aide d'un plus grand nombre de disques, alors soutenant potentiellement un nombre plus élevé d'IOP.

4
TomTom

Il est fort probable que votre backend d'E/S n'est pas en train de faire face à la charge tout cela. Vous devez vous assurer que votre système de fichiers n'est pas de journaliser les données. Je suggérerais d'utiliser le data=writeback,relatime,nobarrier Paramètres de monter pour la partition de données de votre base de données en tant que première optimisation rapide et sale.

De plus, déduire de vos symptômes, vous n'utilisez apparemment pas la mise en cache en écriture avec votre contrôleur. Vous devez vous assurer que vous utilisez un cache d'écriture sauvegardé par la batterie ou par la batterie sur votre contrôleur et activez-la - cela devrait vous donner un coup de pouce significatif de performance sans augmenter considérablement le risque de perte de données ou de corruption. Notez que l'utilisation de cache en écriture sans une batterie ou une sauvegarde flash augmente considérablement le risque de perte de données ou de corruption. Ceci à des fins de test et/ou si vous pouvez prendre la perte.

3
the-wabbit

En outre, pas directement liée à MySQL, mais certains HD ont des problèmes avec EXT4 en raison de la gestion agressive de la puissance ... lorsque cela se produit, la charge de la machine augmente sans aucune activité apparente.

Essayez de le désactiver. Vérifiez d'abord la valeur que vous avez (si vous devez le remettre sans redémarrer), puis le désactiver.

Vérifiez la valeur actuelle:

    hdparm -B /dev/sda

Désactiver

   hdparm -B 255 /dev/sda

(ou tout ce qui est votre HD) et testez. Probablement ne vous aidera pas à la plupart des problèmes, mais cela pourrait aider certains utilisateurs là-bas. Le redémarrage réinitialisera la valeur ou remplacera manuellement le 255 pour la valeur précédente.

Si cela aide, vérifiez le /etc/default/hdparm ou /etc/hdparm.conf Pour une configuration plus permanente, en la définissant sur le démarrage.

0
higuita

Quel moteur de base de données utilisez-vous pour insérer ces données?

Si c'est Myisam: cela doit verrouiller la table entière pendant une écriture, il est donc possible d'exécuter des threads d'insertion simultanée tuerai n'importe quel système, peu importe la puissance.

Assurez-vous que vous utilisez InnoDB pour ces tables.

0
adaptr