Linux下TCP最大连接数受到Kernel及Ulimit的限制。
一、 文件数限制修改
1、用户级别
查看Linux系统用户最大打开文件限制:
# ulimit -n
1024
(1) vi /etc/security/limits.conf
apache soft nofile 10240
apache hard nofile 10240
其中apache指定了要修改哪个用户的打开文件数限制。
可用'*'号表示修改所有用户的限制;soft或hard指定要修改软限制还是硬限制;10240则指定了想要修改的新的限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。
(2) vi /etc/pam.d/login
session required /lib/security/pam_limits.so
这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制)。
而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。
2、Linux系统级别
查看Linux系统对同时打开文件数的硬限制:
# sysctl -a|grep file-max
fs.file-max = 50542
这表明这台Linux系统最多允许同时打开(即包含所有用户打开文件数总和)50542个文件,是Linux系统级硬限制,所有用户级的打开文件数限制都不会超过这个数值。
通常这个系统级硬限制是Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制。
(1) vi /etc/sysctl.conf
fs.file-max = 505420
立即生效:
# sysctl -p
二、 网络端口限制修改
查看Linux系统最大追踪TCP连接数量:
# sysctl -a | grep ipv4.ip_conntrack_max
net.ipv4.ip_conntrack_max = 16376
这表明系统将对最大跟踪的TCP连接数限制默认为16376。
查看Linux系统端口范围:
# sysctl -a | grep ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 61000
注意:
每个TCP客户端连接都要占用一个唯一的本地端口号(此端口号在系统的本地端口号范围限制中),如果现有的TCP客户端连接已将所有的本地端口号占满。将不能创建新的TCP连接。
(1) vi /etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.ip_conntrack_max = 20480
如果按上述端口范围进行设置,则理论上单独一个进程最多可以同时建立60000多个TCP客户端连接。
如果按上述参数进行设置,则理论上单独一个进程最多可以同时建立20000多个TCP客户端连接。
备注:
对apache用户可同时打开文件数设置为10240个;
将Linux系统可同时打开文件数设置为505420个(一定要大于对用户的同时打开文件数限制);
将Linux系统对最大追踪的TCP连接数限制为20480个(但是,建议设置为10240;因为对apache用户的同时打开文件数已经限制在10240个;且较小的值可以节省内存);
将linux系统端口范围配置为1024~65000(可以支持60000个以上连接,不建议修改;默认已经支持20000个以上连接);
综合上述四点,TCP连接数限制在10140个。
这10240个文件中还得除去每个进程必然打开的标准输入,标准输出,标准错误,服务器监听 socket,进程间通讯的unix域socket等文件。
因此,当需要对TCP连接数进行调整时只需要调整ulimit参数。
系统硬件同时打开文件数一般不会成为瓶颈(系统根据硬件性能自动计算)。
Red Hat Enterprise Linux 7 现已提供用户下载