web-dev-qa-db-fra.com

La table InnoDb insert-Heavy n'utilisera pas tout mon CPU

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é.

8
sep332

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:

  • Verrouillage de la table complète sur la table Innodb
  • Effectuer la charge en vrac
  • Libérer la serrure
7
RolandoMySQLDBA

Il existe un certain nombre de facteurs qui ont une incidence sur la capacité de maximiser l'utilisation de plusieurs cœurs.

  • Certains mutiles auront un impact sur plusieurs processeurs laissant une attente avant de pouvoir continuer.
  • Vous avez besoin autant de fils actifs que vous avez des processeurs. Si votre charge de travail entraîne 9 fils parallèles, vous ne pouvez pas remplir 12 cœurs.
  • La capacité d'E/S doit être suffisante pour fournir suffisamment de travail pour tous les processeurs. Si vous faites la queue sur le disque I/O ou si vous attendez des messages réseau, vous ne pourrez pas remplir les processeurs.

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.

3
BillThor