Tengo un servidor con Linux CentOs, es un servidor dedicado y que me lo dieron con la configuración por defecto.
Lo que venia notando es que al cambiar la web de un servidor a otro, la web iba muy muy lenta.
Me preguntaba porque si he escrito toda la web desde 0 con Cakephp Framework, los modelos y las vistas están cacheados y se ha cambiado a un nuevo servidor mucho mas potente
- Pentium E2200 Dual Core 2,2 GHz (2 cores, 1 MB caché, 800 FSB)
- 2 GB SDRAM DDR2
- 2 x 250 GB SATA (7.200rpm)
- 2.000 GB de transferencia al mes
- SAS 6iR internal RAID controler
- 100MB de ancho de banda
porque me iba tan mal la web?
El tema es la configuracion por defecto de los servidores no es la optima para albergar una web, un servidor puede estar configurado para ser un servidor web, un servidor de correo, un servidor de juegos o simplemente se puede usar esa máquina como un ordenador normal.
Para ello hay que configurar varios aspectos, inicialmente: El apache, y el MySQL.
Lo primero que hice es optimizar el MySQL, y con esto el rendimiento del servidor mejoró notablemente.
Conectados como root en la máquina (los paths aqui indicados son los míos, verificar los vuestros.)
Lo primero un backup
[code]
cp /etc/my.cnf /etc/my.cnf.backup
[/code]
abrimos el archivo con vuestro editor favorito.
[code]
vi /etc/my.cnf
[/code]
por defecto en mi my.cnf sólo venia lo siguiente:
[code]
[mysqld]
set-variable=local-infile=0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[/code]
He añadido una serie de parámetros nuevos
[code]
[mysqld]
set-variable=local-infile=0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
# nueva configuracion
# este parámetro es fundamental, hay que registrar las consultas lentas, todas las que duren mas de 2 segundos.
# asi se puede ver las consultas que se hacen y que tienen que ser optimizadas
log-slow-queries=/var/log/mysql-slow-queries.log
long_query_time = 2
log-queries-not-using-indexes
query_cache_limit=1M
query_cache_size=32M
query_cache_type=1
max_connections=500
interactive_timeout=100
# Reducido wait_timeout para prevenir que clientes inactivos retengan una conexion.
wait_timeout=30
connect_timeout=10
# establecido a 128 para que no use mas memoria
thread_cache_size=128
key_buffer=64M
join_buffer=1M
max_allowed_packet=16M
table_cache=512
record_buffer=1M
sort_buffer_size=2M
read_buffer_size=2M
max_connect_errors=10
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# nueva configuracion
open_files_limit=8192
# nueva configuracion
[mysql]
no-auto-rehash
#safe-updates
# nueva configuracion
[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
[/code]
- query_cache_size:
MySQL 4 proporciona una característica que puede resultar muy útil – una caché de consultas. En una situación en la base de datos tiene que ejecutar varias veces las mismas preguntas en el mismo conjunto de datos, devolviendo el mismo resultado cada vez, MySQL puede cachear resultados, evitando la sobrecarga de ejecución a través de los datos una y otra y es extremadamente útil en servidores con mucha carga. - key_buffer_size:
El valor de key_buffer_size es el tamaño del búfer utilizado con los índices. Cuanto mayor sea el buffer, más rápido terminará el comando SQL y el resultado será devuelto. Se supone que lo mejor es ajustar el key_buffer_size con al menos un cuarto de la memoria del servidor, pero no más de la mitad de la cantidad total. Idealmente, será lo suficientemente grande como para contener todos los índices (el tamaño total de todos los archivos. MYI en el servidor). - table_cache:
El valor predeterminado es 64. Cada vez que MySQL tiene acceso a una tabla, se coloca en la caché. Si el sistema accede a muchas tablas, es más rápido para tener estas en la caché. MySQL al ser multi-threaded, puede ejecutar muchas consultas sobre sobre una tabla a la vez, y cada uno de éstas abrirá una tabla. - sort_buffer:
El sort_buffer es muy útil para acelerar las operaciones de myisamchk (razón por la cual se fija mucho más alto para ese fin en los archivos de configuración por defecto), pero también puede ser útil cuando se realizan todos los días un gran número de ordenaciones o clasificaciones. - thread_cache:
Si se tiene un servidor con mucha carga que está recibiendo una gran cantidad de conexiones rápida, hay que configurar la thread_cache lo suficientemente alto para que el valor d threads_created en SHOW STATUS deja de aumentar. Esto debe tomar parte de la carga fuera de la CPU. - tmp_table_size:
(no incluido en el archivo de configuracion, pero este parámetro también se puede configurar).»Created_tmp_disk_tables» son el número de tablas temporales implícitos en el disco creado durante la ejecución declaraciones y «Created_tmp_tables» están basados en memoria. Obviamente, es malo si tiene que ir a la disco en lugar de la memoria todo el tiempo.
También lee este post, como crear el log slow queries
Éstos valores son los idóneos para mi servidor, aunque tampoco estoy muy seguro pues todavía estoy comprobando la respuesta que está dando mi máquina antes esta nueva configuración, y la estoy ajustando a las necesidades de la web.
Lo mejor es que vayáis ajustando poco a poco éstos parámetros. Si sabéis de algún parámetro que se me haya escapado comentármelo please
Excelente articulo.
Gracias, me ha ayudado mucho.
tengo consultas complejas sobre db grandes y la configuración ha optimizado las mismas visiblemente.
Buen dia, Pedro…. ya tengo funcionando el mysql server en Centos 5.6 y va bien…hice ajustes segun me sugeriste y esta caminando bien…. ahora bien, algunas variables no me las esta aceptando…. no se si es porque las tengo despues del [Mysql_safe] pero intenté colocar esa seccion de ultimo y no camina…. te ha pasado alguna vez????
Buenas,
no nunca me ha pasado. Prueba a ver si es un problema, con letras mayusculas, minusculas, espacios, etc.. cada archivo de configuracion ya sea apache, mysql, samba, etc.. tiene un formato determinado, ten cuidado que lo estés escribiendo bien. Échale un ojo a todas las directivas posibles de mysql para [mysql_safe] en la docu oficial de mysql http://dev.mysql.com/doc/refman/5.1/en/mysqld-safe.html
Me parece un excelente articulo, estaria genial que actualizaras estos post dando a saver si aun funcionan correctamente en este año, si algo ha cambiado, etc.
Tambien seria buena idea que nos dejaras un tutorial sobre optimización del kernel
No quieres un cafe con leche y un par de empanadas??
Muy buen tuto… he leido el que sigue tambien… despues de aplicazrtle los cambio le aplique el mysqltuner y no me detecta algunos cambios… es problema mio o del servidor??? por ejemplo la variable thread_cache tambien la cambie a 128, pero luego entre a la base de datos con phpmyadmin y la variable sigue en cero… el errado es el phpmyadmin o el my.cnf
Y gracias otra vez, genial blog
Te comento amigo, que nuestro servidor con Linux CentOS solo lee archivos PHP de un tamaño determinado, no todos…por ejemplo, no levanta archivos con tamaños:
1.5 a 3.5 Kb
3.6 a 4.8 Kb
4.9 a 6.8 Kb
6.9 a 7.1 Kb
7.2 a 8.6 Kb
8.7 a 30.0 Kb
31.1 a 100 Kb
Que crees que está sucediendo?
Hola Yuri,
Lo que me comentas es super raro. Que permisos tienen los archivos que no se leen? Quien es el propietario de esos archivos php?
Has mirado que la codificación este bien y no tengan ningún error? Que hay en el log de error de apache?
Investiga todo esto que te pregunto. Y me cuentas. .
Un saludo!
Tengo un servidor Centos con mysql , como sacas la formula para los valores que pones la configuración, pues actualmente tengo una enorme carga de informacion y ultimamente se me quedan hasta 400 conexiones al mysql en espera y el buffer los topo al 100%. De mysql no se nada , pues lo mio es administracion de redes pero me toco meterle mano al servidor para ver como se lo optimiza
felicidades por el post, pero cuando tengo un servidor de correo con mailscanner .. derrepente esta muy lento y los correos se demoran en salir , ademas se notaque esta leyendo el disco duro.
Todo excelente! pero me pregunto si esta esto vigente al día de la fecha 28/08/2014
quisiera saber cual es el comando que se utiliza para guardar los cambios al terminar de realizar la edición, gracias de antemano
Me sirvió, tengo un ssd y no sabía por que demoraba horas en importarse una simple db de 85 MB (Nunca terminaba)
Moví unos cuantos valores para que tuviera más megas en los buffer’s y cuando volví a realizar la importación no duró ni un segundo en finalizar jaja