摘要:Linux操作系统,无论是写客户端程序还是服务端程序,在处理高并发TCP连接时,最大的连接数concurrentconnectionsmustbelimited系统限制用户在单个进程中可以同时打开的文件数。【诉求场景】Linux操作系统,无论是编写客户端程序还是服务端程序,在处理高并发TCP连接时,最高并发连接数受制于系统对可打开文件数的限制同时用户的单个进程(因为系统是每个TCP连接都要创建一个socket句柄,而每个socket句柄也是一个文件句柄)。本文档主要是修改文件数的并发限制。【配置方法】1、修改用户进程可以打开的文件数限制,如图:说明:ulimit–n:查看当前系统允许当前打开的文件数限制用户进程打开。默认为1024:表示当前用户的每个进程最多允许同时打开1024个文件。1024个文件中,每个进程打开的标准输入、标准输出、标准错误、服务器监听socket等都要去掉,剩下的可以用于clientsocket连接的文件只有1024-10=1014左右.也就是说,基于Linux的程序最多同时允许1014个并发TCP连接。(1)修改linux系统为用户开启软硬限制,如图:在vim/etc/security/limits.conf中添加rootsoftnofile1921roothardnofile1921说明:root代表修改数量root用户打开的文件限制,可以用“*”代表所有用户soft和hard来指定要修改的是软限制还是硬限制。1921指定修改后的新限制值,即最大打开文件数(软限制必须小于或等于硬限制)(2)修改/etc/pam.d/login文件,如图如图:添加:sessionrequired/lib/security/pam_limits.so说明:linux在用户登录系统后要调用pam_limits.so模块来设置系统对用户可以使用的各种资源数量的最大限制(包括用户可以打开的最大文件数),pam_limits.so模块会从/etc/security/limits.conf文件中读取这些限制值(3)查看linux下最大打开文件数systemlevelcat/proc/sys/fs/file-max,如图显示:说明:这表示linux系统最多允许同时打开96854个文件(包括文件个数的总和)所有用户打开的文件),这是Linux系统级别的硬限制。值,如果要修改,命令是vim/etc/rc.local。(4)添加:echovalue>/proc/sys/fs/file-max,修改后重启系统,重启后执行ulimit–n查看,如图:(5)如果执行ulimit–n后重启查看该值还是小于上面修改的最大值。可能是用户登录脚本/etc/profile中使用了ulimit–n命令来限制用户同时打开的文件数。ulimit–n限制只能在/etc/profile中找到用户同时打开的最大文件数,可以删除或修改该值,重启系统即可。(6)以上操作可以解决系统对高并发TCP连接处理打开文件数的限制。有时,即使系统解除了用户同时打开文件数的限制,仍然会出现TCP并发连接数增加到一定数量后,无法建立新的TCP连接的现象了。2、linux网络内核对本地端口号的范围有限制。例如,当前的系统内核将本地端口号的范围限制为1024-32768。当系统中同时存在大量的TCP客户端连接时,每个TCP客户端必须占用一个唯一的本地端口号。如果TCP端口号范围不够,会提示:无法分配请求的地址。这是因为内核编译时设置的默认本地端口号范围太小。修改:/etc/sysctl.conf添加:net.ipv4.ip_local_port_range=102465535(最大值必须小于等于65535)执行:sysctl–p,如果没有报错,说明设置成功,显示的内容包括图中的内容:上图是设置单个进程可以同时打开63000多个TCP客户端连接。点击关注,第一时间了解华为云的新鲜技术~
