FreeBSD:“打开的文件太多”但应该能够再打开 160,000 个文件

Ste*_*ski 11 freebsd mysql

我有一个运行 ZFS 的 FreeBSD 8 系统,带有一个大约 355GB 的 MySQL 5.5 服务器,预计会增长到几个 TB。

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
Run Code Online (Sandbox Code Playgroud)

但是当我检查时似乎没有达到任何实际限制。kern.openfiles stays持续一段时间内报告的打开文件数低于 40,000,我们的限制要高得多:

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

# ulimit -n
184320
Run Code Online (Sandbox Code Playgroud)

Openfiles 应设置为无限制:

# grep openfiles /etc/login.conf
    :openfiles=unlimited:\
Run Code Online (Sandbox Code Playgroud)

MySQL 说它应该能够打开 184320 个文件句柄:

# mysqladmin variables | grep open_files_limit
| open_files_limit                              |     184320                |
Run Code Online (Sandbox Code Playgroud)

以及一些来自 MySQL 用户的信息。我停止 mysql 并 hack/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
Run Code Online (Sandbox Code Playgroud)

而且,为了便于参考,这里是 sysctls 的描述:

kern.maxfiles: Maximum number of files
kern.openfiles: System-wide number of open files
kern.maxfilesperproc: Maximum files allowed open per process
Run Code Online (Sandbox Code Playgroud)

有关的

Mik*_*ehn 1

检查 /etc/login.conf 并找出您的 mysql 用户分配给哪个登录类。它可能是默认的或守护进程。如果您想更改用户的限制,请创建一个新类,将您的用户分配给该类,根据需要更改该类的限制,然后运行“cap_mkdb /etc/login.conf”

如果您还没有阅读本文,请阅读:http ://www.freebsd.org/doc/handbook/users-limiting.htm

系统启动时由 /etc/rc 启动的进程被分配给守护程序登录类。