问题:一台服务器到底可以支持多少TCP并发链接呢?
1. 文件描述符限制:
对于服务器来讲,每个TCP链接都要占用一个文件描述符,一旦文件描述符使用完,新的链接到来返回给咱们的错误是"Socket/File:Can't open so many files" node
这时,你须要明白操做系统能够打开最大文件数的限制。
进程限制(用户限制):linux
ulimit -n # 最大文件数,通常默认为1024个 ulimit -u # 最大进程数,通常为默认60000+
执行 ulimit -n 输出1024,说明对于一个进程而言最多只能打开1024个文件,因此你要采用此默认配置最多也就能够并发上千个TCP链接。
临时修改:ulimit -n 1000000,可是这种临时修改只对当前登陆的用户目前使用的环境有效,系统重启或用户退出会就失效。
永久生效:修改/etc/security/limits.conf 文件:shell
# 修改文件数 * soft nofile 1000000 * hard nofile 1000000 # 修改进程数 * soft noproc 60000 * hard noproc 60000
session required /lib/security/pam_limits.sobash
若是是64bit系统的话,应该为 :
session required /lib64/security/pam_limits.so服务器
net.ipv4.ip_local_port_range = 1024 65535 net.core.rmem_max=16777216 net.core.wmem_max=16777216 net.ipv4.tcp_rmem=4096 87380 16777216 net.ipv4.tcp_wmem=4096 65536 16777216 net.ipv4.tcp_fin_timeout = 10 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_window_scaling = 0 net.ipv4.tcp_sack = 0 net.core.netdev_max_backlog = 30000 net.ipv4.tcp_no_metrics_save=1 net.core.somaxconn = 262144 net.ipv4.tcp_syncookies = 0 net.ipv4.tcp_max_orphans = 262144 net.ipv4.tcp_max_syn_backlog = 262144 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 2
/sbin/sysctl -p /etc/sysctl.conf /sbin/sysctl -w net.ipv4.route.flush=1
echo ulimit -HSn 1000000 >> /etc/rc.local echo ulimit -HSn 1000000 >>/root/.bash_profile ulimit -SHu 6000 >> /etc/rc.local ulimit -SHn 1000000 >> /etc/rc.local
全局限制:
执行 cat /proc/sys/fs/file-nr
1216 0 187612
(1) 1216:已经分配的文件描述符数
(2) 0:已经分配但没有使用的文件描述符数,这里的意思是内核分配了1216,而后1216个都用光了,因此“分配了但没有使用的 句柄数目” 为 0
(3) 187612:最大文件句柄数
注意:在kernel2.6 版本中第二项的值总为0,这并非一个错误,它实际上意味着已经分配的文件描述符无一浪费的都已经
被使用。
能够经过在/etc/sysctl.conf里定义fs.file-max = 1000000 来调整最后一个值的大小
2. 端口号范围限制:
操做系统上端口号1024如下是系统保留的,从1024-65535是用户使用的,因为没有tcp链接都要占用一个端口号,因此咱们最多可使用
60000多个并发链接,这是对客户端的理解。
分析一下:
(1) 如何标识一个TCP链接? 系统用一个4元组来标识一个TCP链接:(local ip,local port,remote ip, remote port) 对于accept来讲,accept的sock不占新的端口 第一个local ip , local port 表明客户端的ip地址和端口号。
而咱们做为服务器实际只是使用了bind这一个端口
说明端口65535并非并发量的限制。
(2) server最大tcp链接数:server一般固定在某一个本地端口上监听,等待client的链接请求。不考虑地址重用的状况下,即便多个ip
本地监听端口也是独占的。所以server端tcp链接4元组中只有remote ip 和 remote port 是可变的,所以最大tcp链接为
客户端ip数 * 客户端port数。 对于ipv4,不考虑ip地址等因素,最大tcp链接约为2的32次方(ip数) * 2的16次方(port数)
也就是 server端:单机最大tcp链接数约为:2的48次方。
问题1:查看文件描述符使用 lsof查看到的句柄数和/proc/sys/fs/file-nr 值不同,为何?cookie
[root@localhost ~]# lsof | wc -l 710 [root@localhost ~]# !cat cat /proc/sys/fs/file-nr 416 0 1000000
答案:一个文件能够被多个进程打开,lsof所列出来的是每一个进程所打开的文件,因此lsof的数值比file-nr要大很正常。
问题2:关于文件句柄到底设置多大合适?
查看句柄数的方法:网络
[root@node1 ~]# cat /proc/sys/fs/file-nr 832 0 97321 [root@node1 ~]# cat /proc/sys/fs/file-max 97321 默认最大句柄数为97321
这个值在kernel的文档里意思是file-max通常为内存大小(KB)的10%来计算,若是使用shell,能够这样计算:
grep -r MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}' 计算出来的值通常和默认最大句柄数近似。session
echo "fs.file-max = 100133" >> /etc/sysctl.conf && sysctl -p