服务器⾼并发之提⾼TCP连接数
前⾔
测试服务器系统:ubuntu server 20.04.3
nginx负载均衡服务器:centos 7
服务器上我放了⼀个web系统⽤来测试连接数:
发出请求的是我的电脑,电脑系统:win7
发出请求⽤的是python的压测⼯具:locust
TCP连接能连接多少
要想弄清楚⼀个服务器能接受多少连接数,就需要根据socket五元组来看,即源IP+源端⼝+⽬标IP+⽬标端⼝+类型(TCP/UDP)。只要五元组不重复,就可以新增tcp连接。不过由于测试的时候⼀般类型都是相同的,所有⼤多数都是称为四元组。
由于服务器的IP和web系统的端⼝⼀般是固定的,每个客户端的IP⼜不相同,那么照这样看连接数应该基
本上相当于没限制才对。其实不然,实际上每个连接还要占⽤⼀定的内存和⼀个⽂件描述符。
那么⼀个TCP socket占⽤多少内存呢?
⼤约是3K多,当然如果有发送或者接收的缓存区⽂件存在则另算,在响应较快、缓存⽂件不⼤的情况下内存应该不会成为瓶颈。
服务器⼜能打开多少⽂件描述符呢?
可以通过以下命令查看
系统级:当前系统可打开的最⼤数量,通过cat /proc/sys/fs/file-max查看
⽤户级:指定⽤户可打开的最⼤数量,通过cat /etc/f查看
进程级:单个进程可打开的最⼤数量,通过cat /proc/sys/fs/nr_open查看
修改⽅式
修改单个进程可打开的最⼤⽂件描述符为10000,即可打开10000个连接:echo 10000 > /proc/sys/fs/nr_open
⽤户级修改:
sudo vi /etc/f
root soft nofile 65533
root hard nofile 65533
# root为指定修改的⽤户,soft为软限制,hard为硬限制,⼀般软限制要⼩于或等于硬限制
当然,每创建⼀个tcp连接,还需要消耗⼀个线程来处理(也可以采⽤IO多路复⽤的⽅式,⼀个线程管理多个TCP连接),所以和CPU也有关系,不能通过单纯的提⾼内存的⽅式来增加连接数。
常⽤查看连接数命令:
netstat -nat | grep -i "8085" | wc -l # 查询指定端⼝的连接数
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' # 查看TCP连接数及状态命令
实际测试
此时是使⽤我的电脑向nginx负载均衡服务器发送请求,然后转发给web服务器。
测试1 未调整的情况下测试
客户端情况:
初始:可⽤端⼝55000个,性能够⽤
结果:本地性能未达瓶颈,但是设置的1000并发⼈数,请求数平均只有437.3。
nginx服务器情况:
初始:可⽤端⼝60000个,⽤户级65535,性能够⽤
结果:本地性能未达瓶颈,但是出现很多TIME_WAIT数,最⾼时8000多。
服务器情况:
初始:⽤户级65535。
结果:最⾼连接数23,平均2.
测试1分析
先分析⼀下TIME_WAIT、CLOSE_WAIT出现的原因及解决⽅法
负载均衡服务器有哪些分析这⾥,就必须要简短回顾⼀下四次挥⼿(当client发起结束请求时)
简短来说:
1、⼀端没有close,那么另⼀端将有⼤量的close_wait状态;
2、主动close的⼀端,在量特别⼤的情况下将造成⼤量的time_wait状态(由于Linux中⼀般默认的2msl为60s,那么正常情况下每秒1000的请求会造成60*1000=60000个time_wait记录,⼏百⼏千问题不⼤)
既然主动close的⼀⽅才会有time_wait记录,那么这⾥就说明nginx服务器是主动关闭的⼀⽅,那nginx服务器关闭的对象⼜是谁呢?
在仅修改了nginx的代理地址,未改变其他配置情况下,通过wireshark抓包得知:
客户端与nginx端相互通信都是http/1.1的链接,这⾥是nginx端先发起的fin请求;
nginx端到服务器端的请求是http/1.0,服务器端返回的请求是http/1.1,这⾥是nginx端先发起的fin请求。
测试1优化
依上⾯的场景分析,如果要减少time_wait数,提⾼连接数,则需要从以下⽅⾯来解决
1. 调整负载均衡服务器和web服务器/f下的net.ipv4.ip_local_port_range配置,修改成net.ipv4.ip_local_port_range=1024 65535,
保证⾄少可以使⽤6万个随机端⼝,就算保留1分钟,也能⽀持每秒1000的并发;
2. 加多负载均衡服务器的ip,直接翻番;
3. 负载均衡与服务器端也建⽴长连接,不关闭就不会有等待;
4. 扩⼤nginx的keep-alive超时时间,最⼤请求数,使得长连接不会这么早关闭;
5. 在nginx服务器上调整time_wait参数p_tw_reuse=1,尽可能去复⽤连接(另外p_tw_recycle参数在4.10以上内核
中被移除了)。
另外还有⼀些参数可以调整,不过⼀般默认是够⽤的
p_syncookies = 1 # 表⽰开启SYN Cookies。当出现SYN等待队列溢出时,启⽤cookies来处理,可防范少量SYN攻击,默认为0,表⽰关闭;
p_keepalive_time = 1200 #表⽰当keepalive起⽤的时候,TCP发送keepalive消息的频度。缺省是2⼩时,改为20分钟。
p_max_syn_backlog = 8192 #表⽰SYN队列的长度,默认为1024,加⼤队列长度为8192,可以容纳更多等待连接的⽹络连接数。
p_max_tw_buckets = 5000 #表⽰系统同时保持TIME_WAIT套接字的最⼤数量,如果超过这个数字,TIME_WAIT套接字将⽴刻被清除并打印警告信息。
#默认为180000,改为5000。对于Apache、Nginx等服务器,上⼏⾏的参数可以很好地减少TIME_WAIT套接字数量,。
待优化测试验证
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论