Se me presentaron algunos servidores MySQL dedicados que nunca usan más de un núcleo. Soy más desarrollador que DBA para MySQL, así que necesito ayuda
Preparar
Los servidores son bastante pesados con una carga de tipo OLAP / DataWarehouse (DW):
- Primario: 96 GB de RAM, 8 núcleos + matriz RAID 10 única
- Prueba: 32 GB de RAM con 4 núcleos
- El DB más grande es de 540 GB, el total es de alrededor de 1.1TB y en su mayoría tablas de InnoDB
- Solaris 10 Intel-64
- MySQL 5.5.x
Nota: El DB más grande es el replicado del servidor OLTP DR y el DW se carga desde este. No es un DW completo: solo dura entre 6 meses y 6 semanas, por lo que es más pequeño que el DB OLTP.
Observaciones en un servidor de prueba
- 3 conexiones separadas
- cada uno tiene un concurrente (y diferente)
ALTER TABLE...DROP KEY...ADD INDEX
- las 3 tablas tienen 2.5, 3.8 y 4.5 millones de filas
- El uso de la CPU sube al 25% (un núcleo está al máximo) y no más
- Los 3 ALTERS toman de 12 a 25 minutos (un solo en el más pequeño toma 4.5)
Preguntas
- ¿Qué configuración o parche se requiere para permitir que se use más de un núcleo?
Es decir, ¿por qué MySQL no usa todos los núcleos disponibles? (como otros RDBMS) - ¿Es consecuencia de la replicación?
Otras notas
- Entiendo la diferencia entre un "hilo" RDBMS y un "hilo" del sistema operativo
- No estoy preguntando sobre ninguna forma de paralelismo
- Algunas de las variables del sistema para InnoDB y los subprocesos son subóptimas
(en busca de una ganancia rápida) - A corto plazo, no puedo cambiar el diseño del disco
- El sistema operativo se puede modificar si es necesario
- Una sola TABLA DE ALTERACIÓN en la mesa más pequeña toma 4.5 minutos (IMO impactante)
Editar 1
- innodb_thread_concurrency se establece en 8 en ambos. Sí, está mal, pero no hará que MySQL use múltiples núcleos
- innodb_buffer_pool_size tiene 80 GB en primaria, 10 GB en una prueba (se cierra otra instancia). Esto está bien por ahora.
- innodb_file_per_table = ON
Editar 2
- innodb_flush_log_at_trx_commit = 2
- innodb_use_sys_malloc = ON
- innodb_flush_method debería ser O_DIRECT (pero SHOW VARIABLES no muestra esto)
- innodb_doublewrite = OFF
- Sistema de archivos = ZFS (y mi administrador de sistemas encontró esto: http://blogs.oracle.com/realneel/entry/mysql_innodb_zfs_best_practices )
Probar
- innodb_flush_method no se muestra como O_DIRECT cuando debería ser
- seguirá la configuración de RolandoMySQLDBA
Avísame si me he perdido algo importante
Salud
Actualizar
Cambió innodb_flush_method + 3 x configuraciones de hilo en la respuesta de RolandoMySQLDBA
Resultado:> 1 núcleo utilizado para las pruebas = resultado positivo
\G
. Además, creo que SHOW INNODB STATUS
está en desuso a favor de SHOW ENGINE INNODB STATUS
5.5 ( aparece un error al ejecutar el primero en la línea de comandos.)