MariaDB y Cpanel: Could not increase number of max_open_files to more than

MariaDB y CPanel: Could not invrease number of limits to more than

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.

Síntomas

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.pl

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.

Instalar mysqltuner

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

Mysql: valores de arranque y ejecución

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.

Configuring the Open Files Limit (MariaDB) 

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_safeor 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

/scripts/restartsrv_mysql

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

Reload del demonio del sistema y de mysql

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

Algunos enlaces

Créditos

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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax