2011-03-03 14 views
6

Tengo ejemplo, un Amazon S3 y el proyecto que tenemos en el servidor realiza una gran cantidad de inserciones y actualizaciones y unos SELECTs complejospesada mysql uso de la CPU o la memoria

nos encontramos con que MySQL muy a menudo tomar una mucha de la CPU.

Estoy tratando de establecer si una memoria más alta o una CPU más alta es mejor que la configuración anterior.

A continuación se muestra una salida de cat /proc/meminfo

MemTotal:  7347752 kB 
MemFree:   94408 kB 
Buffers:   71932 kB 
Cached:  2202544 kB 
SwapCached:   0 kB 
Active:  6483248 kB 
Inactive:  415888 kB 
SwapTotal:   0 kB 
SwapFree:   0 kB 
Dirty:   168264 kB 
Writeback:   0 kB 
AnonPages:  4617848 kB 
Mapped:   21212 kB 
Slab:   129444 kB 
SReclaimable: 86076 kB 
SUnreclaim:  43368 kB 
PageTables:  54104 kB 
NFS_Unstable:  0 kB 
Bounce:    0 kB 
CommitLimit: 3673876 kB 
Committed_AS: 5384852 kB 
VmallocTotal: 34359738367 kB 
VmallocUsed:  180 kB 
VmallocChunk: 34359738187 kB 

Configuración actual:

alta CPU Extra Grande Instancia

7 GB de memoria 20 EC2 Unidades Compute (8 núcleos virtuales con 2.5 EC2 Compute Unidades cada uno) 1690 GB de almacenamiento instancia de 64 bits plataforma de E/S Rendimiento: Alto nombre de API: c1.xlarge

Posible Configuración:

alta de memoria doble extra grande Instancia

34.2 GB de memoria 13 Unidades de cálculo EC2 (4 núcleos virtuales con 3.25 EC2 Compute Unidades cada uno) 850 GB de almacenamiento de instancias Plataforma de 64 bits E/S Rendimiento: Alto Nombre de la API: m2.2xlarge

+0

son las tablas todas/predominantemente MyISAM o InnoDB? – robjmills

+0

InnoDb para la mayoría de las tablas ... He guardado MyISAM en la tabla 1, realizamos búsquedas de texto completo en – Lizard

+0

¿Ha intentado utilizar mk-query-digest (en maatkit) o ​​mtop para determinar dónde está el uso de recursos más pesado? el registro lento de consultas y el generador de perfiles de consultas? – coolgeek

Respuesta

4

Me gustaría ir a la memoria de 32 GB y tal vez más discos duros en RAID. La CPU no ayudará mucho; tienes suficiente potencia de CPU. También necesita configurar mysql correctamente.

  • Deje 1-2 GB para la memoria caché del sistema operativo y para las tablas temporales.
  • Aumentar tmp_table_size
  • de intercambio quitar
  • optimizar el query_cache_size (no lo hacen demasiado grandes - consulte la documentación de MySQL al respecto)
  • ejecutar periódicamente FLUSH QUERY CACHE. si su caché de consultas es < 512 MB, ejecútelo cada 5 minutos. Este no limpia el caché, lo optimiza (desfragmenta). Esto es de documentación de MySQL:

desfragmentar el caché de consultas a una mejor utilizan su memoria. FLUSH QUERY CACHE no elimina ninguna consulta del caché , a diferencia de FLUSH TABLES o RESET QUERY CACHE.

Sin embargo he notado que la otra solución tiene la mitad de espacio en disco: 850GB, lo que podría ser reducido número de discos duros. Esa es generalmente una mala idea. El mayor problema en las bases de datos son los discos duros. Si usa RAID5, asegúrese de no utilizar menos discos duros. Si no usa raid en absoluto, sugiero raid 0.

0

Depende de la aplicación.

Puede usar memcached para almacenar en caché las consultas de mysql. Esto facilitaría un poco el uso de la CPU, sin embargo, con este método, querrá aumentar la RAM para almacenar las consultas.

Por otro lado, si no es factible según el tipo de aplicación, recomendaría una CPU más alta.

0

No hay muchas razones para que un MySQL utilice una gran cantidad de CPU: es el procesamiento de las rutinas almacenadas (procedimientos almacenados o funciones almacenadas) o la clasificación que puede consumir la CPU.

Si está utilizando una gran cantidad de CPU debido a las rutinas almacenadas, lo está haciendo mal y su alma no se puede guardar de todos modos.

Si está utilizando una gran cantidad de CPU debido a la clasificación en curso, se pueden hacer algunas cosas, dependiendo de la naturaleza de sus consultas: Puede extender los índices para incluir las columnas ORDER BY al final, o puede soltar las cláusulas ORDER BY y ordenar en el cliente.

¿Qué enfoque elegir depende de la causa real del uso de la CPU? ¿Se trata de consultas y clasificación? Y en las consultas reales. Entonces, en cualquier caso, necesitará una mejor supervisión primero.

Al no tener información de supervisión, el consejo general es siempre: Comprar más memoria, no más CPU para una base de datos.

+0

¿está implicando que los sprocs son malos? –

+2

En MySQL, la implementación es bastante horrible. El código no se analiza, el origen ASCII del procedimiento se almacena en el disco. Cada conexión analiza el procedimiento y almacena en caché el código analizado en su estructura de conexión, no se comparte entre las conexiones. Además, la implementación es incompleta (algo corregida en 5.5) y difícil de depurar. Incluso sin estos problemas, los procedimientos almacenados son códigos que se ejecutan en las CPU más caras y menos escalables de un sistema y, por lo tanto, generalmente son una mala idea (existen contraejemplos). – Isotopp

+1

y, sin embargo, aún será significativamente más rápido (y requerirá menos recursos de red) que llevar los datos a su aplicación para hacer el procesamiento y luego enviar los resultados a través de la red – coolgeek

0

¿La naturaleza bajo demanda de EC2 no hace que sea sencillo alquilar la configuración posible por un día y hacer algunas pruebas de carga? Las mediciones hablan más que las palabras.

0

Utilice "Instancia Extra Grande de CPU Alta".

En su configuración actual, MySQL no está limitado por la memoria:

MemTotal:  7347752 kB  
MemFree:   94408 kB  
Buffers:   71932 kB  
Cached:  **2202544 kB** 

de 7 GB de memoria, 2 GB no se utiliza y se utiliza por el sistema operativo como caché de E/S.

En este caso, aumentar el recuento de CPU le daría más dinero por dinero.

1

Utilice vmstat y iostat para averiguar si la CPU o E/S es el cuello de botella (si E/S: agregue más RAM y cargue datos en la memoria) Ejecutar desde shell y comprobar los resultados:

vmstat 5 
iostat -dx 5 
  • si CPU es el problema vmstat mostrará valores altos en us columna, y iostat mostrará bajo uso de disco (util)
  • si I/O es el problema luego vmstat mostrará valores bajos en la columna us y iostat mostrará una alta utilización del disco (util); por alto quiero decir> 50%
Cuestiones relacionadas