作者:马海琴 编辑:毕小烦

计算机网络,就是通过光缆、电缆、电话线或无线通讯将两台以上的计算机互连起来的集合,包括广域网、城域网、局域网和无线网。
计算机网络是传输信息的媒介。我们常说的千兆网,是指网络带宽为 1000Mbps,将 bit 换算成 Byte,理论上 1s 的传输速度为 125MB

在对 HTTP 接口进行性能测试的过程中,有可能出现「Address already in use」「Address not available」等报错,也可能出现明明 IO 和 CPU 都很低,TPS 确无法上升的情况,这就是有可能是网络遇到了瓶颈。HTTP 接口是使用 TCP 协议进行传输,由四个组成原件:源地址、源端口、目的地址、目的端口。

  • 源地址:发起通信的 IP 地址
  • 源端口:发起通信的端口
  • 目的地址:接受通信的 IP 地址
  • 目的端口:接受通信请求的端口

在性能测试中,高并发场景下会占用大量的端口,如果这些端口没有释放就会出现端口不够用的情况。

一. 常见问题:网络带宽不足

可以通过dstat -t -n查看网络情况。

如下所示:
image.png

输出结果中,net/total代表网络的情况:

  • recv:流量接收速度
  • send:流量发送速度

在性能测试的过程中,我们需要监控网络的使用情况,一旦达到网络带宽的瓶颈(recv/send 接近带宽,一般会略低于带宽),也会影响我们性能测试的结果。我们需要考虑优化传输数据量的大小,以降低带宽的压力

二. 常见问题:端口不足

2.1 服务器端口不足

当出现以下报错信息时,可能是出现了端口不足导致的。

  • Address already in use: connect
  • Failed to connect to server
  • Address not available


① 如何验证是不是端口不足呢?

第一步:查看机器的可用端口数量

命令:

  1. $ cat /proc/sys/net/ipv4/ip_local_port_range

如:
image.png

第二步:统计当前连接数

命令:

  1. $ netstat -nat | awk '/^tcp/{++S[$NF]}END{for (a in S) print a,S[a]}'

如:
image.png

状态说明:

  • 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使配置生效。

如:
image.png

方法二:提升端口回收速度

在文件/etc/sysctl.conf添加以下内容:

  1. # 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
  2. net.ipv4.tcp_fin_timeout = 30
  3. # 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟
  4. net.ipv4.tcp_keepalive_time = 1200
  5. # 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
  6. net.ipv4.tcp_syncookies = 1
  7. # 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
  8. net.ipv4.tcp_tw_reuse = 1
  9. # 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
  10. net.ipv4.tcp_tw_recycle = 1
  11. # 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数
  12. net.ipv4.tcp_max_syn_backlog = 8192
  13. # 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息,默认为 180000
  14. net.ipv4.tcp_max_tw_buckets = 5000

最后执行命令/sbin/sysctl -p使配置生效。当 tpc 连接中 TIME_WAIT 状态的数量较多时,该方法的效果将会非常明显。

如果是压测机的端口不足,除了使用以上方法来提升压测机的性能,更直接的方式是发起请求的时候不要使用 KeepAlive 模式(告诉 WEB 服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了)。如果还是端口不足,那就需要增加压测机的数量来解决了。

如果是被测服务所在的机器端口不足,一般不建议修改机器的配置(建议与线上保持一致),如果要修改,需要与开发和运维一起评估修改配置的利弊以及可能存在的风险。

2.2 服务内部端口不足

查看当前服务的端口连接数量:

  1. netstat -ane|grep ESTABLISHED |grep 'ip:port'|wc -l

当测试过程中,该值增长到一定数量就不再变化,测试结束,值立即下降。当服务器所有资源都未达到瓶颈,而 tps 无法随着并发数量而增加的时候,我们就要考虑是不是服务本身的线程数量不足导致的。这个时候只要适当的增加线程数量即可,线程数量不可无限增加,数量越大消耗的资源就会越多,要根据测试情况进行调整,保证在一定的系统资源下,配置合理的线程数量,使得在服务稳定的前提下尽可能提升系统资源的利用率。

关于系统资源的分析就到这里了,关于分析的命令其实有很多,本系列文章只是列举了常用的一小部分,在面对真实的问题时,可以根据需要使用更便捷的方式。在实际的生产中,我们更多的是会使用图形监控服务资源的使用,也会对很多异常场景设置报警提醒和现场留存,这对分析和发现问题都有很大的帮助。

(完)
微信搜索“毕小烦”或者扫描下面的二维码,即可订阅我的微信公众号
image.png
如果文章对你有帮助,记得留言、点赞、加关注哦!