成为高级性能测试:发现性能瓶颈掌握性能调优

当下云计算、大数据盛行的背景下,大并发和大吞吐量的需求已经是摆在企业面前的问题了,其中网络的性能要求尤为关键,除了软件本身需要考虑到性能方面的要求,一些硬件上面的优化也是必不可少的。

作为一名测试工作者,对于性能测试的问题肯定不会陌生,但是测试不仅仅是执行和收集数据,更多的应该是分析问题、找到性能瓶颈以及一些优化工作。

毕竟在客户现场测试性能的时候,能够通过一些系统层面的调优,提升软件的性能,那对项目无疑是一件锦上添花的事。

指标

不管你做何种性能测试,指标是绕不过去的事,指标是量化性能测试的重要依据。衡量某个性能的指标有很多,比如衡量数据库性能通常用TPS、QPS和延时,衡量io性能通常用iops、吞吐量和延时,衡量网络的性能指标也有很多,在业界有一个RFC2544的标准,参考链接:https://www.rfc-editor.org/rfc/rfc2544。

这里稍微解释一下几个指标:

  • 背靠背测试:在一段时间内,以合法的最小帧间隔在传输介质上连续发送固定长度的包而不引起丢包时的数据量。
  • 丢包率测试:在路由器稳定负载状态下,由于缺乏资源而不能被转发的帧占所有该被转发的帧的百分比。
  • 时延测试:输入帧的最后一位到达输入端口到输出帧的第一位出现在输出端看的时间间隔。
  • 吞吐量测试:没有丢包情况下能够转发的最大速率。

通常客户对于吞吐量和时延的指标是比较关心的,吞吐量反应了系统的并发的处理能力,时延反应了整体业务的响应时间。

测试准备

本文以网卡中的战斗机intel X710为测试对象,进行小包的吞吐量测试。

Tips:通常大包的测试可以达到线速,小包则很难线速,相同mtu下,包越小单位时间内cpu处理的包数越多,cpu的压力越大。

1 测试拓扑

在被测设备上插入X710网卡,使用网卡的2个网口建立linux bridge,通过测试仪发送接收数据包:

图片

[root@localhost ~]# brctl addbr test
[root@localhost ~]# brctl addif test enp11s0f2 enp11s0f3
[root@localhost ~]# ip link set test up
[root@localhost ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
test            8000.6cb311618c30       no              enp11s0f2
                                                        enp11s0f3
virbr0          8000.5254004c4831       yes             virbr0-nic

2 硬件信息

有个伟人曾说过,“如果性能测试不谈硬件,那么就和恋爱不谈结婚一个道理,都是耍流氓”。

鲁迅:“我没说过!”

题外话,这里先简单说一下数据包进入网卡后的流程:数据包进入到网卡后,将数据缓存到服务器内存后通知内核进行处理,接着协议栈进行处理,通常netfilter也是在协议栈去处理,最后应用程序从socker buff读取数据。

图片

言归真正,本文测试采用的是国产之光飞腾S2500服务器。

图片

测试调优

针对以上拓扑,发送128字节万兆双向流量,用RFC2544标准进行测试。

图片

RFC2544的标准是0丢包测试吞吐量,结果是818Mbps。

以上都是前菜,接下来是本文的重头戏,根据已有资源做一些优化,提升“测试”性能,让客户满意。

1 调整队列数

调整网卡的队列数,利用网卡的多队列特性,不同的队列通过中断绑定到不同的cpu,提升cpu处理性能,提升网络带宽。

调整队列数,这里也不是越大越好,因为服务器的cpu个数是有上限的,队列多的话会出现多个中断绑定在同一个cpu上,这里我服务器单个numa有8个cpu,修改队列数为8:

[root@localhost ~]# ethtool -l enp11s0f2
Channel parameters for enp11s0f2:
Pre-set maximums:
RX:             0
TX:             0
Other:          1
Combined:       128
Current hardware settings:
RX:             0
TX:             0
Other:          1
Combined:       8
  • 1

因为数据包会根据hash来进入到多个收包队列,因此发送数据包的时候,可以选择源ip变化的流来确保使用了网卡的多队列,可以查看网卡的队列计数。

修改完队列后再次使用RFC2544进行测试,性能比单队列提升了57%。

图片

2 调整队列深度

除了调整网卡的队列数外,也可以修改网卡的队列深度,但是队列深度不是越大越好,具体还是需要看实际的应用场景。对于延时要求高的场景并不适合修改太大的队列深度。

查看当前队列深度为512,修改为1024再次测试:

[root@localhost ~]# ethtool -g enp11s0f2
Ring parameters for enp11s0f2:
Pre-set maximums:
RX:             4096
RX Mini:        0
RX Jumbo:       0
TX:             4096
Current hardware settings:
RX:             512
RX Mini:        0
RX Jumbo:       0
TX:             512
  • 1

修改tx和rx队列深度为1024:

[root@localhost ~]# ethtool -G enp11s0f3 tx  1024
[root@localhost ~]# ethtool -G enp11s0f3 rx  1024
[root@localhost ~]# ethtool -g enp11s0f2
Ring parameters for enp11s0f2:
Pre-set maximums:
RX:             4096
RX Mini:        0
RX Jumbo:       0
TX:             4096
Current hardware settings:
RX:             1024
RX Mini:        0
RX Jumbo:       0
TX:             1024
  • 1

再次进行RFC2544测试,这次也是有相应的提升。

图片

3 中断绑定

网卡收包后,内核会触发软中断程序,如果此时运行中断的cpu和网卡不在一个numa上,则性能会降低。

查看网卡pci插槽对应numa node:

[root@localhost ~]# cat /sys/bus/pci/devices/0000\:0b\:00.3/numa_node
0
这里对应的numa node为0
飞腾S2500有16个numa node,node8-15和node0所在的物理cpu不同,如果中断跑在上面性能会更加低
[root@localhost ~]# numactl -H
available: 16 nodes (0-15)
node 0 cpus: 0 1 2 3 4 5 6 7
node 0 size: 65009 MB
node 0 free: 46721 MB
node 1 cpus: 8 9 10 11 12 13 14 15
node 1 size: 0 MB
node 1 free: 0 MB
node 2 cpus: 16 17 18 19 20 21 22 23
node 2 size: 0 MB
node 2 free: 0 MB
node 3 cpus: 24 25 26 27 28 29 30 31
node 3 size: 0 MB
node 3 free: 0 MB
node 4 cpus: 32 33 34 35 36 37 38 39
node 4 size: 0 MB
node 4 free: 0 MB
node 5 cpus: 40 41 42 43 44 45 46 47
node 5 size: 0 MB
node 5 free: 0 MB
node 6 cpus: 48 49 50 51 52 53 54 55
node 6 size: 65466 MB
node 6 free: 64663 MB
node 7 cpus: 56 57 58 59 60 61 62 63
node 7 size: 0 MB
node 7 free: 0 MB
node 8 cpus: 64 65 66 67 68 69 70 71
node 8 size: 65402 MB
node 8 free: 63691 MB
node 9 cpus: 72 73 74 75 76 77 78 79
node 9 size: 0 MB
node 9 free: 0 MB
node 10 cpus: 80 81 82 83 84 85 86 87
node 10 size: 0 MB
node 10 free: 0 MB
node 11 cpus: 88 89 90 91 92 93 94 95
node 11 size: 0 MB
node 11 free: 0 MB
node 12 cpus: 96 97 98 99 100 101 102 103
node 12 size: 0 MB
node 12 free: 0 MB
node 13 cpus: 104 105 106 107 108 109 110 111
node 13 size: 0 MB
node 13 free: 0 MB
node 14 cpus: 112 113 114 115 116 117 118 119
node 14 size: 64358 MB
node 14 free: 63455 MB
node 15 cpus: 120 121 122 123 124 125 126 127
node 15 size: 0 MB
node 15 free: 0 MB
node distances:
node   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
  0:  10  20  40  30  20  30  50  40  100  100  100  100  100  100  100  100
  1:  20  10  30  40  50  20  40  50  100  100  100  100  100  100  100  100
  2:  40  30  10  20  40  50  20  30  100  100  100  100  100  100  100  100
  3:  30  40  20  10  30  20  40  50  100  100  100  100  100  100  100  100
  4:  20  50  40  30  10  50  30  20  100  100  100  100  100  100  100  100
  5:  30  20  50  20  50  10  50  40  100  100  100  100  100  100  100  100
  6:  50  40  20  40  30  50  10  30  100  100  100  100  100  100  100  100
  7:  40  50  30  50  20  40  30  10  100  100  100  100  100  100  100  100
  8:  100  100  100  100  100  100  100  100  10  20  40  30  20  30  50  40
  9:  100  100  100  100  100  100  100  100  20  10  30  40  50  20  40  50
 10:  100  100  100  100  100  100  100  100  40  30  10  20  40  50  20  30
 11:  100  100  100  100  100  100  100  100  30  40  20  10  30  20  40  50
 12:  100  100  100  100  100  100  100  100  20  50  40  30  10  50  30  20
 13:  100  100  100  100  100  100  100  100  30  20  50  20  50  10  50  40
 14:  100  100  100  100  100  100  100  100  50  40  20  40  30  50  10  30
 15:  100  100  100  100  100  100  100  100  40  50  30  50  20  40  30  10

查看网卡对应的中断绑定。

tips:系统会有一个中断平衡服务,系统会根据环境负载情况自行分配cpu到各个中断,所以这里为了强行把中断平均的绑定到各个cpu,需要先停止该服务:

[root@localhost ~]# cat /proc/interrupts | grep enp11s0f3 | cut -d: -f1 | while read i; do echo -ne irq":$i\t bind_cpu: "; cat /proc/irq/$i/smp_affinity_list; done | sort -n -t' ' -k3
irq:654  bind_cpu: 0
irq:653  bind_cpu: 1
irq:656  bind_cpu: 2
irq:657  bind_cpu: 2
irq:659  bind_cpu: 3
irq:655  bind_cpu: 4
irq:652  bind_cpu: 5
irq:658  bind_cpu: 6

[root@localhost ~]# systemctl  stop irqbalance.service

手动修改网卡对应的cpu亲和性
echo 0 > /proc/irq/654/smp_affinity_list
echo 1 > /proc/irq/653/smp_affinity_list
echo 2 > /proc/irq/656/smp_affinity_list
echo 3 > /proc/irq/657/smp_affinity_list
echo 4 > /proc/irq/659/smp_affinity_list
echo 5 > /proc/irq/655/smp_affinity_list
echo 6 > /proc/irq/652/smp_affinity_list
echo 7 > /proc/irq/658/smp_affinity_list

调整后继续测试RFC2544,又有了一定的性能提升。

图片

通过以上三种优化方式后,性能提升了95%,很显然,如果发生在客户现场,那绝对是值得高兴的一件事。

图片

4 其他优化项

除了以上几种方式外,还有一些日常的调优手段,大家可以试一下针对不同的场景,选择不同的方式。

1、打开tso和gso

利用网卡硬件进行分片或者推迟协议栈分片,以此来降低cpu负载,提升整体性能。

2、调整TLP

调整pcie总线每次数据传输的最大值,根据实际情况调整,bios中可以修改。

3、调整聚合中断

合并中断,减少中断处理次数,根据实际情况调整。

4、应用程序cpu绑定

如果测试是使用类似netperf,qperf的工具,可以使用taskset命令绑定该测试进程到指定cpu。

总结

随着性能测试的发展以及对测试工程师的要求提高,优化性能已经不再是单纯开发同学所要做的事情,使用合适的测试方法和测试工具进行测试,收集数据找到性能瓶颈,并能进行一系列的调优,这才是性能测试团队做的真正有意义以及有价值的事情。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取 【保100%免费】
在这里插入图片描述

软件测试面试文档

我们学习必然是为了找到 高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/400365.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SICTF Round#3 の WP

Misc 签到 SICTF{1f4ce05a-0fed-42dc-9510-6e76dff8ff53} Crypto [签到]Vigenere 附件内容: Gn taj xirly gf Fxgjuakd, oe igywnd mt tegbs mnrxxlrivywd sngearbsw wakksre. Bs kpimj gf tank, it bx gur bslenmngn th jfdetagur mt ceei yze Ugnled Lystel t…

书生·浦语大模型实战营-第六课笔记

1.评测追魂夺命三连问 2.主流大拿有话说-评测框架 3.友商最棒儿子最亲,好瓜都是王婆的 4.真枪实弹上战场 为了给平台省点电,我用了自家的电和自家的电脑进行评测。评测的模型也是之前在自己电脑上跑了3轮花费30多个小时的第四课作业微调的法律大模型。s…

智能测径仪 针对设备自身抖动都做了哪些创新加强设计

关键字:测径仪外壳设计,测径仪内部结构,外壳刚性振动,产线共振现象,镜头纯手工擦拭清洗,测径仪智能防抖算法,测径仪多重防抖技术,测径仪防抖技术,测径仪自身防抖, 在生产过程中,被测物不可避免的会发生抖动,测径仪本身也会产生抖动,只是抖动幅…

数据库专题——分库分表

一. 分库分表介绍二. 分库分表实践 一. 分库分表介绍 1.1 分库分表解决了什么问题 先说分库: 《高性能MySQL》中提到了两种数据库扩展方式:垂直扩展和水平扩展。前者意味着买更多性能强悍的硬件,但是总会达到扩展的天花板,且成本…

数字信号处理:傅里叶分析

本文主要参考视频如下: 数字信号处理9-1_线性时不变系统对复指数信号的响应_哔哩哔哩_bilibili 傅里叶分析的主要研究内容如下所示: 注意,计算机中使用的离散傅里叶变换并不是离散时间傅里叶变换; 前四种都是理论上的变换方式&…

mysql 2-21

约束的分类 添加约束 查看表约束 非空约束 唯一性约束 复合的唯一性约束 只要有一个字段不重复,就可以添加成功 主键约束 自增列 mysql 8.0具有持久化,重启服务器会继续自增 外键约束 创建外键 关联必须有唯一性约束,或者是主键 约束等级 …

创意办公:专注 ONLYOFFICE,探索办公新境界

一.ONLYOFFICE 介绍 ONLYOFFICE 是一个基于 Web 的办公套件,提供了文档处理、电子表格和演示文稿编辑等功能。它被设计为一个协作工具,支持多人实时协作编辑文档,并且可以在本地部署或者作为云服务使用。 二.ONLYOFFICE 特点和功能 以下是 …

Eclipse的Java Project的入口main函数

在使用Eclipse创建java project项目的时候,一个项目里面通常只有一个main,那么一个项目里面是否可以有多个main函数呢?其实可以的,但是运行java application的时候要选择执行哪个main函数。 下面举个例子: 1、创建一个…

Unity3d Shader篇(七)— 纹理采样

文章目录 前言一、什么是纹理采样?1. 纹理采样的工作原理2. 纹理采样的优缺点优点缺点 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函数5. 片元着色器函数 三、效果四、总结使用场景 前言 纹理采样是一种常用的图形学技…

线性代数:向量组的秩

目录 回顾“秩” 及 向量组线性表示 相关特性 向量组的秩 例1 例2 矩阵的“秩” 及 向量组线性表示 相关特性 向量组的秩 例1 例2

详解动态内存管理!

目录 ​编辑 1.为什么要用动态内存分配 2.malloc和free 2.1 malloc 2.2 free 3.calloc和realloc 3.1 calloc 3.2 realloc 4.常见的动态内存的错误 4.1 对NULL的解引用操作 4.2 对动态内存开辟空间的越界访问 4.3 对非动态内存开辟空间用free释放 4.4 使用free释放动…

⭐北邮复试刷题106. 从中序与后序遍历序列构造二叉树__递归分治 (力扣每日一题)

106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7], postor…

RLT8762D---WDG 模块

0 Preface/Foreword 1 working mechanism 1.1 看门狗配置 1.2 喂狗定时器驱动 喂狗定时器回调函数: 1.3 初始化定时器 1.3.1 启动喂狗定时器 1.3.2 使能ROM看门狗 1.4 喂狗 定时器发送喂狗消息。 WDG_Restart()用于喂狗,comment out之后&#xff0…

Stable Diffusion 绘画入门教程(webui)-ControlNet(姿态预处理器openpose)

本片文章接着上篇文章ControlNet介绍他的控制类型,本篇介绍的预处理器为openpose 预处理器:openpose 模型:control_v11p_sd15_openpose 没下载模型的看上篇文章去下载一下哦,不然用不了 文章目录 一、干什么用的二、详细用法1、选…

YOLO-World技术小结

infopaperhttps://arxiv.org/abs/2401.17270codehttps://github.com/AILab-CVC/YOLO-Worldorg腾讯demohttps://huggingface.co/spaces/stevengrove/YOLO-World个人博客位置http://www.myhz0606.com/article/yolo_world 1 Motivation 这篇文章从计算效率的角度解决开集目标检测…

ping 8.8.8.8和ping www.baidu.com都OK,但是打不开网页

ping 8.8.8.8和ping www.baidu.com都OK,但是打不开网页 打开设置 -> 网络 找到IPV4, DNS栏输入 8.8.8.8 , apply 设置里界面变成这样 然后网页就能加载了

开源软件的利弊

目录 开源软件 优势 免费 透明 可更改 可协作 影响力 坏处 安全隐患 良莠不齐 学习成本 持续性问题 未知风险 开源软件 开源软件是一种基于开放协作和共享的软件开发模式,其利弊对于软件产业和社会发展具有重要意义 优势 免费 谁能拒绝不要钱的东西…

C# redis 菜鸟级别 订阅与频道,发送消息

// 建立 Redis 连接 发送部分代码 using StackExchange.Redis; ConnectionMultiplexer redis ConnectionMultiplexer.Connect("127.0.0.1:6379,password123456"); // 获取发布者 ISubscriber publisher redis.GetSubscriber(); // 发布消息到指定频道 string c…

day4 2/21

1>使用多线程完成两个文件的拷贝&#xff0c;第一个线程拷贝前一半&#xff0c;第二个线程拷贝后一半&#xff0c;主线程回收两个线程的资源 #include<myhead.h> typedef struct Inof {const char*srcfile;const char*destfile;int start;int len; }inof;int do_len…

洗地机哪一款好用?洗地机热门品牌测评

虽然说现在市面上有很多洗地机牌子不断推陈出新&#xff0c;但是洗地机的功能使用总是不分你我&#xff0c;因为不管产品怎么变&#xff0c;一款优秀的洗地机都必须要具备良好的操控性能以及优秀的续航水平&#xff0c;另外在此基础上&#xff0c;继续考察其贴边清洁效果和杀菌…