Cada vez me gusta menos usar paneles de hosting, porque todos son cada vez más intrusivos. La combinación MariaDB y Cpanel no iba a estar exenta. Revisando con mysqltuner un servidor tras una serie de alertas con Zabbix encontré un problema en los logs de mysql mariadb
[Warning] Could not increase number of max_open_files to more than 100000 (request: 180318)
No me lo podía creer, pues había solventado el problema meses atrás, y volvía a la carga. Tenía que entenderlo y solucionarlo.
Contenidos
Para mi el síntoma más claro es que me lleguen alertas Web que tengo diseñadas en mi sistema de monitorización Zabbix, que controlan determinadas webs de cada servidor. Estas webs, usan php+mysql, y por tanto puedo monitorizar entradas o páginas que deben devolverme un estado concreto, de tal forma, que no me limito a escuchar el puerto 443 sino que monitorizo todo el conjunto:
php-fpm + mysql
Es entonces cuando veo de forma inmediata que el problema está en uno de los dos elementos, ya que una cosa es el alcance de una situación de bloqueo al día, y otra que se produzcan muchas. Tengo enseñado a Zabbix a que me envie un email con la alerta y sus datos y a que reinicie el servicio que produce el cuelgue.
Mysqltuner es un fichero escrito en Perl, con solera y estilo, que tiene ya muchos años entre nosotros y que nos ayuda a hacer un rápido análisis. Sin embargo es muy aconsejable, leer la documentación sobre las variables que nos solicita modificar en el fichero de configuración de mysql, y sobre todo, no fiarse de los gurú bloggers de copiar y pegar.
Otra cosa que hay que entender, es que los diferentes forks y el propio MySQL se comportan de manera diferentes y cada vez son menos compatibles entre si, y con marcadas diferencias. Si administras sitios con MySQL, MariaDB, Percona lo entenderás.
Es muy sencillo. Como root nos situamos en, por ejemplo, /usr/local/bin/, lo descargamos, autorizamos y ejecutamos
cd /usr/local/bin wget -O mysqltuner.pl mysqltuner.pl chmod 755 mysqltuner.pl ./mysqltuner.pl
Nos concentraremos en el problema de hoy
Beware that open_files_limit (30190) variable should be greater than table_open_cache (15000) Consider installing Sys schema from https://github.com/mysql/mysql-sys
Como norma general encontraremos la solución más antigua que era modificar nuestros valores de arranque en el fichero my.cnf (CPanel tiene como distribución CentOS que varia del modelo Debian/Ubuntu)
cat /etc/my.cnf| grep files open_files_limit=100000
Oops.. eso no se corresponde con el error.
Bueno, aquí entran en juego los cambios que se han ido produciendo a lo largo de los años respecto del formato y modelo de configuración del systemd.
El manual de MariaDB en su apartado para Systemd nos dice:
When using systemd
, rather than setting the open files limit by setting the open-files-limit
option for mysqld_safe
or the open_files_limit
system variable, the limit can be changed by configuring the LimitNOFILE
option for the MariaDB systemd
service. For example, you can reconfigure the MariaDB systemd
service to have an infinite limit on open files by executing the following commands:
sudo tee /etc/systemd/system/mariadb.service.d/limitnofile.conf <<EOF [Service] LimitNOFILE=infinity EOF sudo systemctl daemon-reload
Bien realizado este cambio necesitamos hacer un restart de mysql que recomendamos hacer con el script de cPanel porque nos mostrará un extracto del log en el momento del arranque por si hubiera algún warning
ago 22 19:06:02 myhostname.tld mysqld[1009]: 2019-08-22 19:06:02 0 [Warning] Could not increase number of max_open_files to more than 65536
¿qué paso pues que no funciono si seguimos el procedimiento?
Me puse a buscar en los foros de cpanel y tras ver varias respuestas me quedo claro. Algo andaba mal y cPanel solapaba el funcionamiento aconsejado por MariaDB.
find /etc/systemd/ -type f -exec grep -il 65536 {} \; /etc/systemd/system/mysqld.service.d/mysql.service /etc/systemd/system/mariadb.service.d/migrated-from-my.cnf-settings.conf
Bien la mejor solución era editar /etc/systemd/system/mariadb.service.d/migrated-from-my.cnf-settings.conf y dejar vacio /etc/systemd/system/mysqld.service.d/mysql.service
# converted using /usr/bin/mariadb-service-convert# [Service] LimitNOFILE=250000
systemctl daemon-reload /scripts/restartsrv_mysql Waiting for “mysql” to restart ……waiting for “mysql” to initialize ………finished. Service Status mariadb (/usr/sbin/mysqld) is running as mysql with PID 22723 (systemd+/proc check method). Startup Log ago 22 19:40:25 host.mydomain.tld systemd[1]: Starting MariaDB 10.1.41 database server... ago 22 19:40:29 host.mydomain.tld mysqld[22723]: 2019-08-22 19:40:29 140207667955968 [Note] /usr/sbin/mysqld (mysqld 10.1.41-MariaDB) starting as process 22723 ... ago 22 19:40:31 host.mydomain.tld systemd[1]: Started MariaDB 10.1.41 database server. mysql restarted successfully.
Ahora ya no tenemos el WARNING que nos avisaba de la limitación del sistema frente a la de nuestro my.cnf y de paso hemos aprendido algunos detalles sobre la integración de MariaDB y cPanel
Una vez más gracias Canva por su estudio online que me permitió editar facilmente la imagen de Lucas Benjamin que obtuve también de Unsplash
Comparte este articulo en
¡Hola a todos! Vamos a sumergirnos en el fascinante mundo de Mod Security y aprender…
Ya son muchos años en el sector, muchos años pasando por varios paneles de control,…
La lista UCEPROTECT es una herramienta utilizada por muchos administradores de sistemas y proveedores de…
No es la primera vez que me encuentro con el agotamiento de la memoria en…
Descubre cómo solucionar problemas de acceso a servidores con Centos 7, Almalinux 8, Ubuntu 20.04…
Uno de los mensajes más alarmantes que puedes encontrarte es aquel que indica que tu…