在Linux上,单个进程打开的文件句柄的个数是有限制的。如果达到限制就会报”toomanyopenfiles“。会在系统日志里面记录。
如果是MySQL进程,mysql会报错:[ERROR]Errorinaccept:Twomanyopenfiles,这时候就要排查是否是程序异常导致打开的文件句柄过多,如果是正常的业务增长就需要修改文件句柄的限制。
查看用户句柄限制:
ulimit-n
进程使用的文件句柄查看:
lsof-n
grep[pid]
也可以直接查看进程的limits文件
cat/proc/[pid]/limits
修改文件句柄
ulimit-n
这个修改只对当前的session生效,终端退出就恢复成原来的样子。因此可以将这个命令添加到profile文件里面,在启动终端的时候加载。
在CentOS系统上可以修改对应的limits.conf文件永久生效:
在/etc/security/limits.conf文件末尾添加下面内容。
*softcore*hardcore*hardnofile*softnofile*hardnproc*softnproc
*代表domain,就是全局的意思,可以改成具体的用户名来限制某个用户。soft/hard:这个当中的硬限制是实际的限制,而软限制,是warnning限制,只会做出warning。nofile代表maxnumberofopenedfile,:代表最大打开句柄数
mysql配置中一般是open_table_cache,max_connections,open_files_limit三个参数会影响到文件句柄。
open_table_cache是限制mysql开启table的cachefile数,一般mysql开一个table就会开启*.frm和*.ibd等文件,因此,这个至少要表数量的2倍以上。
max_connections:最高连接,连接也是会占用文件句柄的。
open_files_limit:限制打开文件句柄的个数,但是如果系统限制了,这个参数设置比系统限制更大也不会生效的。