性能瓶颈之网络分析及调优
一、业务背景
1. 目标分析
假设目标:支撑3000/并发
生产环境配置:8核 8G 10M带宽
性能测试环境:2核 2G 5M带宽 (缩水1/4资源,则性能目标是3000/4=750/s)
采用负载测试,通过不断增加压力的方式去测试,那么线程数如何确定呢?
2. 线程数计算
方式一:首先通过基准测试,获取基准相应时间,假设通过基准测试,得到平均响应时间为15ms,那么,单线程产生的并发量=1000ms/单个接口的相应时间(ms),即1000/15=66。
线程数量=目标并发量/单线程,即750/66=11。但实际性能测试过程中,线程数往往需要过载,所以按15个线程数来跑脚本
方法二:按能接受的最大响应时间,去代入上面的公式。比如能接受最大的相应时间为500ms,则单线程并发量为2,线程数为375。
3. 执行jmeter脚本
如下为15个线程进行负载测试执行2分钟的结果,吞吐量为552/s
如下为tps曲线图:
4. 执行结果分析
程序性能指标:吞吐量、响应时间、错误率、资源占用率
从tps曲线图来看,吞吐量不再随着并发增加而增加,接下来如果持续高压,系统会积压很多请求,存在性能瓶颈。
查看服务器资源占用,cpu和内存资源均不饱和,均占用不到一半。此时先分析,是否会存在网络瓶颈问题导致。
查看服务端与客户端的之间的网络速度,推荐使用iperf3工具
二、检查服务网络速度-iperf3工具
1. 服务端安装iperf3
我使用的是ubantu系统,安装命令为:sudo apt install iperf3
安装后,启动服务命令:iperf3 -s (默认端口: 5201)
常用参数:
-s : 表示服务器端; -p : 定义端口号; -i 设置每次报告之间的时间间隔,单位为秒,如果设置为非零值,就会按照此时间间隔输出测试报告,默认值为零
2.客户端安装iperf3
jmeter所在的客户端,本人使用的是windows,下载地址 iPerf - Download iPerf3 and original iPerf pre-compiled binaries
下载后,在文件所在的目录执行命令:iperf3 -c [服务端ip] -t 10 -i 2 -R
参数含义:
-c:表示服务器的IP地址; -p:表示服务器的端口号; -t:参数可以指定传输测试的持续时间,Iperf在指定的时间内,重复的发送指定长度的数据包,默认是10秒钟. -i:设置每次报告之间的时间间隔,单位为秒,如果设置为非零值,就会按照此时间间隔输出测试报告,默认值为零; -w:设置套接字缓冲区为指定大小,对于TCP方式,此设置为TCP窗口大小,对于UDP方式,此设置为接受UDP数据包的缓冲区大小,限制可以接受数据包的最大值. --logfile:参数可以将输出的测试结果储存至文件中. -J:来输出JSON格式测试结果. -R:反向传输,缺省iperf3使用上传模式:Client负责发送数据,Server负责接收;如果需要测试下载速度,则在Client侧使用-R参数即可. 测试结果: 性能测试环境 和 Jmeter施压机器 -- 5Mbps 网络带宽
测试结果: 性能测试环境 和 Jmeter施压机器 -- 5Mbps 网络带宽
注意:这里的5Mbps,是网络带宽单位,符号是bps(bit/s,位/秒 ,二进制的位传递),与平时我们的普通文件5Mb不是一个概念,普通文件的单位是Byte 字节. 换算单位为 1Byte=8bit
5M/bps宽带 -- 理论下载速度 最高0.625M/BytePS
3. 计算 -- 550/s 吞吐量 占用多大网络带宽
1).传输内容大小
把服务端的响应数据复制10次到txt文本中,查看到文件大小为3.34kb,则单次的传输大小大概为0.33kb 。
2).http头大小普遍1KB左右,有些响应头还会更大
所以每次传输响应数据在1.3KB左右
3).实测过程中占用网络带宽
550*1.3=网络每秒传输715KB,占用带宽=715KB * 8 = 5720kbps 约等于 5Mbps左右
4). 推测性能瓶颈的原因在这,验证提高性能测试环境的带宽
4. 增加服务端的带宽为10Mbps
5. 重新跑脚本验证
从如下图可以发现,吞吐量提升到712.5/s,说明网络带宽增加后对吞吐量有提升。(与理想的800/s还有一点差距,如果不确定是否仍是带宽瓶颈问题,可以继续增加带宽资源验证吞吐量是否有提升)
三、网络监控 - iftop工具
iftop (全称interface top) 是查看网络实时流量的工具。由于网络被占用,不一定就是我们的应用程序原因,一个服务器可能部署了多个应用程序,因此需要一个单独监控网络的工具
1. 安装
ubantu系统,安装命令:
sudo apt-get install iftop
2. 监控网卡的实时流量
通过命令: ip addr 找到要监控的网络接口
然后执行命令:
iftop -i ens33 -n # ens33替换成自己的网络接口名
参数含义:
-i:设定监测的网卡,如:# iftop -i eth1 -B:以bytes为单位显示流量(默认是bits),如:# iftop -B -n:使host信息默认直接都显示IP,如:# iftop -n -N:使端口信息默认直接都显示端口号,如: # iftop -N -F:显示特定网段的进出流量,如# iftop -F 172.30.1.0/24或# iftop -F 172.30.1.0/255.255.255.0 -h:(display this message),帮助,显示参数信息 -p:使用这个参数后,中间的列表显示的本地主机信息,出现了本机以外的IP信息; -b:使流量图形条默认就显示; -f:过滤计算包使用; -P:使host信息及端口信息默认就都显示; -m:设置界面最上边的刻度的最大值,刻度分五个大段显示,例:# iftop -m 100M
执行命令后,会进入iftop画面:
界面上面显示的是类似刻度尺的刻度范围,为显示流量图形的长条作标尺用的。
中间的<= =>这两个左右箭头,表示的是流量的方向。
TX:表示发送的总流量
RX:表示接收的总流量
TOTAL:表示总流量
peak:表示每秒流量的峰值
rates:分别表示过去2秒、10秒、40秒的平均流量。
进入iftop画面后的一些操作命令(注意大小写)
按h切换是否显示帮助; 按n切换显示本机的IP或主机名; 按s切换是否显示本机的host信息; 按d切换是否显示远端目标主机的host信息; 按t切换显示格式为2行/1行/只显示发送流量/只显示接收流量; 按N切换显示端口号或端口服务名称; 按S切换是否显示本机的端口信息; 按D切换是否显示远端目标主机的端口信息; 按p切换是否显示端口信息; 按P切换暂停/继续显示; 按b切换是否显示平均流量图形条; 按B切换计算2秒或10秒或40秒内的平均流量; 按T切换是否显示每个连接的总流量; 按l打开屏幕过滤功能,输入要过滤的字符,比如ip,按回车后,屏幕就只显示这个IP相关的流量信息; 按L切换显示画面上边的刻度;刻度不同,流量图形条会有变化; 按j或按k可以向上或向下滚动屏幕显示的连接记录; 按1或2或3可以根据右侧显示的三列流量数据进行排序; 按<根据左边的本机名或IP排序; 按>根据远端目标主机的主机名或IP排序; 按o切换是否固定只显示当前的连接; 按f可以编辑过滤代码,这是翻译过来的说法,我还没用过这个! 按!可以使用shell命令,这个没用过!没搞明白啥命令在这好用呢! 按q退出监控。
四、优化建议
如果系统资源用完了, 要么花钱升级机器,要么就是 进一步优化程序
从网络瓶颈,程序角度优化思路:
1. 压缩数据传输的大小:服务器层面 gzip压缩传输、压缩源数据
2. 减少不必要数据传输
原文链接:https://blog.csdn.net/qq_38571773/article/details/128170735