FreeBSD: «Trop de fichiers ouverts» mais devrait pouvoir ouvrir 160 000 autres fichiers


11

J'ai un système FreeBSD 8 exécutant ZFS, avec un serveur MySQL 5.5 qui fait environ 355 Go et devrait atteindre quelques téraoctets.

MySQL déclenche des erreurs concernant "Trop de fichiers ouverts" sur /etc/hosts.allow. Nous n'utilisons pas expressément /etc/hosts.allow, mais il est utilisé par hosts_access (3) ( libwrap.a), qui est utilisé par beaucoup de choses.

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

Mais quand je vérifie, il semble ne pas atteindre de limites réelles. Le nombre de fichiers ouverts signalés par kern.openfiles staysmoins de 40 000 sur une période prolongée, et notre limite est considérablement plus élevée:

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

# ulimit -n
184320

Les fichiers ouverts doivent être définis sur un nombre illimité:

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

MySQL dit qu'il devrait pouvoir ouvrir les descripteurs de fichiers 184320:

# mysqladmin variables | grep open_files_limit
| open_files_limit                              |     184320                |

Et quelques informations du point de vue de l'utilisateur MySQL. J'ai arrêté mysql et piraté /usr/local/etc/rc.d/mysql-serverpour imprimer ces variables, donc cela devrait représenter l'environnement MySQL. Notez que le nombre 184320 est cohérent avec ce qui précède.

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

Et, pour une référence facile, voici les descriptions des sysctls:

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

en relation


4
ulimit n'est pas global, êtes-vous sûr que c'est la même ulimit avec laquelle MySQL fonctionne?
derobert

1
Alors, puis-je voir quelle est la valeur ulimit pour le démon MySQL, et puis-je changer la valeur ulimit pour le démon sans arrêter le démon? Je sais que je peux définir ulimitdans le script de démarrage ou l'environnement shell, mais cela nécessiterait que j'interrompe la base de données.
Stefan Lasiewski

1
Regardez dans / proc, sous le sous-répertoire avec le PID de votre service mysql. Vous pouvez cat limitsvoir avec quoi mysql fonctionne. Vous pouvez également les changer à la volée (avec les noyaux plus récents): echo -n "Max open files=soft_value:hard_value" > /proc/$PID/limits(en tant que root bien sûr)
lornix

1
@lornix: c'est FreeBSD. Je n'ai jamais utilisé BSD moi-même, mais je ne sais pas si FreeBSD prend réellement en charge / proc / * / limits.
Martin von Wittich

1
/procn'est pas monté par défaut sur FreeBSD, mais faites-le vous-même avec sudo mount -t procfs proc /proc, voir procfs(5)pour plus d'informations. Une fois que vous avez /procmonté, regardez le /proc/$PID/rlimitfichier
zygis

Réponses:


1

Vérifiez /etc/login.conf et déterminez à quelle classe de connexion votre utilisateur mysql a été affecté. C'est probablement par défaut ou démon. Si vous souhaitez modifier les limites de votre utilisateur, créez une nouvelle classe, affectez votre utilisateur à cette classe, modifiez les limites de cette classe comme vous le souhaitez, puis exécutez "cap_mkdb /etc/login.conf"

Si vous ne l'avez pas encore lu, faites: http://www.freebsd.org/doc/handbook/users-limiting.htm

Les processus démarrés au démarrage du système par / etc / rc sont affectés à la classe de connexion du démon .


0

Sur certains systèmes d'exploitation, les limites sont définies pour éviter les problèmes de sécurité aux utilisateurs réguliers, vous devriez envisager de lire whant dans le man limits.conf
fichier Ce fichier définit les limites par processus comme le nombre maximal de threads ou le nombre maximal de fichiers ouverts. Le visage d'utilisation de limitation pourrait provenir de là. /etc/security/limits.conf

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.