FreeBSD: «Слишком много открытых файлов», но должна быть возможность открыть еще 160 000 файлов

11

У меня есть система FreeBSD 8, работающая на ZFS, с сервером MySQL 5.5, который имеет размер около 355 ГБ и по прогнозам вырастет до пары терабайт.

MySQL вызывает ошибки о "слишком много открытых файлов" /etc/hosts.allow. Мы явно не используем /etc/hosts.allow, но он используется hosts_access (3) ( libwrap.a), который используется многими вещами.

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

Но когда я проверяю, кажется, что он не соответствует никаким действительным ограничениям. Количество открытых файлов, о которых сообщалось kern.openfiles staysменее 40 000 за длительный период, и наш лимит значительно выше:

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

# ulimit -n
184320

Для Openfiles должно быть установлено неограниченное количество:

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

MySQL говорит, что он должен иметь возможность открывать дескрипторы файла 184320:

# mysqladmin variables | grep open_files_limit
| open_files_limit                              |     184320                |

И немного информации с точки зрения пользователя MySQL. Я остановил mysql и взломал, /usr/local/etc/rc.d/mysql-serverчтобы распечатать эти переменные, так что это должно представлять среду MySQL. Обратите внимание, что число 184320 соответствует вышеизложенному.

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

И, для удобства, вот описания для sysctls:

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

связанные с

Стефан Ласевский
источник
4
ulimit не является глобальным, вы уверены, что это тот же самый ulimit, с которым работает MySQL?
Дероберт
1
Итак, могу ли я узнать значение ulimit для демона MySQL и могу ли я изменить значение ulimit для демона, не останавливая его? Я знаю, что могу установить ulimitв сценарии запуска или в среде оболочки, но для этого потребуется прервать работу базы данных.
Стефан Ласевский
1
Посмотрите в / proc, в поддиректории с PID вашего сервиса mysql. Вы можете cat limitsувидеть, с чем работает mysql. Вы также можете изменить их на лету (с более новыми ядрами): echo -n "Max open files=soft_value:hard_value" > /proc/$PID/limits(конечно, с
правами
1
@lornix: это FreeBSD. Я никогда не использовал BSD, но не уверен, поддерживает ли FreeBSD ограничения / proc / * /.
Мартин фон Виттих,
1
/procпо умолчанию не монтируется во FreeBSD, но сделайте это самостоятельно sudo mount -t procfs proc /proc, procfs(5)подробнее. Как только вы /procсмонтировали, посмотрите на /proc/$PID/rlimitфайл
zygis

Ответы:

1

Проверьте /etc/login.conf и выясните, к какому классу входа назначен ваш пользователь mysql. Это, вероятно, по умолчанию или демон. Если вы хотите изменить ограничения для своего пользователя, создайте новый класс, назначьте своего пользователя этому классу, измените ограничения для этого класса, как вам нравится, а затем запустите "cap_mkdb /etc/login.conf"

Если вы еще не читали это, сделайте: http://www.freebsd.org/doc/handbook/users-limiting.htm

Процессы, запускаемые при запуске системы с помощью / etc / rc, присваиваются классу входа в систему демона .

Майк Дин
источник
0

В некоторых ОС ограничения установлены, чтобы избежать проблем с безопасностью для обычного пользователя, вы должны рассмотреть возможность чтения в man limits.conf
этом файле. В этом файле определяются ограничения для каждого процесса, такие как максимальное количество потоков или максимальное количество открытых файлов. Лицо ограничения использования может прийти оттуда. /etc/security/limits.conf

Kiwy
источник