Optimizando el servidor Mysql
|Trabajando en un proyecto personal (que pronto les contare en que consiste), me surgió la necesidad de optimizar al máximo el servidor MySQL, es decir, necesitaba configurar el servidor MySQL de una forma adecuada para que soportara todo el trabajo necesario. Navegando en la red, me encontré con este articulo, en el cual nos comparten una configuración óptima para nuestro servidor MySQL (lo que estábamos buscando). Implemente este archivo de configuración, y desde ese momento mi servidor ha mejorado en cuanto a rendimiento, disponibilidad y eficiencia.
Por esta razón comparto el archivo de configuración por si alguno tiene el mismo problema, en este archivo se hacen modificaciones principalmente, en el tamaño de la memoria, conexiones concurrentes y otros aspectos:
[mysqld] socket=/path/to/mysql.sock datadir=/var/lib/mysql skip-locking skip-innodb # MySQL 4.x has query caching available. # Enable it for vast improvement and it may be all you need to tweak. query_cache_type=1 query_cache_limit=1M query_cache_size=32M # max_connections=500 # Reduced to 200 as memory will not be enough for 500 connections. # memory=key_buffer+(sort_buffer_size+read_buffer_size)*max_connections # which is now: 64 + (1 + 1) * 200 = 464 MB # max_connections = approx. MaxClients setting in httpd.conf file # Default set to 100. #max_connections=200 #interactive_timeout=180 interactive_timeout=100 #wait_timeout=180 #wait_timeout=100 # Reduced wait_timeout to prevent idle clients holding connections. #wait_timeout=30 wait_timeout=15 connect_timeout=10 # max_connect_errors is set to 10 by default #max_connect_errors=10 #table_cache=256 #table_cache=1024 # Checked opened tables and adjusted accordingly after running for a while. table_cache=512 #tmp_table_size=32M by default #thread_cache=128 # Reduced it to 32 to prevent memory hogging. Also, see notes below. thread_cache=32 # key_buffer=258M # Reduced it by checking current size of *.MYI files, see notes below. key_buffer=128M # Commented out the buffer sizes and keeping the default. # sort_buffer_size=2M by default. #sort_buffer_size=1M # read_buffer_size=128K by default. #read_buffer_size=1M # read_rnd_buffer_size=256K by default. #read_rnd_buffer_size=1M # myisam_sort_buffer_size=8M by default. #myisam_sort_buffer_size=64M # thread_concurrency = 2 * (no. of CPU) thread_concurrency=2 # log slow queries is a must. Many queries that take more than 2 seconds. # If so, then your tables need enhancement. log_slow_queries=/var/log/mysqld.slow.log long_query_time=2 [mysql.server] user=mysql basedir=/var/lib [safe_mysqld] err-log=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid open_files_limit=8192 [mysqldump] quick max_allowed_packet=16M [mysql] no-auto-rehash # Remove the next comment character if you are not familiar with SQL #safe-updates [isamchk] key_buffer=64M sort_buffer=64M read_buffer=16M write_buffer=16M [myisamchk] key_buffer=64M sort_buffer=64M read_buffer=16M write_buffer=16M [mysqlhotcopy] interactive-timeout [client] socket=/path/to/mysql.sock
Para aplicar esta configuración, lo podemos hacer de varias formas:
- Abrimos el archivo /etc/mysql/my.cnf borramos todo su contenido y por ultimo pegamos el contenido de esta configuracion. ( No sobra decir que debemos guardar).
- Por otro lado podemos borrar el archivo /etc/mysql/my.cnf, descargamos el nuevo archivo desde aca y lo copiamos en la misma ubicacion.
nota: cabe aclarar que no soy un experto en el tema, simplemente doy mis comentarios apartir de la experiencia que tuve usando esta configuracion, si alguien tiene un archivo my.cnf mas optimizado seria esplendido que lo compartiera con todos nosotros
Para mas informacion pueden ir a este enlace
Aplica para un servidor de hosting compartido?
@hieluki todo depende del uso que se el este dando al servidor mysql, no me atreveria a decirte que serviria en tu caso, ya que como lo comente en la entrada no soy muy experto en el tema, sin embargo, si te animas a probarlo, me gustaria saber tu experiencia….
un saludo..
A mi me gusta ver las ventajas que traen estos scripts optimizados, pero mas que eso me gusta ver también las desventajas que puedan tener, Que peros le has visto hasta el momento??
@d5ck mmm ps no le he visto problema alguno, aunque solo lo llevo probando 2 dias, apenas vea alguna desventaja les contare…
un saludo
Cada servidor tiene una carga diferente por lo que no se puede generalizar sino ya vendría todo por defecto.
Para tablas innodb creo que en general es bueno el:
innodb_flush_method=O_DIRECT
De esta forma evitas el problema del doble buffer: Tanto el SO como el MySQL cachea, por lo que realmente tienes la mitad de memoria para cache (ya que la doble cache no sirve de nada)
saludos!
@jordi muchas gracias por el aporte!! alguien mas tiene esos tips de todo sysadmin?
Y esta configuración te ha funcionado con el MySQL 5.2.42? porque según veo esa configuración es para la rama 4.
Tal y como dicen, esa configuración estará bien (o no), para tu servidor, pero lo ideal es configurar mysql según su carga (basándonos en los logs), y según la capacidad de tu servidor.
Como esto puede llegar a ser un trabajo de chinos, ya hay gente que tiene scripts capaces de hacerlo por nosotros, puedes ver un ejemplo aquí: http://www.maestrosdelweb.com/editorial/mysqltuner-ayuda-para-optimizar-mysql/
Un saludo!