作者:马海琴 编辑:毕小烦
计算机网络,就是通过光缆、电缆、电话线或无线通讯将两台以上的计算机互连起来的集合,包括广域网、城域网、局域网和无线网。
计算机网络是传输信息的媒介。我们常说的千兆网,是指网络带宽为 1000Mbps
,将 bit
换算成 Byte
,理论上 1s
的传输速度为 125MB
。
在对 HTTP 接口进行性能测试的过程中,有可能出现「Address already in use」「Address not available」等报错,也可能出现明明 IO 和 CPU 都很低,TPS 确无法上升的情况,这就是有可能是网络遇到了瓶颈。HTTP 接口是使用 TCP 协议进行传输,由四个组成原件:源地址、源端口、目的地址、目的端口。
- 源地址:发起通信的 IP 地址
- 源端口:发起通信的端口
- 目的地址:接受通信的 IP 地址
- 目的端口:接受通信请求的端口
在性能测试中,高并发场景下会占用大量的端口,如果这些端口没有释放就会出现端口不够用的情况。
一. 常见问题:网络带宽不足
可以通过dstat -t -n
查看网络情况。
如下所示:
输出结果中,net/total
代表网络的情况:
recv
:流量接收速度send
:流量发送速度
在性能测试的过程中,我们需要监控网络的使用情况,一旦达到网络带宽的瓶颈(recv/send 接近带宽,一般会略低于带宽),也会影响我们性能测试的结果。我们需要考虑优化传输数据量的大小,以降低带宽的压力。
二. 常见问题:端口不足
2.1 服务器端口不足
当出现以下报错信息时,可能是出现了端口不足导致的。
- Address already in use: connect
- Failed to connect to server
- Address not available
① 如何验证是不是端口不足呢?
第一步:查看机器的可用端口数量
命令:
$ cat /proc/sys/net/ipv4/ip_local_port_range
如:
第二步:统计当前连接数
命令:
$ netstat -nat | awk '/^tcp/{++S[$NF]}END{for (a in S) print a,S[a]}'
如:
状态说明:
CLOSED
:无连接是活动的或正在进行LISTEN
:服务器在等待进入呼叫SYN_RECV
:一个连接请求已经到达,等待确认SYN_SENT
:应用已经开始,打开一个连接ESTABLISHED
:正常数据传输状态FIN_WAIT1
:应用说它已经完成FIN_WAIT2
:另一边已同意释放ITMED_WAIT
:等待所有分组死掉CLOSING
:两边同时尝试关闭TIME_WAIT
:另一边已初始化一个释放LAST_ACK
:等待所有分组死掉
当连接数接近可用端口数量时,说明端口被耗尽了。
② 怎么解决端口不足的问题?
可以从以下两个方面来解决:
方法一:增加可用端口
修改文件/etc/sysctl.conf
,添加内容net.ipv4.ip_local_port_range = 1024 65535
,执行命令/sbin/sysctl -p
使配置生效。
如:
方法二:提升端口回收速度
在文件/etc/sysctl.conf
添加以下内容:
# 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
net.ipv4.tcp_fin_timeout = 30
# 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟
net.ipv4.tcp_keepalive_time = 1200
# 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
net.ipv4.tcp_syncookies = 1
# 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1
# 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_tw_recycle = 1
# 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数
net.ipv4.tcp_max_syn_backlog = 8192
# 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息,默认为 180000
net.ipv4.tcp_max_tw_buckets = 5000
最后执行命令/sbin/sysctl -p
使配置生效。当 tpc
连接中 TIME_WAIT
状态的数量较多时,该方法的效果将会非常明显。
如果是压测机的端口不足,除了使用以上方法来提升压测机的性能,更直接的方式是发起请求的时候不要使用 KeepAlive
模式(告诉 WEB 服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了)。如果还是端口不足,那就需要增加压测机的数量来解决了。
如果是被测服务所在的机器端口不足,一般不建议修改机器的配置(建议与线上保持一致),如果要修改,需要与开发和运维一起评估修改配置的利弊以及可能存在的风险。
2.2 服务内部端口不足
查看当前服务的端口连接数量:
netstat -ane|grep ESTABLISHED |grep 'ip:port'|wc -l
当测试过程中,该值增长到一定数量就不再变化,测试结束,值立即下降。当服务器所有资源都未达到瓶颈,而 tps
无法随着并发数量而增加的时候,我们就要考虑是不是服务本身的线程数量不足导致的。这个时候只要适当的增加线程数量即可,线程数量不可无限增加,数量越大消耗的资源就会越多,要根据测试情况进行调整,保证在一定的系统资源下,配置合理的线程数量,使得在服务稳定的前提下尽可能提升系统资源的利用率。
关于系统资源的分析就到这里了,关于分析的命令其实有很多,本系列文章只是列举了常用的一小部分,在面对真实的问题时,可以根据需要使用更便捷的方式。在实际的生产中,我们更多的是会使用图形监控服务资源的使用,也会对很多异常场景设置报警提醒和现场留存,这对分析和发现问题都有很大的帮助。
(完)
如果文章对你有帮助,记得留言、点赞、加关注哦!