La Ingeniería Informática posee tres ramas fundamentales que a su vez se dividen en un sinfín de categorías y procedimientos que es imposible que se puedan conocer al 100%. A lo largo de la carrera aprendes un poco de todo (generalmente por tu cuenta en lo que se refiere a la parte práctica) y al salir como Ingeniero, generalmente en el trabajo que caigas, te especializas en algo más concreto que puede ir orientado a: programación y desarrollo de aplicaciones, gestión de bases de datos, administración de sistemas y otras tantas ramas más, pero principalmente podríamos decir que te orientas a la rama del desarrollo o a la de administración de sistemas.

En mi caso particular, aunque me gustan ambas ramas, siempre he dedicado más tiempo a la parte de desarrollo, aunque en muchas ocasiones me ha tocado también aprender bastante en el ámbito de la administración de sistemas.

Hoy he realizado una tarea de investigación en la cual he intentado encontrar algún modo de optimizar la configuración que utilizo en uno de mis servidores web para poder aprovechar el rendimiento de la máquina en concreto. Digamos que tenemos un ferrari funcionando con un sistema de motor de un seat 600.

Buscando por la red he encontrado varios enlaces que me han gustado mucho y a continuación paso a exponer lo aprendido o lo que he visto que puede ser muy útil para todos.

Gestión de procesos MySQL (generación de backups, exportación e importación de bases de datos, etc)

Comandos de estado MySQL 

Code:
show variables;
show status;

Exportar – http://guias.ovh.es/BackupBaseMySQL

Code:
$ mysqldump -uUsuario -p dbnombre > dbnombre.sql
o
$ mysql -h nombre_de_host -u nombre_de_usuario -pcontraseña base_de_datos > fichero_dump.sql

Importar – http://guias.ovh.es/ImportBaseMySQL

Code:
$ mysql -uUsuario -p dbnombre < dbnombre.sql
o
$ mysql -h nombre_de_host -u nombre_de_usuario -pcontraseña base_de_datos < fichero_dump.sql

Número de procesos

Code:
$ ps -A | grep mysql | wc -l

Procesos en cursos

Code:
$ ps -aux | grep mysql
$ mysqladmin –i10 processlist extended-status

Checkear todas las tablas y optimizarlas

Code:
$mysqlcheck --optimize --all-databases

Monitorización

myTop es un monitor para MySQL de consultas en tiempo real.

Configuración y Optimización

Fichero de configuración: /etc/my.cnf o /etc/mysql/my.cnf

NOTA: No olvides hacer un backup de tu fichero original funcional.

NOTA: El fichero de MySQL permite no poner variables y dejarlas “por defecto”, en muchos casos, puede ser interesante no poner variables, si no son necesarias.

La potencia de MySQL es muy grande y la versatilidad en su configuración también los es. Actualmente, y dado el relativo “bajo coste” de la memoria RAM, se hace posible el uso de memoria caché que mejore el rendimiento de nuestro servidor.

En caso de que el cometido del host sea exclusivamente servidor MySQL, podemos permitirnos el lujo de cachear hasta un 70-80% del total de la memoria disponible.

Si por el contrario, el host o servidor, cumple tareas como servidor web, correo, y más… pues debemos considerar ofrecer menos recursos.

En la web de MySQL podemos obtener un listado de todas las variables de configuración del sistema:

system-variables
server-system-variables
dynamic-system-variables

También debemos considerar los timeouts como medida de seguridad, pues reducen el riesgo de colapso del sistema a causa de fallos en la programación de las aplicaciones utilizadas.

La fórmula mágica

Memoria MySQL = key_buffer_size + max_connections * (join_buffer + record_buffer + sort_buffer + thread_stack + tmp_table_size)

Información de Variables

Los parámetros de MySQL se pueden definir a nievel de servidor, gestionando las directivas de “/etc/mysql/my.cnf”, sin embargo, también es posible definir variables especificas por usuario, creando un fichero en “~/.my.cnf”

NOTA: Si va a realizar cambios en la configuración, y su sistema utiliza apparmor, deberá ajustar los valores en /etc/apparmor.d/usr.sbin.mysqld.

Definición de variables

key_buffer

Los bloques de índices para tablas MyISAM y ISAM se guardan en buffers y se comparten para todos los threads. key_buffer_size es el tamaño del buffer usado para los bloques de índices. El key buffer también se conoce como la key cache. El tamaño máximo permitido para key_buffer_size es 4GB.

Code:
key_buffer = 16M

max_allowed_packet

El tamaño máximo de un paquete o cualquier cadena de caracteres generada/intermedia.

Code:
max_allowed_packet = 16M

thread_stack

El tamaño de la pila para cada thread. Muchos de los límites detectados por el test crash-me dependen de este valor. El valor por defecto es lo suficientemente grande para un funcionamiento normal, y un seguro ante fallos de programación.

Si trabajamos con consultas excesivamente complejas, deberiamos subir el valor. Es utilizada en aplicaciones de Benchmarck MySQL

Code:
thread_stack = 128k

thread_cache_size

Esta variable puede incrementarse para mejorar el rendimiento si tiene muchas nuevas conexiones.

El número de threads que el servidor debe cachear para reusar. Cuando un cliente desconecta, los threads de clientes se ponen en la caché si hay menos de thread_cache_size threads. Peticiones de threads se sirven reusando threads tomados de la caché cuando es posible.

Code:
thread_cache_size = 8

max_connections

El número de conexiones de cliente simultáneas permitidas. Incrementar este valor incrementa el número de descriptores de fichero que requiere mysqld.

Si obtiene un error Too many connections, revise le documentación:
http://dev.mysql.com/doc/refman/5.0/…nnections.html

Code:
max_connections = 100

thread_concurrency

Esta función permite a las aplicaciones dar al sistema de threads una piesta sobre el número deseado de threads que deben ejecutarse simultáneamente.

Code:
thread_concurrency = 10

Configuración de caché

table_cache

El número de tablas abiertas por todos los threads. Incrementar este valor incrementa el número de descriptores de ficheros que requiere mysqld. Puede chequear si necesita incrementar la caché de la tabla chequeando la variable de estado Opened_tables

Code:
table_cache = 64

query_cache_limit

No cachea resultados mayores que este número de bytes. El valor por defecto es 1048576 (1MB). Es un valor para cada consulta. Valores muy altos pueden provocar inestabilidad en servicios muy concurridos.

Code:
query_cache_limit = 1M

query_cache_size

La cantidad de memoria reservada para cachear resultados de consultas. El valor por defecto es 0, lo que desactiva la cache de consultas. Tenga en cuenta que la cantidad de memoria se reserva incluso si query_cache_type tiene como valor 0.

Code:
query_cache_size = 16M

Backup MySQL

Tamaño máximo para el backup

Code:
[mysqldump]
max_allowed_packet = 16M

Reparar tablas

Definimos del buffer mientras que MySQL examina las bases de datos en busca de posibles fallos o tablas corrompidas.

Code:
[isamchk]
key_buffer = 16M

Cluster MySQL

Definimos la IP del nodo cluster. 127.0.0.1 define que no hay cluster, y que nuestro servidor, es el único.

Code:
[MYSQL_CLUSTER]
ndb-connectstring = 127.0.0.1

Certificados MySQL

Las siguientes rutas definen donde tenemos guardados los certificados SSL

Code:
ssl-ca = /etc/mysql/cacert.pem
ssl-cert = /etc/mysql/server-cert.pem
ssl-key = /etc/mysql/server-key.pem

Optimización de fichero de configuración my.cnf de MySQL

Además de todo he esto he encontrado un programa que se llama Mysqltuner el cual, basándose en los distintos logs de MySQL del servidor, te proporciona una serie de sugerencias a aplicar en tu fichero my.cnf para que la configuración del servidor sea óptima.
Para ello simplemente debemos descargar el fichero mysqltuner.pl del siguiente enlace: https://raw.github.com/major/MySQLTuner-perl/master/mysqltuner.pl y ejecutarlo.
wget https://raw.github.com/major/MySQLTuner-perl/master/mysqltuner.pl
chmod +x mysqltuner.pl
./mysqltuner.pl

mysqltuner