Ajuste de MySQL: uso elevado de memoria

Ajuste de MySQL: uso elevado de memoria

Estoy intentando ajustar una base de datos mysql usando mysqltuner. Mysqltuner me aconseja que aumente join_buffer_size y query_cache_size. Al mismo tiempo, sin embargo, me advierte que mi uso máximo de memoria es alto, que es del 200 % o más de la RAM instalada (que es 2 GB). El problema en el que me encuentro es, por supuesto, que si hago lo que dice mysqltuner, el uso de memoria se disparará aún más. Entonces ¿qué hago aquí? ¿El problema no es con MySQL sino con las aplicaciones que se ejecutan en este servidor que evidentemente requieren que MySQL realice una gran cantidad de almacenamiento en caché? ¿Cómo procederían los expertos en administradores de MySQL a partir de aquí? Vea el informe de mysqltuner a continuación junto con mi configuración actual de [mysqld]:

Informe MySqlTuner:

MySQLTuner 1.2.0: informes de errores importantes, solicitudes de funciones y descargas de Hayden enhttp://mysqltuner.com/ Ejecute con '--help' para opciones adicionales y filtrado de salida.

-------- Estadísticas Generales ---------------------------------------- ----------
[--] Verificación de versión omitida para el script MySQLTuner
[OK] Actualmente ejecutando la versión compatible de MySQL 5.5.30-log
[OK] Operando en arquitectura de 64 bits

-------- Estadísticas del motor de almacenamiento --------------------------------------- ----
[--] Estado: +Archivo -BDB -Federado +InnoDB -ISAM -NDBCluster
[--] Datos en tablas MyISAM: 310M (Tablas: 264)
[--] Datos en tablas InnoDB: 8M (Tablas: 365)
[--] Datos en tablas PERFORMANCE_SCHEMA: 0B (Tablas: 17) [!!] Total de tablas fragmentadas: 376

-------- Recomendaciones de seguridad ---------------------------------------- ---
[OK] Todos los usuarios de la base de datos tienen contraseñas asignadas

-------- Métricas de rendimiento ---------------------------------------- ---------
[--] Hasta: 20h 20m 10s (2M q [35.305 qps], conexión 25K, TX: 88B, RX: 2B)
[--] Lecturas/Escrituras: 22% / 78 %
[--] Búfer total: 480,0 M global + 33,5 M por subproceso (110 subprocesos máximo)
[!!] Uso máximo de memoria posible: 4,1 G (203 % de la RAM instalada)
[OK] Consultas lentas: 0 % (0/ 2M)
[OK] Uso máximo de conexiones disponibles: 7% (8/110)
[OK] Tamaño del búfer de claves/índices MyISAM totales: 150,0M/129,5M
[OK] Tasa de aciertos del búfer de claves: 100,0% (15M en caché / 7K lecturas )
[OK] Eficiencia de la caché de consultas: 74,3% (762K en caché / 1M de selecciones)
[!!] Eliminaciones de caché de consultas por día: 4341
[OK] Clasificaciones que requieren tablas temporales: 0% (3 clasificaciones temporales / 11K clasificaciones)
[!!] Uniones realizadas sin índices: 3901
[OK] Tablas temporales creadas en el disco: 0% (2K en disco / 547K en total)
[OK] Tasa de aciertos de caché de subprocesos: 99% (8 conexiones creadas / 25K)
[OK] Tasa de aciertos de caché de tablas: 46% (688 abiertos / 1K abiertos)
[OK] Límite de archivos abiertos utilizados: 17% (593/3K)
[OK] Bloqueos de tabla adquiridos inmediatamente: 99% (1M inmediato / 1M bloqueos)
[OK] Tamaño de datos de InnoDB/grupo de buffer : 8,9 millones/256,0 millones

-------- Recomendaciones ----------------------------------------- ------------
Recomendaciones generales:
ejecute OPTIMIZE TABLE para desfragmentar tablas y obtener un mejor rendimiento.
MySQL se inició en las últimas 24 horas; las recomendaciones pueden ser inexactas.
Reduzca su uso general de memoria de MySQL para la estabilidad del sistema.
Ajuste sus consultas de unión a siempre. utilizar índices
Variables para ajustar:
* El uso máximo de memoria de MySQL es peligrosamente alto
Agregue RAM antes de aumentar las variables del búfer MySQL *
query_cache_size (> 32M)
join_buffer_size (> 32,0M, o utilice siempre índices con uniones)

Configuración actual de mysqld en my.cnf:

[mysqld]
local-infile=0
datadir=/var/lib/mysql
usuario=mysql
enlaces-simbólicos=0
puerto = 3306
socket = /var/lib/mysql/mysql.sock
skip-external-locking
key_buffer_size = 150M
max_allowed_packet = 160M
max_connections = 110
wait_timeout = 60
query-cache-type = 1
query-cache-size = 32M
query_cache_limit = 2M
thread_cache_size = 16
tmp_table_size = 32M
max_heap_table_size = 32M
join_buffer_size = 32M
table_open_cache = 128
table_cache = 1600
sort_buffer_size = 512K
longitud_búfer_neta = 8K
tamaño_búfer_lectura = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
innodb_buffer_pool_size = 256M
innodb_additional_mem_pool_size = 2M
innodb_log_buffer_size = 8M

Respuesta1

Tienes una base de datos bastante extraña: realiza muchas más escrituras que lecturas.

Es muy importante que ajuste su DBMS para que funcione bien con Innodbolo ajusta para que funcione bien con MyISAM, pero parece tener una combinación de ambos tipos de tablas. No se puede tener un DBMS que sea óptimo con ambos. Debe comenzar a migrar sus datos a un solo motor. Dada la naturaleza intensa de escritura de la base de datos, recomendaría Innodb.

Búfers totales: 480,0 millones globales + 33,5 millones por subproceso (110 subprocesos máximo)

Actualmente, el riesgo de encontrarse con un intercambio se debe principalmente al uso de memoria por conexión. pero tenga en cuenta que esto es sólo unriesgoEn este momento. También debe establecer si necesita 110 conexiones simultáneas y, preferiblemente, reducirlas un poco. Por lo general, sort_buffer_size es el principal culpable del uso de memoria por conexión, pero el suyo es una cuarta parte del valor predeterminado.

Si está consolidando en innodb, entonces probablemente necesite aumentar el tamaño del grupo de búfer de innodb.

Puedes jugar con diferentes valores.aquí.

información relacionada