La mejor configuración de caché MySQL para un servidor MySQL dedicado de 8 gb de RAM usando solo InnoDB (base de datos de 5 gb)

20

Soy un novato bastante grande cuando se trata de configurar MySQL para el rendimiento. Y, sinceramente, no estoy preocupado por el ajuste fino para exprimir hasta el último rendimiento de MySQL, pero sí sé que lo más importante que proporciona algunos de los mejores resultados es configurar cachés / buffers correctamente.

He tratado de simplificar las cosas usando solo InnoDB como motor de almacenamiento. Y tengo un servidor dedicado para MySQL. Tiene 8 gb de RAM, ¿cómo debo asignar eso para maximizar el rendimiento? Me gustaría poder ajustar toda mi base de datos en la memoria para obtener el mejor rendimiento. La base de datos es de aproximadamente 5 gb. es posible?

¿Cuánta memoria debo asignar al caché de consultas? ¿Cuánto cuesta al grupo de búferes InnoDB? ¿Cuánto para el resto de la computadora (es decir, procesos no relacionados con MySQL)? Etc.

Como no estoy usando MyISAM, ¿realmente no necesito poner mucha memoria en la memoria caché de claves?

billmalarky
fuente

Respuestas:

25

Esto es difícil sin saber mucho sobre la base de datos en sí. Hay algunas herramientas que debe tener en cuenta;

Acerca del almacenamiento de toda la base de datos en la memoria; Cualquier consulta que realice cambios en la base de datos permanecerá abierta hasta que se realice la escritura en el disco. Lo único que puede evitar que el disco sea un cuello de botella es un controlador de disco con un caché de escritura.

Comenzaría con los siguientes cambios de los valores predeterminados:

key_buffer_size = 128M
thread_stack = 128K
thread_cache_size = 8
table_cache = 8192
max_heap_table_size = 256M
query_cache_limit = 4M
query_cache_size = 512M

innodb_buffer_pool_size = 4G 

# This is crucial to avoid checkpointing all the time:
innodb_log_file_size = 512M

# If you have control on who consumes the DB, and you don't use hostnames when you've set up permissions - this can help as well.
skip_name_resolve

Luego vería cómo van las cosas y probaría diferentes cosas basadas (entre otras cosas) en el resultado de las herramientas mencionadas anteriormente. También me aseguraría de graficar las tendencias con una herramienta de monitoreo, como Munin o Cacti , para ver con qué tipo de carga de trabajo estoy trabajando. Personalmente, tengo una gran experiencia con los complementos MySQL proporcionados con Munin.

Kvisle
fuente
Gracias, intentaré esto y veré si puedo aprender algo nuevo.
billmalarky
@billmalarky ¡Bienvenido a serverfault! :) Recuerde votar o marcar la pregunta como correcta, si está satisfecho con la respuesta que recibió.
Kvisle
+1 por recomendar mysqltuner.pl !!!
RolandoMySQLDBA
@ Kvisle Gracias por la bienvenida! He estado en stackoverflow por un tiempo (bueno ... unos meses, eso es ...) pero soy nuevo en serverfault. De hecho, alojo con voxel.net y su alojamiento principal (soporte del sistema IE) es realmente genial, pero pensé que sería apropiado buscar una vista externa también, así que no parecía una herramienta completa al hablar con ellos sobre esto.
billmalarky
1
@Kvisle Además, marcaré una respuesta correcta pero quiero que esto se estire un poco para obtener una buena lluvia de ideas.
billmalarky
9

En mi humilde opinión deberías poder ir con

innodb_buffer_pool_size=5G

Eso sería 62.5% de RAM con una cantidad suficiente de RAM para el SO del servidor más memoria para conexiones DB

@kvisle recomienda usar mysqltuner.pl. Ese script es excelente para juzgar la cantidad de RAM que se dedica a join_buffer_size, sort_buffer_size, read_buffer_size y read_rnd_buffer_size. Esos 4 buffers agregados juntos se multiplican por max_ connections. Esa respuesta se agrega a los buffers estáticos (innodb_buffer_pool_size + key_buffer_size). Se informan las sumas combinadas. Si esa suma combinada excede el 80% de RAM, es cuando debe reducir esos tamaños de búfer. mysqltuner.pl será muy útil a este respecto.

Dado que todos sus datos son InnoDB, puede hacer que key_buffer_size (buffer de clave de caché para índices MyISAM) sea muy bajo (recomiendo 64M).

Aquí hay una publicación que hice en el DBA StackExchange para calcular el tamaño recomendado de innodb_buffer_pool_size .

ACTUALIZACIÓN 2011-10-15 19:55 EDT

Si sabe que tendrá 5 GB de datos, entonces mi primera recomendación fue correcta. Sin embargo, olvidé agregar una cosa:

[mysqld]
innodb_buffer_pool_size=5G
innodb_log_file_size=1280M

El tamaño del archivo de registro debe ser el 25% del InnoDB Buffer Pool

ACTUALIZACIÓN 2011-10-16 13:36 EDT

La regla del 25% se basa estrictamente en el uso de dos archivos de registro. Si bien es posible utilizar múltiples archivos de registro innodb, dos generalmente funcionan mejor.

Otros han expresado usar 25%

Sin embargo, para ser justos, alguien de la compañía original de InnoBase Oy expresó que no usaba la regla del 25% debido a que tenía un InnoDB Buffers Pool más grande .

Naturalmente, la regla del 25% no puede funcionar cuando se tienen grandes cantidades de RAM. De hecho, el tamaño más grande de innodb_log_file_size permitido usando solo 2 archivos de registro es 2047M, ya que el tamaño combinado del archivo de registro debe ser inferior a 4G (4096M)

CASO EN PUNTO: Uno de los clientes de mi empleador tiene un servidor de base de datos con 192 GB de RAM. No hay forma de tener archivos de registro 48G. Simplemente uso el tamaño máximo de archivo para un archivo de registro innodb, 2047M. El comentario de @ Kvisle sobre mi respuesta simplemente da un enlace que indica que no tiene que limitarse a dos archivos de registro. Si tiene N archivos de registro, no pueden totalizar 4G. Mi regla del 25% está en un mundo perfecto (Servidor DB con 8GB o menos).

RolandoMySQLDBA
fuente
Gracias, definitivamente usaré mysqltuner.pl. Sin embargo, debo preguntar, ¿esa secuencia de comandos seguirá siendo precisa si mi base de datos está vacía ahora? Tengo todas las tablas y esquemas configurados correctamente, pero no hay datos reales. Usé los 5 gb como tamaño de ejemplo que usaría en mi servidor dedicado actual (es decir, una vez que la base de datos sea más grande que eso, probablemente cambiaré a un servidor dedicado mejor). Actualmente la base de datos está vacía (es un sitio nuevo que no se ha lanzado) pero quiero ajustar mysql para manejar el escalado y el prelanzamiento.
billmalarky
¡Actualicé mi respuesta!
RolandoMySQLDBA
Quiero comentar sobre "Debe ser el 25% del InnoDB Buffer Pool". Porque no es 100% cierto. Lea dev.mysql.com/doc/refman/5.0/en/… para obtener una respuesta más elaborada. En cuanto al rendimiento, ayuda mucho a aumentar un poco el tamaño del valor predeterminado, pero no tiene que maximizarlo.
Kvisle
Rolando, gracias por la ayuda. He marcado este hilo como referencia. Además, estoy usando ese script mysqltuner ahora.
billmalarky