MySQL: ¿Cómo obtengo mi "Uso máximo de memoria posible"?

16

Recientemente he tenido problemas con la paliza como resultado de la falta de memoria. (Mi VPS tiene 256M en total)

Estoy tratando de sintonizar MySQL usando mysqltuner.pl y obtengo los siguientes resultados:

-------- Estadísticas Generales ---------------------------------------- ----------
[-] Verificación de versión omitida para el script MySQLTuner
[OK] Actualmente ejecuta MySQL compatible versión 5.0.51a-3ubuntu5.4-log
[OK] Operando en arquitectura de 64 bits

-------- Estadísticas del motor de almacenamiento --------------------------------------- ----
[-] Estado: + Archivo -BDB -Federated -InnoDB -ISAM -NDBCluster 
[-] Datos en tablas MyISAM: 114M (Tablas: 454)
[!!] Tablas totales fragmentadas: 34

-------- Métricas de rendimiento ---------------------------------------- ---------
[-] Hasta: 40 s (570 q [14.250 qps], 23 conn, TX: 154K, RX: 23K)
[-] Lecturas / Escrituras: 100% / 0%
[-] Buffers totales: 338.0M global + 2.7M por hilo (20 hilos máximo)
[!!] Uso de memoria máximo posible: 392.9M (153% de RAM instalada)
[OK] Consultas lentas: 0% (5/570)
[OK] Mayor uso de conexiones disponibles: 15% (3/20)
[!!] Tamaño del búfer clave / índices totales de MyISAM: 8.0M / 9.4M
[!!] Tasa de aciertos del búfer clave: 57,1% (7 en caché / 3 lecturas)
[Aceptar] Eficiencia de caché de consulta: 21,9% (7 en caché / 32 selecciones)
[OK] Consulta de ciruelas pasas por día: 0
[OK] Clasificaciones que requieren tablas temporales: 0% (0 clasificaciones temporales / 1 clasificaciones)
[OK] Tablas temporales creadas en disco: 0% (0 en disco / 32 en total)
[OK] Tasa de aciertos de caché de subprocesos: 86% (3 creadas / 23 conexiones)
[OK] Tasa de aciertos de caché de tabla: 26% (128 abiertos / 484 abiertos)
[OK] Límite de archivo abierto utilizado: 25% (259 / 1K)
[OK] Bloqueos de tabla adquiridos inmediatamente: 100% (492 inmediatos / 492 bloqueos)

-------- Recomendaciones ----------------------------------------- ------------
Recomendaciones generales:
    Ejecute OPTIMIZE TABLE para desfragmentar tablas para un mejor rendimiento
    MySQL comenzó en las últimas 24 horas: las recomendaciones pueden ser inexactas
    Reduzca su huella general de memoria MySQL para la estabilidad del sistema
Variables a ajustar:
  *** El uso máximo de memoria de MySQL es peligrosamente alto ***
  *** Agregue RAM antes de aumentar las variables del búfer MySQL ***
    key_buffer_size (> 9.4M)

¿Pero estoy un poco confundido sobre cómo reducir el uso máximo de memoria? Parece estar basado en key_buffer y max_ connections, pero ¿debe haber algo más involucrado también?

my.cnf:

key_buffer = 8M
max_allowed_packet = 12M
thread_stack = 128K
thread_cache_size = 8
max_ connections = 20
table_cache = 128
tmp_table_size = 256M
max_heap_table_size = 256M
join_buffer_size = 256K
query_cache_limit = 8M
query_cache_size = 64M

He estado tratando de leer los artículos de ajuste de MySQL, ¡pero parecen estar dirigidos a personas que ya saben lo que están haciendo! Cualquier ayuda sería apreciada. ¡Gracias!

Mella
fuente
1
Seguí el consejo del comentarista y lo reduje a un nivel razonable, pero todavía tengo curiosidad acerca de lo que podrían ser los parques de pelota cuerdos para esos valores. ¡Algunos artículos en línea usan 64K y otros recomiendan 512M por el mismo valor!
Nick

Respuestas:

10

Tiene un servidor con 256M, pero no puede usar todo eso; recuerde que hay algunos gastos generales del sistema operativo. Agregue a eso el hecho de que se está comprometiendo demasiado como lo han mencionado otras personas y definitivamente golpeará aquí. 256M es suficiente para una pequeña base de datos, 20 conexiones son muchas con lo que has configurado.

1) reduce tus conexiones máximas a 4 (estás usando 3 de 20)

2) optimiza mejor tu caché de consultas; 8M es realmente grande, y 64M en total se basan mucho en tus golpes / ciruelas pasas; pruebe un combo 4/32 y vea cómo va. Realmente creo que un combo de 2/24 funcionaría para ti.

3) no tiene ningún tipo que requiera tablas temporales, ¿por qué ese verbo max_heap_table_size está ahí? Comenta eso, usa los valores predeterminados

4) ¿realmente tienes 128 mesas? Intenta cortar esa tabla_caché a la mitad a 64 o 48

5) reduce thread_cache_size a 4

6) optimizar esas tablas para reducir la fragmentación

Esas son algunas cosas para comenzar. Parece que arrojó un montón de números en una configuración sin ningún perfil real para saber lo que necesita y ha creado un desastre; Si todo lo demás falla, regrese a los valores predeterminados, elimine su configuración personalizada y comience de nuevo utilizando algunas guías de ajuste de rendimiento que puede encontrar en Google. Obtenga la salida de SHOW VARIABLES y SHOW STATUS, encuentre cualquiera de las miles de guías de ajuste y conecte sus números reales y reales en sus ecuaciones y eso le dirá los números exactos que necesita para poner en su archivo de configuración.

Troyengel
fuente
3
Esta es una vieja respuesta a una vieja pregunta, pero me gustaría señalar que en el resultado de mysqltuner publicado por el autor de la pregunta, el servidor solo ha estado activo durante 40 años, lo que no es suficiente tiempo para juzgar con precisión las cargas que verá el servidor . Lo ideal sería ejecutar mysqltuner varias veces en el transcurso de un día o más, y luego analizar los resultados. Aparte de eso, sus sugerencias son sólidas.
instanceofTom
8

No soy un gurú de MySQL y no puedo diagnosticar el problema con esta información, pero intenté buscar la fórmula en el código fuente. Aquí está:

server_buffers + total_per_thread_buffers * max_connections

Dónde:

server_buffers = key_buffer_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + query_cache_size

y:

total_per_thread_buffers = read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + max_allowed_packet + join_buffer_size

Ahora debe verificar cada uno de estos valores y determinar cuál es el responsable de este gran número. Y no confíe en este script sin reservas: intenté ejecutarlo en uno de mis servidores de base de datos y calculó que la memoria máxima es el 140% de la cantidad total de memoria física, pero el sistema ha estado funcionando durante años sin problemas de estabilidad.

¡Buena suerte!

Georgi Hristozov
fuente
0

Si no recuerdo mal, MySQL Tuner usa la siguiente fórmula para estimar el uso máximo:

read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size

Tenga en cuenta que esto no es 100% correcto, y de hecho es solo una estimación, ya que ciertas configuraciones en MySQL no tienen un límite definido.

Puede comenzar a atenuar algunas de las configuraciones en su archivo de configuración y ejecutar el sintonizador nuevamente, pero le aconsejaría que obtenga la ayuda de un experto si no tiene tiempo que perder cambiando my.cnf, reiniciando y ejecutando el sintonizador.

gekkz
fuente
0

El uso del software mysqlcalculator.com puede ahorrarle muchas horas.

Wilson Hauck
fuente