mysql - segundo - optimizar mariadb
Uso máximo de memoria de MySQL (5)
Me gustaría saber cómo es posible establecer un límite superior en la cantidad de memoria que MySQL usa en un servidor Linux.
En este momento, MySQL seguirá ocupando memoria con cada nueva consulta solicitada para que eventualmente se quede sin memoria. ¿Hay alguna manera de establecer un límite para que MySQL no use más de esa cantidad?
El uso de la memoria de la base de datos es un tema complejo. El MySQL Performance Blog hace un buen trabajo al cubrir su pregunta, y enumera muchas razones por las cuales es muy poco práctico "reservar" la memoria.
Si realmente desea imponer un límite estricto, podría hacerlo, pero tendría que hacerlo en el nivel del sistema operativo ya que no hay una configuración incorporada. En Linux, puede utilizar ulimit , pero es probable que tenga que modificar la forma en que se inicia MySQL para imponer esto.
La mejor solución es sintonizar su servidor, de modo que una combinación de las configuraciones de memoria MySQL usuales resultará en un uso de memoria generalmente menor por su instalación de MySQL. Esto, por supuesto, tendrá un impacto negativo en el rendimiento de su base de datos, pero algunas de las configuraciones que puede modificar en my.ini
son:
key_buffer_size
query_cache_size
query_cache_limit
table_cache
max_connections
tmp_table_size
innodb_buffer_pool_size
Empezaría allí y vería si puede obtener los resultados que desea. Hay many articles sobre cómo ajustar la configuración de memoria de 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
El uso máximo de memoria de MySQL depende mucho del hardware, su configuración y la base de datos en sí.
Hardware
El hardware es la parte obvia. Cuanta más RAM, mejor, discos más rápidos ftw . Sin embargo, no creas esas cartas de noticias mensuales o semanales. MySQL no escala linealmente, ni siquiera en hardware Oracle. Es un poco más complicado que eso.
La conclusión es: no hay una regla general para lo que se recomienda para su configuración de MySQL. Todo depende del uso actual o las proyecciones.
Configuración y base de datos
MySQL ofrece innumerables variables e interruptores para optimizar su comportamiento. Si tiene problemas, realmente necesita sentarse y leer el manual (f''ing).
En cuanto a la base de datos, algunas limitaciones importantes:
- motor de tabla (
InnoDB
,MyISAM
, ...) - tamaño
- índices
- uso
La mayoría de los consejos de MySQL sobre le informarán acerca de 5-8 los llamados ajustes importantes. En primer lugar, no todos son importantes, por ejemplo, asignar muchos recursos a InnoDB y no usar InnoDB no tiene mucho sentido porque esos recursos se desperdician.
O bien, muchas personas sugieren subir la variable max_connection
; bueno, poco saben que también implica que MySQL asignará más recursos para atender esos max_connections
, si es que alguna vez lo necesita. 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_timeout
para liberar esos hilos.
Si entiendes mi deriva, hay mucho, mucho que leer y aprender.
Motores
Los motores de mesa son una decisión bastante importante, muchas personas se olvidan de ellos desde el principio y de repente se encuentran luchando con una mesa MyISAM
30 GB que bloquea y bloquea toda su aplicación.
No quiero decir que MyISAM es una mierda , pero InnoDB
puede ajustarse para responder casi o casi tan rápido como MyISAM
y ofrece el bloqueo de filas en UPDATE
mientras que MyISAM
bloquea toda la tabla cuando se escribe en ella.
Si tiene la libertad de ejecutar MySQL en su propia infraestructura, también puede consultar el servidor de Percona porque incluye muchas contribuciones de compañías como Facebook y Google (lo saben rápido), y también incluye las de Percona. en reemplazo de InnoDB
, llamado XtraDB
.
Ver mi esencia para la configuración percona-server (y -client) (en Ubuntu): http://gist.github.com/637669
tamaño
El tamaño de la base de datos es muy, muy importante. Lo crea o no, la mayoría de las personas en los Intarwebs nunca han manejado una configuración de MySQL grande y de escritura intensa, pero realmente existen. Algunas personas troll y dicen algo como, "¡Use PostgreSQL !!! 111", pero ignorémoslas por el momento.
La conclusión es: a juzgar por el tamaño, se tomará una decisión sobre el hardware. Realmente no se puede ejecutar rápidamente una base de datos de 80 GB con 1 GB de RAM.
Índices
No lo es: cuanto más, mejor. Solo se deben establecer los índices necesarios y el uso debe verificarse con EXPLAIN
. Agregue a eso que EXPLAIN
de MySQL es realmente limitado, pero es un comienzo.
Configuraciones sugeridas
Acerca de estos archivos my-large.cnf
y my-medium.cnf
, ni siquiera sé para quién fueron escritos. Tira el tuyo.
Primer de sintonización
Un buen comienzo es el cebador de afinación . Es un script bash (sugerencia: necesitarás linux) que toma el resultado de SHOW VARIABLES
y SHOW STATUS
y lo envuelve en una recomendación útil. Si su servidor se ha ejecutado algún tiempo, la recomendación será mejor, ya que habrá datos para basarlos.
Sin embargo, la imprimación 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 solo es MySQL, también saben mucho sobre el hardware correcto o recomiendan configuraciones para AWS, etc. Estos tipos tienen años y años de experiencia.
Otro gran recurso es planet-mysql , por supuesto.
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
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.
mysqld.exe estaba usando 480 mb en RAM. Descubrí que agregué este parámetro a my.ini
table_definition_cache = 400
eso redujo el uso de memoria de 400,000+ kb a 105,000kb