On m'a présenté des serveurs dédiés MySQL qui n'utilisent jamais plus d'un noyau. Je suis plus développeur que DBA pour MySQL, alors besoin d'aide
Installer
Les serveurs sont assez lourds avec une charge de type OLAP / DataWarehouse (DW):
- Primaire: 96 Go de RAM, 8 cœurs + un seul RAID 10
- Test: 32 Go de RAM avec 4 cœurs
- La plus grande base de données est 540 Go, le total est d'environ 1,1 To et la plupart des tables InnoDB
- Solaris 10 Intel-64
- MySQL 5.5.x
Remarque: La base de données la plus grande est celle qui a été répliquée à partir du serveur de reprise en ligne OLTP et le DW est chargé à partir de celui-ci. Il ne s'agit pas d'un fichier de travail complet: il ne dure que 6 à 6 semaines, il est donc plus petit que la base de données OLTP.
Observations sur un serveur de test
- 3 connexions séparées
- chacun a un concurrent (et différent)
ALTER TABLE...DROP KEY...ADD INDEX
- les 3 tables ont 2,5, 3,8 et 4,5 millions de lignes
- L’utilisation du processeur atteint 25% (un cœur est épuisé) et pas plus
- les 3 ALTER prennent 12-25 minutes (une seule sur la plus petite en prend 4,5)
Des questions
- Quel paramètre ou correctif est requis pour permettre à plus d'un cœur d'être utilisé?
Pourquoi MySQL n’utilise-t-il pas tous les cœurs disponibles? (comme les autres SGBDR) - Est-ce une conséquence de la réplication?
Autres notes
- Je comprends la différence entre un "thread" SGBDR et un "thread" OS
- Je ne parle pas de toute forme de parallélisme
- Certaines variables système pour InnoDB et les threads sont sous-optimales
(recherche d'un gain rapide) - À court terme, je ne peux pas changer la disposition du disque
- Le système d'exploitation peut être modifié si nécessaire
- Un seul ALTER TABLE sur la plus petite table prend 4,5 minutes (IMO choquant)
Modifier 1
- innodb_thread_concurrency a la valeur 8 pour les deux. Oui, c'est faux, mais MySQL n'utilisera pas plusieurs cœurs.
- innodb_buffer_pool_size est de 80 Go sur le primaire, 10 Go sur un test (une autre instance est fermée). C'est OK pour le moment.
- innodb_file_per_table = ON
Modifier 2
- innodb_flush_log_at_trx_commit = 2
- innodb_use_sys_malloc = ON
- innodb_flush_method devrait être O_DIRECT (mais SHOW VARIABLES ne l'indique pas)
- innodb_doublewrite = OFF
- Système de fichiers = ZFS (Et mon administrateur système a trouvé ceci: http://blogs.oracle.com/realneel/entry/mysql_innodb_zfs_best_practices )
Tester
- innodb_flush_method n'affiche pas comme O_DIRECT alors qu'il devrait l'être
- suivra les paramètres de RolandoMySQLDBA
Dites-moi si j'ai oublié quelque chose d'important
À votre santé
Mise à jour
Innodb_flush_method modifié + 3 x paramètres de thread dans la réponse de RolandoMySQLDBA
Résultat:> 1 cœur utilisé pour les tests = résultat positif
\G
. En outre, je pense SHOW INNODB STATUS
est déconseillé en faveur de SHOW ENGINE INNODB STATUS
dans 5.5 (je reçois une erreur en exécutant l'ancien en ligne de commande.