Too Many Open Files Mysql o MariaDB

Introducción

Mirando los logs de Mysql o MariaDB nos hemos percatado de que un cliente estaba teniendo problemas de apertura (Too Many Open Files) con tablas aleatorias de distintas bases de datos. No había un patrón claro pero tuvimos que pasar por varios pasos para detectar el problema.

Los logs los encontramos en: /var/log/mariadb/mariadb.log

En el artículo vamos a mirar los siguientes puntos:

  1. Revisión de los permisos del directorio «datadir» de mysql/mariadb
  2. Revisión de la variable open_file de mysql.
  3. Revisión de las limitaciones del sistema a la hora de abrir ficheros por un servicio.

Con esto hemos conseguido acotar el problema y solventar la incidencia que se nos había presentado.

Too Many Open Files Mysql

Revisando los permisos del datadir de Mysql/MariaDB

Por defecto tanto de Mysql como MariaDB** el directorio es el mismo. Por lo tanto nos vamos a situar en «/var/lib/mysql»

  • La carpeta «/var/lib/mysql» debe de tener los permisos 755 y ademas con usuario y grupo de mysql.
  • Los archivos de dentro deben ser todos propietarios por Mysql. Ante la duda chown mysql:mysql -R /var/lib/mysql/*

De todas formas podemos entrar dentro y ver si el propietario/grupo son correctos.

Como vimos que esto estaba correcto no hizo falta aplicar esto en el cliente.

**Nota: Recordamos que MariaDB es un FORK de la base de datos de MySQL con algunas mejoras y/o funcionalidades nuevas.

Revisando la variable open_file_limit de MySQL/MariaDB

Otro de los puntos de fallo suele ser esta variable que antes solía estar muy bajo. Ahora con la versión que encontramos (5.5.44-MariaDB) viene por defecto con un valor de 100000.

Antes venía con un valor de 1024, lo cual era un valor muy bajo.

Pues bien para ver esta variable tenemos que acceder a la consola de mysql y ejecutar lo siguiente:

show variables like 'open%';

Nos aparecerá algo similar a esto:

| open_files_limit | 100000 |

Este valor esta bastante bien y por el momento no lo hemos tocado.

Limitación del sistema para la apertura de ficheros

Otra de las limitaciones que podemos encontrar es a nivel del sistema operativo, es decir que está controlado por cuantos ficheros puede abrir un usuario. Por defecto esta valor suele ser bajo y nosotros lo hemos modificado con los siguientes valores:

echo "mysql soft nofile 65536" >> /etc/security/limits.conf
echo "mysql hard nofile 102400" >> /etc/security/limits.conf

Como veis hemos añadido un limite soft y un limite hard. El soft es como si fuera un aviso y no limita y el hard es que de ese número no puede pasar.

Una vez realizado esto he reiniciado el servicio mysql/mariadb (aunque no hace falta) y ya tenemos nuestro sistema preparado.

En nuestro caso con este último es como solventamos los problemas de las tablas abiertas.

Modificando el script de Arranque

Cuando ninguna de las soluciones anteriores se ajusta para que el valor de la variable de mysql aumente… Parece ser que podemos usar otro método y es editando el propio script de arranque.

Tenemos que hacer previamente el punto anterior, es decir:

echo "mysql soft nofile 65536" >> /etc/security/limits.conf
echo "mysql hard nofile 102400" >> /etc/security/limits.conf

Y después de ello editamos el script de arranque añadiendo estas dos variables:

/usr/lib/systemd/system/mysqld.service o /usr/lib/systemd/system/mariadb.service

LimitNOFILE=infinity
LimitMEMLOCK=infinity

Una vez realizado recargamos el servicio de mariadb

systemctl reload mariadb.service

Con esto debemos comprobar de nuevo la variable para ver si el valor ha sido reajustado.

Conclusión

Como habéis podido ver hemos mirado 3 puntos donde puede estar afectando el problema de «Too Many Open Files» y hemos ido acotando el problema paso por paso.

Las tablas ya no da problemas y el Mysql/MariaDB permanece estable.

Deja una respuesta

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