J'ai une base de données de journaux de paquets, qui n'est presque jamais interrogée. Il doit juste être rapide sur des inserts. J'utilise InnoDB parce que j'aimerais maintenir la conformité acide, car même perdre un paquet unique pourrait être endommageant nos clients. Dans un scénario de réglage de la performance, j'envoie 1 000 000 paquets au serveur sur plusieurs connexions de DB. Mais peu importe les paramètres que j'utilise dans my.cnf, je ne peux pas obtenir le processus MySQLD d'utiliser plus de 900% de processeur sur un système avec 12 cœurs. (Rien d'autre ne fonctionne sur la boîte.)
J'ai défini ce qui suit
innodb_file_per_table = 1
innodb_write_io_threads = 64
innodb_read_io_threads = 64
innodb_thread_concurrency = 0
Si j'utilise MyISAM, je peux obtenir tous les paquets écrits dans environ 6 secondes. Mais InnoDB prend environ 25. Puis-je faire utiliser MySQL le reste des ressources système et insérer plus rapidement?
EDIT: Voici le schéma pour la table:
+-------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+-------+
| t | bigint(20) unsigned | YES | | NULL | |
| a | char(1) | YES | | NULL | |
| sa | int(10) unsigned | YES | | NULL | |
| sb | int(10) unsigned | YES | | NULL | |
| sc | int(10) unsigned | YES | | NULL | |
| sd | int(10) unsigned | YES | | NULL | |
| sp | smallint(5) unsigned | YES | | NULL | |
| da | int(10) unsigned | YES | | NULL | |
| db | int(10) unsigned | YES | | NULL | |
| dc | int(10) unsigned | YES | | NULL | |
| dd | int(10) unsigned | YES | | NULL | |
| dp | smallint(5) unsigned | YES | | NULL | |
+-------+----------------------+------+-----+---------+-------+
eDIT2: J'ai amplifié plus d'insertions ensemble pour qu'une seule requête soit proche de la longueur maximale (environ 16 000 000 caractères). La base de données pointe maintenant à 1100% pendant deux secondes, puis diminue à 100% pour le reste de l'époque. Le temps total est maintenant de 21 secondes, soit environ 16% plus rapide que lorsque j'ai commencé.
Vous devez endormir innodb_io_capacacité aussi.
La valeur par défaut est 200. Élevez-la à 5000 pour commencer. J'irais à 20000.
Vous voudrez peut-être aussi vous assurer que ib_logfile0
et ib_logfile1
sont suffisamment gros. La valeur par défaut pour ( innodb_log_file_size est de 5m. Je choisirais cela à 1g pour commencer.
Une piscine tampon innodub plus grande aiderait également, peut-être 4G.
Pour récapituler, utilisez ces paramètres supplémentaires:
[mysqld]
innodb_io_capacity=5000
innodb_buffer_pool_size=4G
innodb_log_file_size=1G
Après avoir ajouté ces paramètres à my.cnf, redimensionner ib_logfile0/ib_logfile1 faire ce qui suit
service mysql stop
rm -f /var/log/mysql/ib_logfile[01]
service mysql start
Les fichiers ib_logfile0 et ib_logfile1 sont recréés. Ne vous inquiétez pas, j'ai fait cela plusieurs fois .
Vous devrez peut-être faire quelque chose hors de l'ordinaire pour Innodb
Essayez ce qui suit:
Il existe un certain nombre de facteurs qui ont une incidence sur la capacité de maximiser l'utilisation de plusieurs cœurs.
Des outils tels que SAR vous permettront de déterminer s'il y a des goulots d'étranglement qui réduisent votre capacité. Il suffit d'être averti, éliminant un goulot d'étranglement, déplacera simplement le goulot d'étranglement.