在生产环境Linux系统中,基本上都需要解除文件句柄数的限制。原因是Linux系统的默认值为1024,也就是说,一个进程最多可以接受1024个socket连接,这是远远不够的。
文件句柄也叫文件描述符。在Linux系统中,文件可分为普通文件、目录文件、链接文件和设备文件。
文件描述符(File Descriptor)是内核为了高效管理已被打开的文件所创建的索引,是一个非负整数(通常是小整数),用于指代被打开的文件。所有的IO系统调用(包括socket的读写调用)都是通过文件描述符完成的。
在Linux下,通过调用ulimit命令可以看到一个进程能够打开的最大文件句柄数量。这个命令的具体使用方法是:
ulimit -n
ulimit命令是用来显示和修改当前用户进程的基础限制命令,-n选项用于引用或设置当前的文件句柄数量的限制值,Linux系统的默认值为1024。
单个进程打开的文件句柄数量超过了系统配置的上限值时会发出“Socket/File:Can’t open so many files”的错误提示。
可以通过ulimit来设置这两个参数,方法如下:
ulimit -n 1000000
使用ulimit命令有一个缺陷,即该命令只能修改当前用户环境的一些基础限制,仅在当前用户环境有效。也就是说,在当前的终端工具连接当前shell期间,修改是有效的,一旦断开用户会话,或者说用户退出Linux,它的数值就又变回系统默认的1024了。并且,系统重启后,句柄数量会恢复为默认值。
ulimit命令只能用于临时修改,如果想永久地把最大文件描述符数量值保存下来,可以编辑/etc/rc.local开机启动文件,在文件中添加如下内容:
ulimit -SHn 1000000
选项-S表示软性极限值,-H表示硬性极限值。
硬性极限值是实际的限制,就是最大可以是100万,不能再多了。
软性极限值则是系统发出警告(Warning)的极限值,超过这个极限值,内核会发出警告。
普通用户通过ulimit命令可将软性极限值更改到硬性极限值的最大设置值。如果要更改硬性极限值,必须拥有root用户权限。
要彻底解除Linux系统的最大文件打开数量的限制,可以通过编辑Linux的极限配置文件/etc/security/limits.conf来做到。修改此文件,加入如下内容:
soft nofile 1000000
hard nofile 1000000
在使用和安装目前流行的分布式搜索引擎ElasticSearch时,必须修改这个文件,以增加最大的文件描述符的极限值。当然,在生产环境运行Netty时,也需要修改/etc/security/limits.conf文件来增加文件描述符数量的极限值。
Java高级架构面试知识点整理
我整理的《最全Java高级架构面试知识点整理》已升级为2.0版本,200个知识点,178页。点击这获取。同时欢迎来java架构交流群进行交流!!!