【测试沉思录】17. 性能测试中的系统资源分析之四:网络
作者:马海琴 编辑:毕小烦
计算机网络,就是通过光缆、电缆、电话线或无线通讯将两台以上的计算机互连起来的集合,包括广域网、城域网、局域网和无线网。
计算机网络是传输信息的媒介。我们常说的千兆网,是指网络带宽为 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. 性能测试中的系统资源分析之四:网络相关推荐
- 【测试沉思录】14. 性能测试中的系统资源分析之一:CPU
作者:马海琴 编辑:毕小烦 在日常的性能测试中,我们除了关注应用本身的性能,比如服务的响应时间.TPS 等,也需要关注服务器本身的资源使用情况,比如 CPU.内存.磁盘.网络等.当然,不光要分析服务器 ...
- 【测试沉思录】15. 性能测试中的系统资源分析之二:内存
作者:马海琴 编辑:毕小烦 二. 内存 内存又称主存,是 CPU 能直接寻址的存储空间(由半导体器件制成). 内存的特点是存取速率快,断电一般不保存数据(非持久化设备).内存的作用是用于暂时存放 CP ...
- 【测试沉思录】22. 前端性能测试怎么做?
作者:张丹青 编辑:毕小烦 普通用户如何评价一个网站的体验好不好呢? 除了满足他的功能需求以外,用得爽不爽可能是最大的评估因素.这个爽不爽可以简单理解为快不快,好不好看,是不是符合他的操作习惯等等.而 ...
- 【测试沉思录】18.如何测试微信小程序?
作者:雷远缘 编辑:毕小烦 一. 先知道小程序是什么 啥是小程序? "小程序是一种不需要下载安装即可使用的应用,它实现了应用 "触手可及" 的梦想,用户扫一扫或者搜一下即 ...
- 【测试沉思录】2. 如何保障需求质量(下):你应该做到的
欢迎订阅我的新专栏<现代命令行工具指南>,精讲目前最流行的开源命令行工具,大大提升你的工作效率. 上一篇文章我们介绍了保障需求质量需要知道的一些基本内容,接下来,我们看保障需求质量的具体措 ...
- 【测试沉思录】11. 如何进行基准测试?
欢迎订阅我的新专栏<现代命令行工具指南>,精讲目前最流行的开源命令行工具,大大提升你的工作效率. 作者:刘洪初 编辑:毕小烦 基准测试(benchmarking)其实就是一种性能测试,只不 ...
- 【测试沉思录】1. 如何保障需求质量(上):你应该知道的
欢迎订阅我的新专栏<现代命令行工具指南>,精讲目前最流行的开源命令行工具,大大提升你的工作效率. 每个测试人员都知道保障需求质量非常重要,那到底为什么这么重要?又如何来保障需求质量呢?如果 ...
- 关于《设计模式》与《设计模式沉思录》中提到的“常露齿嘻笑的猫”(Cheshire Cat)的说明
最近在看GoF的<设计模式>,在此之前看了John Vlissides的<设计模式沉思录>,在"沉思录"P42页脚注中,作者提到 "在C++中这样 ...
- 关于《设计模式》与《设计模式沉思录》中提到的“常露齿嘻笑的猫”(Cheshire Cat)的说明...
最近在看GoF的<设计模式>,在此之前看了John Vlissides的<设计模式沉思录>,在"沉思录"P42页脚注中,作者提到 "在C++中这样 ...
最新文章
- Win10系列:JavaScript综合实例2
- Android移动开发之【Android实战项目】DAY10-App端耗流量场景问题及减少消耗办法
- React.Fragment 包裹标签
- 在场景中加入第一人称视角运行后一直往下掉的解决方案
- JavaWeb图书管理系统day03
- P2197 【模板】nim游戏
- Celery参数详解、配置参数
- vue项目引入CNZZ数据专家(方法汇总篇)
- java 封闭类型_Java并发之线程封闭
- C++标准转换运算符:const_cast
- 服务器系统咋关机呀,各种服务器系统的关机
- 数据库操作--批量修改数据库表名及字段名大小写转换及首字母大写+删除没有数据无用的表...
- 苹果Mac临时文件存储助手工具:Yoink
- Pascal 基础教程
- Python读取相对路径文件
- Android CPU 双核,为何安卓八核CPU不如苹果双核?
- linux系统安装达梦数据库
- GPS北斗模块串口助手输出测试
- 使用element-ui实现表格分页
- 数字图像频谱的中心化
热门文章
- 警务系统三维可视化管理与情报研判综合分析平台
- excel合并sheet表格
- 有一个已经排好序的数组,要求输入一个数后,按原来排序规律将它插入数组中。
- 火焰识别python_五行属火的字大全
- 安卓手机玩游戏卡顿怎么解决_安卓手机卡顿怎么办?5招教你变流畅,继续用三五年,媲美iPhone...
- 今日头条面试——iOS开发岗
- 计算机存储单元ASCI,在计算机存储器中,存储英文字母\quot;A\quot;时,存储的是它的( ) A.输入码B.ASCII码C - 作业在线问答...
- WEB页面常见安全问题
- HC-05蓝牙模块连接蓝牙打印机步骤
- iOS开发-苹果开发者账号注册、申请续费整个流程