Dans l'un de mes environnements de production, nous avons deux instances exécutées sur un cluster RedHat, avec une instance de production associée au cluster.
Nous avons une mémoire principale 125G avec un pool de mémoire tampon InnoDB 24G occupé par instance1 et 12G occupé par instance2, qui n'est pas associé au cluster RedHat. Les données et les journaux de transactions se trouvent sur la partition de disque LVM avec un système de fichiers ext3.
Pour une amélioration des performances et un meilleur débit d'E / S, j'ai décidé de passer innodb_flush_method
à O_DIRECT
.
En référence à la documentation MySQL:
Lorsque les données et les fichiers journaux InnoDB sont situés sur un SAN, il a été constaté que le paramètre
innodb_flush_method
toO_DIRECT
peut dégrader les performances desSELECT
instructions simples par un facteur de trois.
Se référant à MySQL haute performance Ver 2 et 3, il a déclaré que les développeurs InnoDB ont trouvé des bogues avec l'utilisation innodb_flush_method=O_DSYNC
. O_SYNC
et O_DSYNC
sont similaires à fsync()
et fdatasync()
: O_SYNC
synchronise les données et les métadonnées, tandis que les O_DSYNC
données sont synchronisées uniquement.
Si tout cela ressemblait à beaucoup d'explications sans conseil, voici le conseil:
si vous utilisez un système d'exploitation de type Unix et que votre contrôleur RAID dispose d'un cache écrit alimenté par batterie, nous vous recommandons d'utiliser
O_DIRECT
. Sinon, la valeur par défaut ouO_DIRECT
sera probablement le meilleur choix, selon votre application.
Par googler, j'ai obtenu ce rapport de référence: sur O_DSYNC
vsO_DIRECT
Rapport de référence: =================== Test transactionnel complexe 1B Row, 64 threads * SAN O_DIRECT: demandes de lecture / écriture: 31560140 (8766,61 par seconde) * SAN O_DSYNC: demandes de lecture / écriture: 5179457 (1438,52 par seconde) * SAN fdatasync: demandes de lecture / écriture: 9445774 (2623,66 par seconde) * Disque local O_DIRECT: demandes de lecture / écriture: 3258595 (905,06 par seconde) * Disque local O_DSYNC: demandes de lecture / écriture: 3494632 (970,65 par seconde) * Fdatasync sur disque local: demandes de lecture / écriture: 4223757 (1173,04 par sec.
Cependant, O_DIRECT
désactive le cache au niveau du système d'exploitation, où la double mise en cache peut être désactivée, ce qui affiche un meilleur débit d'E / S.
Est-il bon d'y aller O_DIRECT
plutôt que O_DSYNC
? Ces deux options sont un peu déroutantes. Quelle option peut montrer un meilleur débit d'E / S et une amélioration des performances sans aucun impact sur les données, en lecture / écriture, en particulier en production? De meilleures suggestions basées sur votre expérience personnelle?
J'ai pu voir Rolando Update dans le post :
Il y a toujours une légère confusion sur ces deux paramètres. Là où j'ai pu voir la plupart des modèles de configuration de production à l'aide
O_DIRECT
, je n'ai vu aucun endroit où recommanderO_DSYNC
.
Système
- MySQL 5.1.51-enterprise-gpl-pro-log
- Red Hat Enterprise Linux Server version 5.5
- DELL DRAC avec contrôleur RAID ayant un cache de réécriture de batterie 512 Mo
- Contrôleurs Dell PERC H700 avec unité de sauvegarde sur batterie (BBU).
Information additionnelle
mysql> afficher des variables comme 'innodb_thread_concurrency'; + --------------------------- + ------- + | Nom_variable | Valeur | + --------------------------- + ------- + | innodb_thread_concurrency | 96 | + --------------------------- + ------- + 1 rangée en jeu (0,00 sec) mysql> afficher des variables comme 'innodb_read_io_threads'; Ensemble vide (0,00 sec) mysql> afficher des variables comme 'innodb_write_io_threads'; Ensemble vide (0,00 sec)
Nous utilisons le plugin par défaut, j'ai donc publié les informations sur le statut InnoDB:
mysql> SELECT * FROM Plugins WHERE PLUGIN_NAME LIKE '% innodb%' ET PLUGIN_TYPE LIKE 'STORAGE ENGINE' \ G *************************** 1. rangée ******************** ******* PLUGIN_NAME: InnoDB PLUGIN_VERSION: 1.0 PLUGIN_STATUS: ACTIF PLUGIN_TYPE: MOTEUR DE STOCKAGE PLUGIN_TYPE_VERSION: 50151.0 PLUGIN_LIBRARY: NULL PLUGIN_LIBRARY_VERSION: NULL PLUGIN_AUTHOR: Innobase OY PLUGIN_DESCRIPTION: prend en charge les transactions, le verrouillage au niveau des lignes et les clés étrangères PLUGIN_LICENSE: GPL 1 rangée en jeu (0,00 sec)