性能瓶颈之网络分析及调优

一、业务背景
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

posted @ 2023-03-01 23:35  我是小菜鸡丫丫  阅读(293)  评论(0编辑  收藏  举报