一、为什么要进行配置
1、即使采用了最先进的模型,如果不进行合理的配置,也没有办法支撑百万级的网络连接并发。
2、Linux操作系统中文件句柄数的限制。顺便说下,在生产环境中,大家都使用Linux系统,所以,后续文字中假想的生产操作系统,都是Linux系统。另外,由于大多数同学使用Windows进行学习和工作,因此,后续文字中假想的开发所用的操作系统都是Windows系统。
3、在生产环境Linux系统中,基本上都需要解除文件句柄数的限制。原因是,Linux的系统默认值为1024,也就是说,一个进程最多可以接受1024个socket连接。这是远远不够的。
二、文件句柄
1、文件句柄,也叫文件描述符。在Linux系统中,文件可分为:普通文件、目录文件、链接文件和设备文件。
- 文件描述符(File Descriptor)是内核为了高效管理已被打开的文件所创建的索引,它是一个非负整数(通常是小整数),用于指代被打开的文件。
- 所有的IO系统调用,包括socket的读写调用,都是通过文件描述符完成的。
2、ulimit命令:是用来显示和修改当前用户进程一些基础限制的命令,-n命令选项用于引用或设置当前的文件句柄数量的限制值。Linux的系统默认值为1024。
ulimit只能作为临时修改,系统重启后,句柄数量又会恢复为默认值。
3、一个高并发的应用,面临的并发连接数往往是十万级、百万级、千万级、甚至像腾讯QQ一样的上亿级。
文件句柄数不够,会导致什么后果呢?当单个进程打开的文件句柄数量,超过了系统配置的上限值时,就会发出“Socket/File:Can’t open so many files”的错误提示。
查看单个进程能够打开的最大文件句柄数量
# ulimit -n
设置文件句柄数 n的设置值越大,打开的文件句柄数量就越大。以root用户来执行此命令。
# ulimit -n number(大小)
# ulimit -n 10000
4、永久地把设置值保存下来,编辑/etc/rc.local开机启动文件,在文件中添加:
ulimit -SHn 10000
- 增加-S和-H两个命令选项。
-S表示软性极限值,-H表示硬性极限值。
- 硬性极限是实际的限制,就是最大可以是100万,不能再多了。软性极限是系统警告(Warning)的极限值,超过这个极限值,内核会发出警告。
5、终极解除Linux系统的最大文件打开数量的限制,编辑Linux的极限配置文件/etc/security/limits.conf来解决,修改此文件:
soft nofile 100000
hard nofile 100000
soft nofile表示软性极限,hard nofile表示硬性极限。
在使用和安装目前非常火的分布式搜索引擎——ElasticSearch,就必须去修改这个文件,增加最大的文件句柄数的极限值。
在服务器运行Netty时,也需要去解除文件句柄数量的限制,修改/etc/security/limits.conf文件即可。