Este es un problema bastante simple. Insertar datos en la tabla normalmente funciona bien, excepto en algunas ocasiones en las que la consulta de inserción tarda unos segundos. (Estoy no intentando insertar datos a granel.) Por lo tanto, configuré una simulación para el proceso de inserción para averiguar por qué la consulta de inserción ocasionalmente tarda más de 2 segundos en ejecutarse. Joshua sugirió que el archivo de índice puede estar siendo ajustado; Eliminé el id (campo de clave principal), pero la demora aún ocurre.¿Por qué una consulta de inserción ocasionalmente toma tanto tiempo en completarse?
Tengo una tabla MyISAM: daniel_test_insert
(esta tabla se inicia completamente vacío):
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)
)
que insertar datos en ella, ya veces una consulta de inserción toma> 2 segundos para funcionar. No hay lecturas en esta tabla: solo se escribe, en serie, mediante un único programa de subprocesos.
Ejecuté exactamente la misma consulta 100.000 veces para encontrar por qué la consulta ocasionalmente lleva mucho tiempo. Hasta ahora, parece ser una ocurrencia aleatoria.
Esta consulta, por ejemplo, tomó 4.194 segundos (un tiempo muy largo para una inserción):
Query: INSERT INTO daniel_test_insert SET value_int=12345, value_str='afjdaldjsf aljsdfl ajsdfljadfjalsdj fajd as f' - ran for 4.194 seconds
status | duration | cpu_user | cpu_system | context_voluntary | context_involuntary | page_faults_minor
starting | 0.000042 | 0.000000 | 0.000000 | 0 | 0 | 0
checking permissions | 0.000024 | 0.000000 | 0.000000 | 0 | 0 | 0
Opening tables | 0.000024 | 0.001000 | 0.000000 | 0 | 0 | 0
System lock | 0.000022 | 0.000000 | 0.000000 | 0 | 0 | 0
Table lock | 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
end | 0.000094 | 0.000000 | 0.000000 | 8 | 0 | 0
query end | 0.000033 | 0.000000 | 0.000000 | 1 | 0 | 0
freeing items | 0.000030 | 0.000000 | 0.000000 | 1 | 0 | 0
closing tables | 0.125736 | 0.278958 | 0.072989 | 4294 | 604 | 2301
logging slow query | 0.000099 | 0.000000 | 0.000000 | 1 | 0 | 0
logging slow query | 0.000102 | 0.000000 | 0.000000 | 7 | 0 | 0
cleaning up | 0.000035 | 0.000000 | 0.000000 | 7 | 0 | 0
(Esta es una versión abreviada de los mismos Mostrar perfil, me echaron fuera las columnas que eran todos iguales a cero.)
Ahora la actualización tiene un número increíble de interruptores de contexto y fallas de página menores. Opened_tables aumenta alrededor de 1 por cada 10 segundos en esta base de datos (no corriendo de table_cache espacio)
Estadísticas:
MySQL 5.0.89
Hardware: 32 gigas de RAM/8 núcleos a 2,66 GHz; raid 10 Discos duros SCSI (SCSI II ???)
He tenido los discos duros y controlador de ataque consultados: No se han informado errores. Las CPU tienen un 50% de inactividad.
iostat -x 5 (informes de menos de 10% de utilización de discos duros) superior medio de carga de informe sobre 10 durante 1 minuto (lo normal en nuestra máquina db)
espacio de intercambio ha 156K usado (32 gigas de ram)
No puedo saber qué está causando este retraso de rendimiento. Esto NO ocurre en nuestros esclavos de carga baja, solo en nuestro maestro de carga alta. Esto también ocurre con la memoria y las tablas innodb. ¿Alguien tiene alguna sugerencia? (Este es un sistema de producción, así que nada exótico!)
¿Funcionan bien otras tablas/bases de datos? ¿Podría haber un disco dañado (errores de E/S en system.log)? ¿Cuánto tiempo toma la consulta desde la línea de comando mysql? ¿Qué pasa con mysql mydb
No, tenemos este problema en otras tablas. Creé una tabla de muestra y simplemente la dejé para ver qué sucedía. Si uso mysql mydb
Daniel
¿A qué te refieres con "Esta misma fila, 100,000 veces"? ¿Quiere decir que una inserción simple tarda 2 segundos, o hacer la misma inserción 100.000 veces lleva 2 segundos? –