Uso máximo de memoria de MySQL

111

Me gustaría saber cómo es posible establecer un límite superior en la cantidad de memoria que usa MySQL en un servidor Linux.

En este momento, MySQL seguirá ocupando memoria con cada nueva consulta solicitada, por lo que eventualmente se quedará sin memoria. ¿Hay alguna manera de establecer un límite para que MySQL no utilice más de esa cantidad?

Shilovk
fuente
4
MySQL no "ocupa memoria para cada nueva consulta y eventualmente se agota". El uso de la memoria es mucho más complejo que eso.
Rick James

Respuestas:

183

El uso máximo de memoria de MySQL depende en gran medida del hardware, su configuración y la base de datos en sí.

Hardware

El hardware es la parte obvia. Cuanta más RAM, mejores y más rápidos discos ftw . Sin embargo, no crea esos boletines de noticias mensuales o semanales. MySQL no escala de forma lineal, ni siquiera en hardware de Oracle. Es un poco más complicado que eso.

La conclusión es: no existe una regla general para lo que se recomienda para su configuración de MySQL. Todo depende del uso actual o de las proyecciones.

Configuración y base de datos

MySQL ofrece innumerables variables y conmutadores para optimizar su comportamiento. Si tiene problemas, realmente necesita sentarse y leer el (f'ing) manual.

En cuanto a la base de datos, algunas limitaciones importantes:

  • motor de la mesa ( InnoDB, MyISAM, ...)
  • Talla
  • índices
  • uso

La mayoría de los consejos de MySQL sobre stackoverflow le informarán sobre 5-8 de las llamadas configuraciones importantes. En primer lugar, no todos importan, por ejemplo, asignar muchos recursos a InnoDB y no usar InnoDB no tiene mucho sentido porque esos recursos se desperdician.

O, mucha gente sugiere aumentar la max_connectionvariable, bueno, poco saben que también implica que MySQL asignará más recursos para atenderlos max_connections, si alguna vez es necesario. La solución más obvia podría ser cerrar la conexión de la base de datos en su DBAL o bajar el wait_timeoutpara liberar esos hilos.

Si me entiendes, hay mucho, mucho para leer y aprender.

Motores

Los motores de tabla son una decisión bastante importante, muchas personas se olvidan de ellos desde el principio y luego de repente se encuentran peleando con una MyISAMtabla de 30 GB que bloquea y bloquea toda su aplicación.

No quiero decir que MyISAM apesta , pero InnoDBse puede modificar para responder casi o casi tan rápido como MyISAMy ofrece el bloqueo de filas, UPDATEmientras que MyISAMbloquea toda la tabla cuando se escribe.

Si tiene la libertad de ejecutar MySQL en su propia infraestructura, es posible que también desee verificar el servidor percona porque, además de incluir muchas contribuciones de compañías como Facebook y Google (lo saben rápido), también incluye el propio servidor de Percona. en reemplazo de InnoDB, llamado XtraDB.

Consulte mi esencia para la configuración de percona-server (y -client) (en Ubuntu): http://gist.github.com/637669

Talla

El tamaño de la base de datos es muy, muy importante; lo crea o no, la mayoría de la gente en Intarwebs nunca ha manejado una configuración de MySQL grande y de escritura intensa, pero esas realmente existen. Algunas personas dirán algo como, "¡¡¡Usa PostgreSQL !!! 111", pero ignorémoslos por ahora.

La conclusión es: a juzgar por el tamaño, se debe tomar una decisión sobre el hardware. Realmente no puede hacer que una base de datos de 80 GB se ejecute rápidamente en 1 GB de RAM.

Índices

No lo es: cuanto más, mejor. Solo se deben establecer los índices necesarios y se debe verificar el uso EXPLAIN. Agregue a eso que MySQL EXPLAINes realmente limitado, pero es un comienzo.

Configuraciones sugeridas

Sobre estos my-large.cnfy my-medium.cnfarchivos, ni siquiera sé para quién fueron escritos. Enrolla el tuyo.

Primer tuning

Un gran comienzo es el manual de afinación . Es un script de bash (pista: necesitará Linux) que toma la salida de SHOW VARIABLESy SHOW STATUSy la envuelve en una recomendación útil. Si su servidor ha funcionado durante algún tiempo, la recomendación será mejor ya que habrá datos en los que basarlos.

Sin embargo, la cartilla de afinación no es una salsa mágica. Aún debe leer todas las variables que sugiere cambiar.

Leyendo

Realmente me gusta recomendar el mysqlperformanceblog . Es un gran recurso para todo tipo de consejos relacionados con MySQL. Y no es solo MySQL, también saben mucho sobre el hardware adecuado o recomiendan configuraciones para AWS, etc. Estos muchachos tienen años y años de experiencia.

Otro gran recurso es planet-mysql , por supuesto.

Hasta que
fuente
No sé tuning primer, ¿cómo se compara mysqltuner?
greg0ire
38

Usamos estas configuraciones:

etc/my.cnf
innodb_buffer_pool_size = 384M
key_buffer = 256M
query_cache_size = 1M
query_cache_limit = 128M
thread_cache_size = 8
max_connections = 400
innodb_lock_wait_timeout = 100

para un servidor con las siguientes especificaciones:

Dell Server
CPU cores: Two
Processor(s): 1x Dual Xeon
Clock Speed: >= 2.33GHz
RAM: 2 GBytes
Disks: 1×250 GB SATA
Ignacio Pascual
fuente
16
Creo que usted (y el autor al que enlaza) tienen query_cache_size y query_cache_limit al revés. Le está diciendo a MySQL: asigne un caché de 1 MB, pero no realice consultas que superen los 128 MB. dev.mysql.com/doc/refman/5.0/en/query-cache-configuration.html
AGTB
Bajaría max_connections. Decidiría qué motor usar y no asignaría mucho espacio para ambos.
Rick James
19

El uso de la memoria de la base de datos es un tema complejo. El Blog de rendimiento de MySQL hace un buen trabajo al cubrir su pregunta y enumera muchas razones por las que no es muy práctico "reservar" memoria.

Si realmente desea imponer un límite estricto, puede hacerlo, pero tendrá que hacerlo a nivel del sistema operativo, ya que no hay una configuración incorporada. En Linux, podría utilizar ulimit , pero probablemente tendría que modificar la forma en que MySQL se inicia para imponer esto.


La mejor solución es ajustar su servidor, de modo que una combinación de la configuración habitual de memoria de MySQL resulte en un uso de memoria generalmente menor por su instalación de MySQL. Por supuesto, esto tendrá un impacto negativo en el rendimiento de su base de datos, pero algunas de las configuraciones que puede modificar my.inison:

key_buffer_size
query_cache_size
query_cache_limit
table_cache
max_connections
tmp_table_size
innodb_buffer_pool_size

Comenzaría por ahí y vería si puede obtener los resultados que desea. Hay muchos artículos sobre cómo ajustar la configuración de la memoria MySQL.


Editar:

Tenga en cuenta que algunos nombres de variables han cambiado en las versiones 5.1.x más recientes de MySQL .

Por ejemplo:

table_cache

Es ahora:

table_open_cache
zombat
fuente
2
¡Hola! Gracias por tu respuesta. He notado que la ecuación que la gente cita es la siguiente: key_buffer_size + (read_buffer_size + sort_buffer_size) * max_connections = Memoria total. He configurado lo siguiente: key_buffer_size = 128M, read_buffer_size = 1M, sort_buffer_size = 2M, max_connections = 120, y la memoria total en el servidor es 512M. Sin embargo, después de muchas consultas, la memoria libre ha bajado hasta 12M y probablemente continuará disminuyendo con un mayor uso. ¿Hay alguna razón por la que esto sea así y se puede prevenir? ¡Gracias!
¿O tal vez necesito tener en cuenta no la memoria total en el servidor (512M) sino la memoria libre (es decir, la memoria disponible después de cargar todos los programas relacionados con el sistema operativo y otros)?
1
Si va a modificar tmp_table_size con la intención de aumentar el tamaño de las tablas temporales que se pueden almacenar en la RAM, recuerde también aumentar el max_heap_table_size, ya que MySQL usa el mínimo de los dos ...
Dave Rix
1
@TimothyMilsud - Ninguna fórmula como esa realmente funciona. Y la mayoría de los servidores funcionan bastante bien cuando una fórmula afirma que se está utilizando demasiada RAM.
Rick James
19

mysqld.exe estaba usando 480 mb en RAM. Descubrí que agregué este parámetro a my.ini

table_definition_cache = 400

que redujo el uso de memoria de más de 400.000 kb a 105.000 kb

Sarvar Nishonboev
fuente
¿En qué sección va esto? Lo agregué al mío y el servicio se negó a comenzar.
Error de sintaxis
No importa, lo moví bajo [wampmysqld] y funcionó muy bien y redujo significativamente la memoria que estaba usando. Creo que también puede haber acelerado la carga de mis páginas de localhost en el proceso, ahora parecen más rápidas.
Error de sintaxis
Aunque el valor predeterminado y mínimo es 400, ¿qué lo llevó a más de 400 en su caso?
Wadih M.
5

en /etc/my.cnf:

[mysqld]
...

performance_schema = 0

table_cache = 0
table_definition_cache = 0
max-connect-errors = 10000

query_cache_size = 0
query_cache_limit = 0

...

Buen trabajo en el servidor con 256 MB de memoria.

Shilovk
fuente
¿Por qué el table_definition_cache= 0? Alguna explicación estaría bien. Y básicamente no almacena en caché las consultas ... el mismo efecto si query_cache_type = 0:)
Khom Nazid
0

Si está buscando optimizar su contenedor mysql de docker, el siguiente comando puede ayudar. Pude ejecutar el contenedor de mysql docker desde un 480mb predeterminado a solo 100 mbs

docker ejecutar -d -p 3306: 3306 -e MYSQL_DATABASE = prueba -e MYSQL_ROOT_PASSWORD = tooo -e MYSQL_USER = prueba -e MYSQL_PASSWORD = prueba -v / mysql: / var / lib / mysql --name mysqldb mysql --table_definition_cache = 100 --performance_schema = 0 --por defecto-autenticación-complemento = mysql_native_password

Rohit Salecha
fuente