FreeBSD: “Muitos arquivos abertos”, mas deve ser capaz de abrir outros 160.000 arquivos

11

Eu tenho um sistema FreeBSD 8 executando o ZFS, com um servidor MySQL 5.5 de cerca de 355 GB e projetado para crescer em alguns Terabytes.

O MySQL está desencadeando erros sobre "Muitos arquivos abertos" ativados /etc/hosts.allow. Nós não usamos expressamente /etc/hosts.allow, mas é usado por hosts_access (3) ( libwrap.a), que é usado por muitas coisas.

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

Mas quando eu verifico que não estou atingindo nenhum limite real. O número de arquivos abertos relatados kern.openfiles staysabaixo de 40.000 durante um período prolongado e nosso limite é substancialmente mais alto:

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

# ulimit -n
184320

Os arquivos abertos devem ser definidos como ilimitados:

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

O MySQL diz que deve ser capaz de abrir identificadores de arquivo 184320:

# mysqladmin variables | grep open_files_limit
| open_files_limit                              |     184320                |

E algumas informações da perspectiva do usuário do MySQL. Parei o mysql e cortei /usr/local/etc/rc.d/mysql-serverpara imprimir essas variáveis, então isso deve representar o ambiente MySQL. Observe que o número 184320 é consistente com o acima.

# /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

E, para facilitar a referência, aqui estão as descrições dos sysctls:

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

Relacionado

Stefan Lasiewski
fonte
4
ulimit não é global, você tem certeza de que é o mesmo ulimit com o qual o MySQL está sendo executado?
derobert
1
Então, posso ver qual é o valor ulimit para o daemon MySQL e posso alterar o valor ulimit para o daemon sem parar o daemon? Sei que posso definir ulimito script de inicialização ou o ambiente do shell, mas isso exigiria a interrupção do banco de dados.
precisa saber é o seguinte
1
Procure em / proc, sob o subdir com o PID do seu serviço mysql. Você pode cat limitsver com o que o mysql está sendo executado. Você também pode alterá-los em tempo real (com kernels mais recentes): echo -n "Max open files=soft_value:hard_value" > /proc/$PID/limits(como root, é claro)
lornix
1
@lornix: este é o FreeBSD. Eu nunca usei o BSD, mas não tenho certeza se o FreeBSD realmente suporta / proc / * / limits.
Martin von Wittich
1
/procnão é montado por padrão no FreeBSD, mas faça você mesmo sudo mount -t procfs proc /proc, veja procfs(5)para mais informações. Depois de /procmontar, observe o /proc/$PID/rlimitarquivo
zygis

Respostas:

1

Verifique o arquivo /etc/login.conf e descubra a qual classe de login o seu usuário mysql foi atribuído. Provavelmente é padrão ou daemon. Se você deseja alterar os limites para seu usuário, crie uma nova classe, atribua seu usuário a essa classe, altere os limites para essa classe como desejar e execute "cap_mkdb /etc/login.conf"

Se você ainda não leu isso, faça: http://www.freebsd.org/doc/handbook/users-limiting.htm

Os processos iniciados na inicialização do sistema por / etc / rc são atribuídos à classe de login do daemon .

Mike Diehn
fonte
0

Em alguns sistemas operacionais, os limites são definidos para evitar problemas de segurança para usuários comuns; considere ler whant no man limits.conf
arquivo Este arquivo define os limites por processo, como o número máximo de threads ou o número máximo de arquivos abertos. A limitação do uso do rosto pode vir daí. /etc/security/limits.conf

Kiwy
fonte