Nota: Este artículo fue publicado originalmente en 2014. Algunos pasos, comandos o versiones de software pueden haber cambiado. Consulta la documentación actual de MySQL para obtener la información más reciente.
En esta guía paso a paso, aprenderás a instalar y usar MySQLTuner para optimizar la configuración / rendimiento de MySQL. MySQL es un sistema de gestión de bases de datos relacionales de código abierto ampliamente utilizado en aplicaciones web, particularmente con PHP y WordPress.
Cómo: Instalar y usar MySQLTuner para Optimizar la configuración / rendimiento de MySQL
Escribo este artículo principalmente porque hay en mi opinión una forma mucho mejor de instalar MySQLTuner en tu máquina que el habitual apt-get install MySQLTuner. Como muchos de ustedes probablemente ya saben, MySQLTuner es una herramienta bien conocida y ampliamente utilizada. Te da un resumen muy bueno de cómo está funcionando tu configuración y te señala dónde puedes hacer mejoras para obtener un rendimiento aún mejor de tu servidor de base de datos. Generalmente recomiendo a la gente instalar Percona (que es un reemplazo directo de MySQL). Percona está basado en el código de MySQL pero es más interesante (agregan más características de rendimiento que solo encontrarías en la versión comercial de MySQL y hacen un mejor trabajo manteniéndose actualizados que Oracle). Debido a eso, incluso escribí en el artículo: (</databases/mysql/install-mysql-ubuntu-server/> “How to: Install MySQL in an Ubuntu Server”) instrucciones sobre cómo instalar Percona en lugar de MySQL al final como alternativa sugerida.
De todas formas, como mencioné anteriormente, la razón principal de este artículo es enfocarse en una alternativa a simplemente apt-get install MySQLTuner. ¿Y por qué es eso? Bueno, veamos qué dice ejecutar ese comando en una de mis máquinas servidor:
apt-get install MySQLTuner Reading package lists… Done Building dependency tree Reading state information… Done The following packages were automatically installed and are no longer required : libperconaserverclient18.1 percona-server-common-5.6 Use ‘apt-get autoremove’ to remove them. The following extra packages will be installed : libhtml-template-perl libterm-readkey-perl mysql-client-5.5 mysql-client-core-5.5 mysql-common mysql-server mysql-server-5.5 mysql-server-core-5.5 Suggested packages: libipc-sharedcache-perl tinyca mailx The following packages will be REMOVED : percona-server-client-5.6 percona-server-server-5.6 The following NEW packages will be installed: libhtml-template-perl libterm-readkey-perl mysql-client-5.5 mysql-client-core-5.5 mysql-common mysql-server mysql-server-5.5 mysql-server-core-5.5 mysqltuner 0 upgraded, 9 newly installed, 2 to remove and 0 not upgraded. Need to get 24.8 MB/24.8 MB of archives. After this operation, 20.4 MB disk space will be freed. Do you want to continue ? N Abort.
Como se resaltó en negrita, el instalador intentará eliminar el servidor Percona, instalará en su lugar mysql y un montón de otras bibliotecas. La mayoría de las veces esto está bien, pero muchas veces encontrarás que solo quieres la herramienta y estás contento con Percona como yo. Entonces, ¿qué hacer?
Afortunadamente MySQLTuner es una herramienta escrita en perl y solo requiere bibliotecas de cliente para conectarse a mysql, lo cual no es gran cosa (el cliente de percona está disponible). Simplemente ve a: https://github.com/major/MySQLTuner-perl y descarga el archivo mysqltuner.pl para obtener la última versión (haz un wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl). Una vez que hayas descargado el script, todo lo que tienes que hacer es ir a la ubicación donde lo guardaste y ejecutar perl mysqltuner.pl y listo.
Ahora, si estás buscando algunos consejos sobre cómo usar esta herramienta y cambios recomendados, aquí hay algunos puntos destacados:
I. Si solo estás usando PHP (piensa en WordPress) entonces definitivamente cambia el wait_timeout.
Por defecto es de 8 horas pero si por alguna razón la aplicación no cierra la conexión, podría quedarse ahí colgada hasta 8 horas (así que empiezas a tener muchas conexiones abiertas dormidas que consumen recursos).
wait_timeout = 30 #default is 28800
Puedes dejar el interactive timeout como está. Este generalmente tiene un valor más alto que wait_timeout y como podrás adivinar, requiere interacción para permanecer en estado de espera.
II. Cambia el número máximo de conexiones.
En mi instalación era 500. Cada conexión usa un poco de recursos también, incluso si no está en uso. MySQLTuner puede ayudarte a ver con el tiempo cuál es el número máximo de conexiones que terminas usando para que puedas ajustar en consecuencia. Por ejemplo, si estás usando PHP-FPM probablemente no usarás más conexiones que el número máximo de procesos hijo que tienes. Considera eso y examina la salida de MySQLTuner para decidir cuál es el mejor número. Deja tu número máximo de conexiones (después de tener MySQL ejecutándose durante al menos 24 horas, preferiblemente 7 días para obtener métricas de una semana completa) en aproximadamente 80% (así que incrementa el uso máximo en un 25% al configurar esta variable)
max_connections = 50 #default is 500
III. Ejecuta MySQLTuner
Examinemos algo de la salida:
perl mysqltuner.pl >> MySQLTuner 1.3.0 - Major Hayden major@mhtx.net >> Bug reports, feature requests, and downloads at http://mysqltuner.com/ >> Run with ‘—help’ for additional options and output filtering -------- Security Recommendations ------------------------------------------- All database users have passwords assigned -------- Performance Metrics ------------------------------------------------- Up for: 4h 51m 32s (354K q , 3K conn, TX: 2B, RX: 45M) Reads / Writes: 90% / 10% Total buffers: 420.0M global + 1.1M per thread (26 max threads) Maximum possible memory usage: 447.6M (14% of installed RAM) Slow queries: 0% (56/354K) Highest usage of available connections: 42% (11/26) Key buffer size / total MyISAM indexes: 16.0M/100.0K Key buffer hit rate: 99.0% (100 cached / 1 reads) Query cache efficiency: 78.9% (260K cached / 330K selects) Query cache prunes per day: 0 Sorts requiring temporary tables: 0% (0 temp sorts / 6K sorts) Temporary tables created on disk: 36% (3K on disk / 8K total) Thread cache hit rate: 99% (11 created / 3K connections) Table cache hit rate: 28% (363 open / 1K opened) Open file limit used: 0% (48/65K) Table locks acquired immediately: 100% (85K immediate / 85K locks) InnoDB buffer pool / data size: 128.0M/49.3M InnoDB log waits: 0 -------- Recommendations ----------------------------------------------------- General recommendations: Run OPTIMIZE TABLE to defragment tables for better performance MySQL started within last 24 hours - recommendations may be inaccurate When making adjustments, make tmp_table_size/max_heap_table_size equal Reduce your SELECT DISTINCT queries without LIMIT clauses Variables to adjust: tmp_table_size (> 30M) max_heap_table_size (> 30M)
Como mencioné anteriormente, querrás ejecutar esto contra tu servidor al menos 24 horas después de haber iniciado MySQL para que las recomendaciones sean más precisas (recomendaría ejecutarlo después de 7 días, 30 días, etc. ya que podrías obtener más información cuanto más uso tenga el servidor). Pero por favor no sientas que no obtendrás información importante si lo ejecutas digamos una hora o inmediatamente después de iniciar. Inmediatamente después de iniciar puedes ver si arruinaste algo con la memoria. Mientras que después de una hora podrías tener información valiosa si apenas estás comenzando a optimizar tu configuración. Por ejemplo, aquí ya llegué a usar todo el tamaño de mis tablas temporales, así que este error probablemente no desaparecerá sin importar cuánto tiempo ejecute MySQL. Con el tiempo aprenderás qué recomendaciones deberías esperar para escuchar y cuáles puedes implementar de inmediato.
Haciendo buen uso de esa recomendación, también nota la anterior “Al hacer ajustes, haz que tmp_table_size y max_heap_table_size sean iguales”.
Todos los cambios a tu /etc/mysql/my.cnf generalmente requieren un reinicio del servicio. He intentado el parámetro reload pero mysqltuner no parece notar el cambio.
Mi último consejo es enfocarte en las métricas de rendimiento y la sección de recomendaciones:
- Si estás compartiendo tu servidor con otras aplicaciones, intenta mantener el uso máximo posible de memoria dentro de tus estimaciones de cuánta RAM estás dispuesto a dedicar a MySQL
- Como mencioné, asegúrate de que tu Número Máximo de Conexiones esté en aproximadamente el 80% de las disponibles. Ejecuta MySQL por un tiempo y agrega un 25% más de conexiones al máximo que obtengas.
- Configura las Consultas Lentas. Indica cuántos segundos constituyen una consulta lenta y ve si obtienes pocas o demasiadas.
- Asegúrate de que todos los buffers tengan suficiente RAM.
- Configura tu swappiness a un valor bajo. Intercambiar RAM sí afecta un poco el rendimiento de un servidor MySQL. Recuerda que estás usando la mayoría de estos buffers / caché para evitar tener que ir al disco a buscar información. Para más información sobre cómo configurar qué tan agresivamente intercambiar, mira este artículo: (</linux/ubuntu/configure-swappiness-ubuntu/> “How to: Configure Swappiness in Ubuntu”)
- Mantén la calma y continúa mejorando tu configuración ;). Encontrarás que directamente de fábrica ningún servidor es igual. Con el tiempo y mirando las métricas verás si principalmente escribes o lees, tu actividad y necesidades de memoria, y dimensionarás mejor el servidor y ajustarás los parámetros a la carga que estás recibiendo. Percona tiene una herramienta para ayudarte a generar algunos valores iniciales en: https://tools.percona.com/wizard. Ten en cuenta que deberías entenderlos y aplicarlos quizás individualmente en lugar de simplemente copiar y pegar todo. Si tu servidor se ha usado antes, algunas de las nuevas configuraciones podrían hacerlo colapsar ya que creó tablas con configuraciones diferentes. Además, usar algunos parámetros podría romper aplicaciones como WordPress.
(http://img.zemanta.com/zemified_h.png?x-id=c89eacd2-c247-4ece-ba8a-028aabcefe70)](http://www.zemanta.com/?px “Enhanced by Zemanta”)
Resumen
Has aprendido exitosamente a instalar y usar MySQLTuner para optimizar la configuración / rendimiento de MySQL. Si encuentras algún problema, verifica los requisitos previos y asegúrate de que tu entorno de MySQL esté correctamente configurado.