FreeBSD: “Demasiados archivos abiertos” pero debería poder abrir otros 160,000 archivos


11

Tengo un sistema FreeBSD 8 que ejecuta ZFS, con un servidor MySQL 5.5 que tiene aproximadamente 355 GB y se proyecta que crezca a un par de Terabytes.

MySQL está activando errores sobre "Demasiados archivos abiertos" en /etc/hosts.allow. No lo utilizamos expresamente /etc/hosts.allow, pero lo utiliza hosts_access (3) ( libwrap.a), que es utilizado por muchas cosas.

mysqld[1234]: warning: /etc/hosts.allow, line 15: cannot open /etc/hosts.allow: Too many open files

Pero cuando verifico parece que no estoy alcanzando ningún límite real. El número de archivos abiertos reportados por kern.openfiles staysdebajo de 40,000 durante un período sostenido, y nuestro límite es sustancialmente mayor:

# sysctl -a |grep files
kern.maxfiles: 204800
kern.maxfilesperproc: 184320
kern.openfiles: 38191

# ulimit -n
184320

Los archivos abiertos deben establecerse en ilimitado:

# grep openfiles /etc/login.conf
    :openfiles=unlimited:\

MySQL dice que debería poder abrir los identificadores de archivos 184320:

# mysqladmin variables | grep open_files_limit
| open_files_limit                              |     184320                |

Y cierta información desde la perspectiva del usuario de MySQL. Detuve mysql y pirateé /usr/local/etc/rc.d/mysql-serverpara imprimir estas variables, por lo que esto debería representar el entorno MySQL. Tenga en cuenta que el número 184320 es consistente con lo anterior.

# /usr/local/etc/rc.d/mysql-server.stefantest start
Starting mysql.
cpu time               (seconds, -t)  unlimited
file size           (512-blocks, -f)  unlimited
data seg size           (kbytes, -d)  33554432
stack size              (kbytes, -s)  524288
core file size      (512-blocks, -c)  unlimited
max memory size         (kbytes, -m)  unlimited
locked memory           (kbytes, -l)  unlimited
max user processes              (-u)  5547
open files                      (-n)  184320
virtual mem size        (kbytes, -v)  unlimited
swap limit              (kbytes, -w)  unlimited
sbsize                   (bytes, -b)  unlimited
pseudo-terminals                (-p)  unlimited

Y, para una fácil referencia, aquí están las descripciones de los sysctls:

kern.maxfiles: Maximum number of files
kern.openfiles: System-wide number of open files
kern.maxfilesperproc: Maximum files allowed open per process

Relacionado


44
ulimit no es global, ¿estás seguro de que es el mismo ulimit con el que se ejecuta MySQL?
derobert

1
Entonces, ¿puedo ver cuál es el valor de ulimit para el demonio MySQL, y puedo cambiar el valor de ulimit para el demonio sin detenerlo? Sé que puedo configurar ulimitel script de inicio o el entorno de shell, pero eso requeriría que interrumpa la base de datos.
Stefan Lasiewski

1
Busque en / proc, debajo del subdirectorio con el PID de su servicio mysql. Puede cat limitsver con qué se ejecuta mysql. También puede cambiarlos sobre la marcha (con núcleos más nuevos): echo -n "Max open files=soft_value:hard_value" > /proc/$PID/limits(como raíz, por supuesto)
lornix

1
@lornix: esto es FreeBSD. Nunca he usado BSD, pero no estoy seguro de si FreeBSD realmente admite / proc / * / limits.
Martin von Wittich

1
/procno está montado de forma predeterminada en FreeBSD, pero hágalo usted mismo sudo mount -t procfs proc /proc, consulte procfs(5)para obtener más información. Una vez que haya /procmontado, mire el /proc/$PID/rlimitarchivo
zygis

Respuestas:


1

Verifique /etc/login.conf y descubra a qué clase de inicio de sesión asignó su usuario de mysql. Probablemente sea default o daemon. Si desea modificar los límites para su usuario, cree una nueva clase, asigne su usuario a esa clase, cambie los límites para esa clase como desee y luego ejecute "cap_mkdb /etc/login.conf"

Si aún no lo ha leído, hágalo: http://www.freebsd.org/doc/handbook/users-limiting.htm

Los procesos iniciados en el inicio del sistema por / etc / rc se asignan a la clase de inicio de sesión de daemon .


0

En algunos sistemas operativos, los límites se establecen para evitar problemas de seguridad para el usuario normal, debe considerar leer lo que se indica en man limits.conf
Este archivo define los límites por proceso, como el número máximo de subprocesos o el número máximo de archivos abiertos. La limitación de uso de la cara podría provenir de allí. /etc/security/limits.conf

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.