Ceci est un problème assez simple. Insérer des données dans la table fonctionne normalement très bien, sauf quelques fois où la requête d'insertion prend quelques secondes. (Je ne suis pas en train d'essayer d'insérer des données en masse.) J'ai donc mis en place une simulation du processus d'insertion pour comprendre pourquoi la requête d'insertion prend parfois plus de 2 secondes à s'exécuter. Joshua a suggéré que le fichier d'index pourrait être en train d'être ajusté ; j'ai supprimé l'identifiant (champ de clé primaire), mais le retard se produit toujours.
J'ai une table MyISAM : daniel_test_insert
(cette table commence totalement vide) :
create table if not exists daniel_test_insert (
id int unsigned auto_increment not null,
value_str varchar(255) not null default '',
value_int int unsigned default 0 not null,
primary key (id)
)
J'insère des données dedans et parfois une requête d'insertion prend > 2 secondes à s'exécuter. Il n'y a pas de lectures sur cette table - Seulement des écritures, de façon séquentielle, par un programme à un seul thread.
J'ai exécuté exactement la même requête 100 000 fois pour comprendre pourquoi la requête prend parfois beaucoup de temps. Pour le moment, il semble que ce soit un événement aléatoire.
Cette requête par exemple a pris 4,194 secondes (un très long temps pour un insert) :
Query: INSERT INTO daniel_test_insert SET value_int=12345, value_str='afjdaldjsf aljsdfl ajsdfljadfjalsdj fajd as f' - a duré 4,194 secondes
status | durée | cpu_user | cpu_system | context_volontaire | context_involontaire | fautes_de_page_mineures
démarrage | 0,000042 | 0,000000 | 0,000000 | 0 | 0 | 0
vérification des autorisations | 0,000024 | 0,000000 | 0,000000 | 0 | 0 | 0
Ouverture des tables | 0,000024 | 0,001000 | 0,000000 | 0 | 0 | 0
Verrou système | 0,000022 | 0,000000 | 0,000000 | 0 | 0 | 0
Verrouillage de table | 0,000020 | 0,000000 | 0,000000 | 0 | 0 | 0
init | 0,000029 | 0,000000 | 0,000000 | 1 | 0 | 0
update | 4,067331 | 12,151152 | 5,298194 | 204894 | 18806 | 477995
fin | 0,000094 | 0,000000 | 0,000000 | 8 | 0 | 0
fin de la requête | 0,000033 | 0,000000 | 0,000000 | 1 | 0 | 0
libération des éléments | 0,000030 | 0,000000 | 0,000000 | 1 | 0 | 0
fermeture des tables | 0,125736 | 0,278958 | 0,072989 | 4294 | 604 | 2301
enregistrement de la requête lente | 0,000099 | 0,000000 | 0,000000 | 1 | 0 | 0
enregistrement de la requête lente | 0,000102 | 0,000000 | 0,000000 | 7 | 0 | 0
nettoyage | 0,000035 | 0,000000 | 0,000000 | 7 | 0 | 0
(Ceci est une version abrégée de la commande SHOW PROFILE, j'ai supprimé les colonnes qui étaient toutes à zéro.)
Maintenant, la mise à jour a un nombre incroyable de changements de contexte et de fautes de page mineures. Le nombre de tables ouvertes augmente d'environ 1 toutes les 10 secondes sur cette base de données (nous n'épuisons pas l'espace de table_cache)
Statistiques :
-
MySQL 5.0.89
-
Matériel : 32 Go de RAM / 8 cœurs @ 2,66 GHz ; disques durs SCSI RAID 10 (SCSI II???)
-
J'ai interrogé les disques durs et le contrôleur RAID : Aucune erreur n'est signalée. Les CPUs ont environ 50% de temps d'attente.
-
iostat -x 5 (rapporte moins de 10% d'utilisation pour les disques durs) Le rapport top affiche une charge moyenne d'environ 10 pour 1 minute (normal pour notre machine de base de données)
-
L'espace de swap a 156 ko utilisés (32 Go de RAM)
Je suis en train de chercher ce qui cause ce retard de performance. Cela ne se produit PAS sur nos esclaves à faible charge, seulement sur notre maître à forte charge. Cela se produit également avec des tables en mémoire et InnoDB. Est-ce que quelqu'un a des suggestions ? (C'est un système de production, donc rien d'exotique !)