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

计算机网络,就是通过光缆、电缆、电话线或无线通讯将两台以上的计算机互连起来的集合,包括广域网、城域网、局域网和无线网。

计算机网络是传输信息的媒介。我们常说的千兆网,是指网络带宽为 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 无法随着并发数量而增加的时候,我们就要考虑是不是服务本身的线程数量不足导致的。这个时候只要适当的增加线程数量即可,线程数量不可无限增加,数量越大消耗的资源就会越多,要根据测试情况进行调整,保证在一定的系统资源下,配置合理的线程数量,使得在服务稳定的前提下尽可能提升系统资源的利用率。

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

(完)

如果文章对你有帮助,记得留言、点赞、加关注哦!

【测试沉思录】17. 性能测试中的系统资源分析之四:网络相关推荐

  1. 【测试沉思录】14. 性能测试中的系统资源分析之一:CPU

    作者:马海琴 编辑:毕小烦 在日常的性能测试中,我们除了关注应用本身的性能,比如服务的响应时间.TPS 等,也需要关注服务器本身的资源使用情况,比如 CPU.内存.磁盘.网络等.当然,不光要分析服务器 ...

  2. 【测试沉思录】15. 性能测试中的系统资源分析之二:内存

    作者:马海琴 编辑:毕小烦 二. 内存 内存又称主存,是 CPU 能直接寻址的存储空间(由半导体器件制成). 内存的特点是存取速率快,断电一般不保存数据(非持久化设备).内存的作用是用于暂时存放 CP ...

  3. 【测试沉思录】22. 前端性能测试怎么做?

    作者:张丹青 编辑:毕小烦 普通用户如何评价一个网站的体验好不好呢? 除了满足他的功能需求以外,用得爽不爽可能是最大的评估因素.这个爽不爽可以简单理解为快不快,好不好看,是不是符合他的操作习惯等等.而 ...

  4. 【测试沉思录】18.如何测试微信小程序?

    作者:雷远缘 编辑:毕小烦 一. 先知道小程序是什么 啥是小程序? "小程序是一种不需要下载安装即可使用的应用,它实现了应用 "触手可及" 的梦想,用户扫一扫或者搜一下即 ...

  5. 【测试沉思录】2. 如何保障需求质量(下):你应该做到的

    欢迎订阅我的新专栏<现代命令行工具指南>,精讲目前最流行的开源命令行工具,大大提升你的工作效率. 上一篇文章我们介绍了保障需求质量需要知道的一些基本内容,接下来,我们看保障需求质量的具体措 ...

  6. 【测试沉思录】11. 如何进行基准测试?

    欢迎订阅我的新专栏<现代命令行工具指南>,精讲目前最流行的开源命令行工具,大大提升你的工作效率. 作者:刘洪初 编辑:毕小烦 基准测试(benchmarking)其实就是一种性能测试,只不 ...

  7. 【测试沉思录】1. 如何保障需求质量(上):你应该知道的

    欢迎订阅我的新专栏<现代命令行工具指南>,精讲目前最流行的开源命令行工具,大大提升你的工作效率. 每个测试人员都知道保障需求质量非常重要,那到底为什么这么重要?又如何来保障需求质量呢?如果 ...

  8. 关于《设计模式》与《设计模式沉思录》中提到的“常露齿嘻笑的猫”(Cheshire Cat)的说明

    最近在看GoF的<设计模式>,在此之前看了John Vlissides的<设计模式沉思录>,在"沉思录"P42页脚注中,作者提到 "在C++中这样 ...

  9. 关于《设计模式》与《设计模式沉思录》中提到的“常露齿嘻笑的猫”(Cheshire Cat)的说明...

    最近在看GoF的<设计模式>,在此之前看了John Vlissides的<设计模式沉思录>,在"沉思录"P42页脚注中,作者提到 "在C++中这样 ...

最新文章

  1. Win10系列:JavaScript综合实例2
  2. Android移动开发之【Android实战项目】DAY10-App端耗流量场景问题及减少消耗办法
  3. React.Fragment 包裹标签
  4. 在场景中加入第一人称视角运行后一直往下掉的解决方案
  5. JavaWeb图书管理系统day03
  6. P2197 【模板】nim游戏
  7. Celery参数详解、配置参数
  8. vue项目引入CNZZ数据专家(方法汇总篇)
  9. java 封闭类型_Java并发之线程封闭
  10. C++标准转换运算符:const_cast
  11. 服务器系统咋关机呀,各种服务器系统的关机
  12. 数据库操作--批量修改数据库表名及字段名大小写转换及首字母大写+删除没有数据无用的表...
  13. 苹果Mac临时文件存储助手工具:Yoink
  14. Pascal 基础教程
  15. Python读取相对路径文件
  16. Android CPU 双核,为何安卓八核CPU不如苹果双核?
  17. linux系统安装达梦数据库
  18. GPS北斗模块串口助手输出测试
  19. 使用element-ui实现表格分页
  20. 数字图像频谱的中心化

热门文章

  1. 警务系统三维可视化管理与情报研判综合分析平台
  2. excel合并sheet表格
  3. 有一个已经排好序的数组,要求输入一个数后,按原来排序规律将它插入数组中。
  4. 火焰识别python_五行属火的字大全
  5. 安卓手机玩游戏卡顿怎么解决_安卓手机卡顿怎么办?5招教你变流畅,继续用三五年,媲美iPhone...
  6. 今日头条面试——iOS开发岗
  7. 计算机存储单元ASCI,在计算机存储器中,存储英文字母\quot;A\quot;时,存储的是它的( ) A.输入码B.ASCII码C - 作业在线问答...
  8. WEB页面常见安全问题
  9. HC-05蓝牙模块连接蓝牙打印机步骤
  10. iOS开发-苹果开发者账号注册、申请续费整个流程