在生产环境Linux系统中,基本上都需要解除文件句柄数的限制。原因是,Linux的系统默认值为1024,也就是说,一个进程最多可以接受1024个socket连接。这是远远不够的。
文件句柄,也叫文件描述符。在Linux系统中,文件可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(File Descriptor)是内核为了搞笑管理已呗打开的文件所创建的索引,它是一个非负整数(通常是小整数),用于指代被打开的文件。所有的IO系统调用,包括socket的读写调用,都是通过文件描述符完成的。
在Linux下,通过调用ulimit命令,可以看到单个进程能够打开的最大文件句柄数量,这个命令的具体使用方法是:
[root@self ~]# ulimit -n
1024
什么是ulimit命令呢?它是用来显示和修改当前用户进程一些基础限制的命令,-n命令选项用于引用或设置当前的文件句柄数量的限制值。Linux的系统默认值为1024。
默认的数值1024,对于绝大多数应用来说已经足够了,但是对于一些用户基数很大的高并发应用,则是远远不够的。一个高并发的应用,面临的并发连接数往往是十万级、百万级、千万级、甚至像腾讯QQ一样的上亿级。
文件句柄数不够,会导致出现"Socket/File:Can’t open so many files"的错误提示。
对于高并发、高负载的应用,就必须调整这个系统参数,以适应处理并发大量连接的应用场景。可以通过ulimit来设置这个参数。
[root@self ~]# ulimit -n 10000
[root@self ~]# ulimit -n
10000
在上面的命令中,n的设置值越大,可以打开的文件句柄数量就越大,建议以root用户来执行此命令
然后,使用ulimit命令来修改当前用户进程的一些基础限制,仅在当前用户环境有效,直白地说,就是当前的终端工具连接当前shell期间,修改是有效的,一段断开连接,用户退出后,它的数值又便会系统默认的1024了。也就是说,ulimit只能作为临时修改,系统重启后,句柄数量又会恢复默认值。
如果想永久保存设置,可以修改/etc/rc.local开机启动文件,添加如下内容:
[root@self etc]# vi /etc/rc.local
ulimit -SHn 10000
增加-S和-H两个命令选项。选项-S表示软性极限值,-H表示硬性极限值。硬性极限值是实际的限制,就是最大可以是1万,不能再多了。软性极限是系统警告的极限值,超过这个极限值,内核会发出警告。
[root@self etc]# vi /etc/rc.local
[root@self etc]#
[root@self etc]#
[root@self etc]# ulimit -n
1024
[root@self etc]# source /etc/rc.local
[root@self etc]# ulimit -n
10000
[root@self etc]#
但是再打开一个会话,仍然没有起效
[root@self ~]# ulimit -n
1024
[root@self ~]# source /etc/rc.local
[root@self ~]# ulimit -n
10000
普通用户通过ulimit命令,可将软极限更改成硬极限的最大设置值,如果要更改硬极限,必须拥有root用户权限。
终极解除Linux系统的最大文件打开数量的限制,可以通过编辑Linux的极限配置文件/etc/security/limits.conf来解决,修改此文件,加入如下内容:
[root@self ~]# vi /etc/security/limits.conf
soft nofile 20000
hard nofile 20000
soft nofile表示软性极限,hard nofile表示硬性极限
在使用和安装目前非常火的分布式搜索引擎-ElasticSearch,就必须去修改这个文件,增加最大的文件句柄数的极限值