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


11

我有一个运行ZFS的FreeBSD 8系统,其中一个MySQL 5.5服务器约为355GB,预计将增长到几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

但是当我检查时似乎没有达到任何实际极限。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不是全局的,您确定运行MySQL的ulimit是相同的吗?
derobert

1
因此,我可以看到MySQL守护程序的ulimit值是什么,并且可以在不停止守护程序的情况下更改该守护程序的ulimit值吗?我知道我可以ulimit在启动脚本或Shell环境中进行设置,但这将要求我中断数据库。
Stefan Lasiewski

1
在带有MySQL服务的PID的子目录下的/ proc中查找。您可以cat limits看到mysql正在运行。您也可以动态更改它们(使用更新的内核):(echo -n "Max open files=soft_value:hard_value" > /proc/$PID/limits当然是root)
lornix 2013年

1
@lornix:这是FreeBSD。我从来没有亲自使用过BSD,但是我不确定FreeBSD是否真正支持/ proc / * / limits。
Martin von Wittich

1
/proc没有在FreeBSD上默认安装,但是您可以自己使用进行安装sudo mount -t procfs proc /procprocfs(5)有关更多信息,请参见。一旦你已经/proc安装,看看/proc/$PID/rlimit文件
zygis

Answers:


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.