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

杀鸡焉用牛刀  金牌会员 | 2025-2-14 02:06:41 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 889|帖子 889|积分 2667

当下云计算、大数据盛行的配景下,大并发和大吞吐量的需求已经是摆在企业面前的问题了,此中网络的性能要求尤为关键,除了软件本身须要考虑到性能方面的要求,一些硬件上面的优化也是必不可少的。
作为一名测试工作者,对于性能测试的问题肯定不会生疏,但是测试不但仅是执行和收集数据,更多的应该是分析问题、找到性能瓶颈以及一些优化工作。
究竟在客户现场测试性能的时候,能够通过一些系统层面的调优,提升软件的性能,那对项目无疑是一件锦上添花的事。
指标

不管你做何种性能测试,指标是绕不外去的事,指标是量化性能测试的紧张依据。衡量某个性能的指标有很多,比如衡量数据库性能通常用TPS、QPS和延时,衡量io性能通常用iops、吞吐量和延时,衡量网络的性能指标也有很多,在业界有一个RFC2544的标准,参考链接:https://www.rfc-editor.org/rfc/rfc2544。
这里稍微表明一下几个指标:
背靠背测试:在一段时间内,以合法的最小帧隔断在传输介质上连续发送固定长度的包而不引起丢包时的数据量。
丢包率测试:在路由器稳定负载状态下,由于缺乏资源而不能被转发的帧占所有该被转发的帧的百分比。
时延测试:输入帧的末了一位到达输入端口到输出帧的第一位出如今输出端看的时间隔断。
吞吐量测试:没有丢包情况下能够转发的最大速率。
通常客户对于吞吐量和时延的指标是比较关心的,吞吐量反应了系统的并发的处理本领,时延反应了整体业务的相应时间。
测试预备

本文以网卡中的战斗机intel X710为测试对象,进行小包的吞吐量测试。
Tips:通常大包的测试可以达到线速,小包则很难线速,相同mtu下,包越小单元时间内cpu处理的包数越多,cpu的压力越大。
1 测试拓扑

在被测装备上插入X710网卡,利用网卡的2个网口创建linux bridge,通过测试仪发送吸收数据包:

  1. [root@localhost ~]# brctl addbr test
  2. [root@localhost ~]# brctl addif test enp11s0f2 enp11s0f3
  3. [root@localhost ~]# ip link set test up
  4. [root@localhost ~]# brctl show
  5. bridge name     bridge id               STP enabled     interfaces
  6. test            8000.6cb311618c30       no              enp11s0f2
  7.                                                         enp11s0f3
  8. 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:
  1. [root@localhost ~]# ethtool -l enp11s0f2
  2. Channel parameters for enp11s0f2:
  3. Pre-set maximums:
  4. RX:             0
  5. TX:             0
  6. Other:          1
  7. Combined:       128
  8. Current hardware settings:
  9. RX:             0
  10. TX:             0
  11. Other:          1
  12. Combined:       8
复制代码
因为数据包会根据hash来进入到多个收包队列,因此发送数据包的时候,可以选择源ip变革的流来确保利用了网卡的多队列,可以查看网卡的队列计数。
  1. [root@localhost ~]# ethtool -S enp11s0f3
  2. NIC statistics:
  3.      rx_packets: 4111490
  4.      tx_packets: 4111490
  5.      rx_bytes: 509824504
  6.      tx_bytes: 509824504
  7.      rx_errors: 0
  8.      tx_errors: 0
  9.      rx_dropped: 0
  10.      tx_dropped: 0
  11.      collisions: 0
  12.      rx_length_errors: 0
  13.      rx_crc_errors: 0
  14.      rx_unicast: 4111486
  15.      tx_unicast: 4111486
  16.    ...
  17.      
  18.      rx-2.rx_bytes: 63718020
  19.      tx-3.tx_packets: 513838
  20.      tx-3.tx_bytes: 63715912
  21.      rx-3.rx_packets: 514847
  22.      rx-3.rx_bytes: 63841028
  23.      tx-4.tx_packets: 1027488
  24.      tx-4.tx_bytes: 127408512
  25.      rx-4.rx_packets: 513648
  26.      rx-4.rx_bytes: 63692352
  27.      tx-5.tx_packets: 52670
  28.      tx-5.tx_bytes: 6530824
  29.      rx-5.rx_packets: 514388
  30.      rx-5.rx_bytes: 63784112
  31.      tx-6.tx_packets: 1029202
  32.      tx-6.tx_bytes: 127621048
  33.      rx-6.rx_packets: 514742
  34.      rx-6.rx_bytes: 63828008
  35.      tx-7.tx_packets: 460901
  36.      tx-7.tx_bytes: 57151724
  37.      rx-7.rx_packets: 512859
复制代码
修改完队列后再次利用RFC2544进行测试,性能比单队列提升了57%。

2 调整队列深度

除了调整网卡的队列数外,也可以修改网卡的队列深度,但是队列深度不是越大越好,具体照旧须要看实际的应用场景。对于延时要求高的场景并不得当修改太大的队列深度。
查看当前队列深度为512,修改为1024再次测试:
  1. [root@localhost ~]# ethtool -g enp11s0f2
  2. Ring parameters for enp11s0f2:
  3. Pre-set maximums:
  4. RX:             4096
  5. RX Mini:        0
  6. RX Jumbo:       0
  7. TX:             4096
  8. Current hardware settings:
  9. RX:             512
  10. RX Mini:        0
  11. RX Jumbo:       0
  12. TX:             512
复制代码
修改tx和rx队列深度为1024:
  1. [root@localhost ~]# ethtool -G enp11s0f3 tx  1024
  2. [root@localhost ~]# ethtool -G enp11s0f3 rx  1024
  3. [root@localhost ~]# ethtool -g enp11s0f2
  4. Ring parameters for enp11s0f2:
  5. Pre-set maximums:
  6. RX:             4096
  7. RX Mini:        0
  8. RX Jumbo:       0
  9. TX:             4096
  10. Current hardware settings:
  11. RX:             1024
  12. RX Mini:        0
  13. RX Jumbo:       0
  14. TX:             1024
复制代码
再次进行RFC2544测试,这次也是有相应的提升。

3 中断绑定

网卡收包后,内核会触发软中断程序,假如此时运行中断的cpu和网卡不在一个numa上,则性能会低落。
查看网卡pci插槽对应numa node:
  1. [root@localhost ~]# cat /sys/bus/pci/devices/0000\:0b\:00.3/numa_node
  2. 0
  3. 这里对应的numa node为0
  4. 飞腾S2500有16个numa node,node8-15和node0所在的物理cpu不同,如果中断跑在上面性能会更加低
  5. [root@localhost ~]# numactl -H
  6. available: 16 nodes (0-15)
  7. node 0 cpus: 0 1 2 3 4 5 6 7
  8. node 0 size: 65009 MB
  9. node 0 free: 46721 MB
  10. node 1 cpus: 8 9 10 11 12 13 14 15
  11. node 1 size: 0 MB
  12. node 1 free: 0 MB
  13. node 2 cpus: 16 17 18 19 20 21 22 23
  14. node 2 size: 0 MB
  15. node 2 free: 0 MB
  16. node 3 cpus: 24 25 26 27 28 29 30 31
  17. node 3 size: 0 MB
  18. node 3 free: 0 MB
  19. node 4 cpus: 32 33 34 35 36 37 38 39
  20. node 4 size: 0 MB
  21. node 4 free: 0 MB
  22. node 5 cpus: 40 41 42 43 44 45 46 47
  23. node 5 size: 0 MB
  24. node 5 free: 0 MB
  25. node 6 cpus: 48 49 50 51 52 53 54 55
  26. node 6 size: 65466 MB
  27. node 6 free: 64663 MB
  28. node 7 cpus: 56 57 58 59 60 61 62 63
  29. node 7 size: 0 MB
  30. node 7 free: 0 MB
  31. node 8 cpus: 64 65 66 67 68 69 70 71
  32. node 8 size: 65402 MB
  33. node 8 free: 63691 MB
  34. node 9 cpus: 72 73 74 75 76 77 78 79
  35. node 9 size: 0 MB
  36. node 9 free: 0 MB
  37. node 10 cpus: 80 81 82 83 84 85 86 87
  38. node 10 size: 0 MB
  39. node 10 free: 0 MB
  40. node 11 cpus: 88 89 90 91 92 93 94 95
  41. node 11 size: 0 MB
  42. node 11 free: 0 MB
  43. node 12 cpus: 96 97 98 99 100 101 102 103
  44. node 12 size: 0 MB
  45. node 12 free: 0 MB
  46. node 13 cpus: 104 105 106 107 108 109 110 111
  47. node 13 size: 0 MB
  48. node 13 free: 0 MB
  49. node 14 cpus: 112 113 114 115 116 117 118 119
  50. node 14 size: 64358 MB
  51. node 14 free: 63455 MB
  52. node 15 cpus: 120 121 122 123 124 125 126 127
  53. node 15 size: 0 MB
  54. node 15 free: 0 MB
  55. node distances:
  56. node   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
  57.   0:  10  20  40  30  20  30  50  40  100  100  100  100  100  100  100  100
  58.   1:  20  10  30  40  50  20  40  50  100  100  100  100  100  100  100  100
  59.   2:  40  30  10  20  40  50  20  30  100  100  100  100  100  100  100  100
  60.   3:  30  40  20  10  30  20  40  50  100  100  100  100  100  100  100  100
  61.   4:  20  50  40  30  10  50  30  20  100  100  100  100  100  100  100  100
  62.   5:  30  20  50  20  50  10  50  40  100  100  100  100  100  100  100  100
  63.   6:  50  40  20  40  30  50  10  30  100  100  100  100  100  100  100  100
  64.   7:  40  50  30  50  20  40  30  10  100  100  100  100  100  100  100  100
  65.   8:  100  100  100  100  100  100  100  100  10  20  40  30  20  30  50  40
  66.   9:  100  100  100  100  100  100  100  100  20  10  30  40  50  20  40  50
  67. 10:  100  100  100  100  100  100  100  100  40  30  10  20  40  50  20  30
  68. 11:  100  100  100  100  100  100  100  100  30  40  20  10  30  20  40  50
  69. 12:  100  100  100  100  100  100  100  100  20  50  40  30  10  50  30  20
  70. 13:  100  100  100  100  100  100  100  100  30  20  50  20  50  10  50  40
  71. 14:  100  100  100  100  100  100  100  100  50  40  20  40  30  50  10  30
  72. 15:  100  100  100  100  100  100  100  100  40  50  30  50  20  40  30  10
复制代码
查看网卡对应的中断绑定。
tips:系统会有一个中断均衡服务,系统会根据情况负载情况自行分配cpu到各个中断,以是这里为了强行把中断均匀的绑定到各个cpu,须要先制止该服务:
  1. [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
  2. irq:654  bind_cpu: 0
  3. irq:653  bind_cpu: 1
  4. irq:656  bind_cpu: 2
  5. irq:657  bind_cpu: 2
  6. irq:659  bind_cpu: 3
  7. irq:655  bind_cpu: 4
  8. irq:652  bind_cpu: 5
  9. irq:658  bind_cpu: 6
  10. [root@localhost ~]# systemctl  stop irqbalance.service
  11. 手动修改网卡对应的cpu亲和性
  12. echo 0 > /proc/irq/654/smp_affinity_list
  13. echo 1 > /proc/irq/653/smp_affinity_list
  14. echo 2 > /proc/irq/656/smp_affinity_list
  15. echo 3 > /proc/irq/657/smp_affinity_list
  16. echo 4 > /proc/irq/659/smp_affinity_list
  17. echo 5 > /proc/irq/655/smp_affinity_list
  18. echo 6 > /proc/irq/652/smp_affinity_list
  19. 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%免费】

这些资料,对于【软件测试】的朋友来说应该是最全面最完备的备战堆栈,这个堆栈也陪伴上万个测试工程师们走过最艰巨的路程,希望也能帮助到你!
  1. 软件测试技术交流群社:746506216(里面还有工作内推机会,毕竟我们是关系社会。)
复制代码
软件测试口试文档

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

口试文档获取方式:




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

杀鸡焉用牛刀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表