软件性能测试(连载14)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 软件性能测试(连载14)
5)案例
案例3-13:狂打日志造成的性能下降


# top 
top - 09:29:06 up 3 day,  1:39,  4users,  load average: 2.48, 1.12, 0.47 
Tasks: 130 total,  2 running,  74 sleeping,   0 stopped,  0 zombie 
%Cpu0  :  0.7 us, 6.5sy,  0.0 ni,  0.7 id, 93.8 wa,  0.0 hi, 0.0 si,  0.0 st 
KiB Mem : 8169308 total,   747684 free,   741336 used, 6680288 buff/cache 
KiB Swap:       0 total,        0 free,        0 used. 7113124 avail Mem
PID    USER   PR  NI    VIRT    RES    SHR   S   %CPU    %MEM     TIME+ COMMAND 
16520  jerry   20 0     656108  355740 5236 R    7.2      4.4      0:12.56 python3


由于内核CPUsy 6.5%并不是很高,而等待I/OCPU时间为93.8%是比较高的,另外在进程信息中心可以看到Python3的进程CPU占有率为7.2%,也是比较高的,它的PID16520。可以定位在I/O上出现了瓶颈,可能是Python3引起的。于是用iostat来分析。

# iostat -x -d 1 
Device r/s   w/s  rkB/s wkB/s   rrqm/s  wrqm/s %rrqm %wrqm r_await w_await aqu-szrareq-sz wareq-sz  svctm  %util 
loop0   0.00 0.00    0.00   0.00 0.00  0.00  0.00 0.00  0.00  0.00 0.00  0.00  0.00 0.00     0.00 
sdb     0.00 0.00    0.00   0.00   0.00 0.00 0.00  0.00   0.000.00  0.00  0.00 0.00  0.00    0.00 
sda     0.00  67.00   0.00   32768.00    0.00        0.00       0.00 0.00   0.00  9320.58 1236.57 0.00        512.00     15.50 99.18


可以看到磁盘sdaI/O使用率已经高达99.18%,已经接近了I/O的饱和状态。每秒写磁盘请求数是67.00,写数据大小是32768.0032 MB),写请求的响应时间为(9320.58 ms),也就是9s,而请求队列长度则达到了1236.57。进一步确认了性能瓶颈在I/O。接下来用pidstat来分析。


# pidstat -d 1 
Linux 4.15.0-66-generic (ubuntu) 12/10/2019_x86_64_(4 CPU)
09:30:06 AM  UID    PID     kB_rd/s  kB_wr/s kB_ccwr/s iodelay  Command
09:30:07 AM  0      759     11.21     0.00      0.00       0       polkitd
09:30:07 AM  0      16520   0.00      58100.00 0.00       96       python3
09:30:07 AM  1000   2044   1465.42   0.00      0.00       0       gnome-shell


可以发现PID16520Python3进程正以58100.00 kB/s的速度往系统中写数据。使用strace -p 查询这个进程的详情。


# strace -p 116520 
strace: Process 16520 attached 
...
mmap(NULL, 419430458, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x8d5a96754ab0
mmap(NULL, 419430458, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x8d5a8583a5de
write(5, "2019-12-05 09:30:08,709 - __main"..., 419430458 ) = 419430458
munmap(0x8d5a8583a5de, 419430458)       = 0
write(5, "\n", 1)                       = 1
munmap(0x8d5a8583b5de, 419430458)       = 0
close(3)                                = 0
stat("/tmp/mylog.txt.3",{st_mode=S_IFREG|0644, st_size=96384178, ...}) = 0


进程向文件描述符编号为5号的文件中,写入了400MB的数据,该5号文件为: /tmp/logtest.txt.3


lsof -p 116520
COMMAND PID  USER    FD  TYPE DEVICE SIZE/OFF          NODENAME
python3  3785jerry  cwd  DIR   8,1    4096 554601      /home/ebusiness
python3 3785 jerry  5w  REG    8,1   117944320 303    /tmp/mylog.txt.3


这里的5W表示5号文件以写的形式打开。这样就可以分析Python文件来定位问题了。


案例3-14:数据库没有建立有效的索引造成的性能下降
# top
top - 22:06:25 up 9:22,  1 user,  load average: 4.94, 2.05, 1.09
Tasks: 316 total,  1 running, 236 sleeping,   0stopped,   0 zombie
%Cpu0  :  0.7 us, 1.3 sy,  0.0 ni, 35.9 id, 74.4 wa,  0.0 hi, 0.0 si,  0.0 st
%Cpu1  :  0.3 us, 0.7 sy,  0.0 ni, 73.7 id, 20.8 wa,  0.0 hi, 0.0 si,  0.0 st
KiB Mem : 4312648 total,   161796 free,  1820392 used, 2330460 buff/cache
KiB Swap:  969960 total,   963816 free,     6144 used. 2182356 avail Mem
PID   USER    PR NI VIRT     RES     SHR   S  %CPU   %MEM    TIME+    COMMAND
7458 jerry   20  0  833852  57968   13176S   1.7   0.7     0:12.40   mysqld                                                                                                        
3785 jerry   20  0  6171324 100048  10624 S 103.6  2.3     45:11.62  python3                                                                                                                               
1915 jerry   20  0  469516  71432   26120 S  24.1  1.7     3:30.36   Xorg


    CPU0CPU1的等待I/OCPU时间分别为74.4%20.8%,是比较高的。同样用iostat分析。


iostat -d -x 1
Device r/s       w/s     rkB/s         wkB/s rrqm/s  wrqm/s  %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm %util
sda   273.00   0.00  43963.00  0.00   0.00  0.00  0.00  0.00  7.


磁盘sdaI/O使用率高达97.20%。每秒读磁盘请求数是273.00,读数据的大小是43963.00。再利用pidstat分析。

#pidstat -w 1
22:06:26   UID   PID    kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
22:06:26   999   27458  43963.00  0.00     0.00         0        mysqld
22:06:26   0     27617  4.00     4.00     0.00           3       python3


可以得知数据库mysql读操作造成的性能瓶颈。需要进入数据库内部来分析具体原因。

# mysql
Type 'help;' or '\h' for help. Type '\c' to clearthe current input statement.
mysql> showfull processlist;
+----+------+-----------------+------+---------+------+--------------+-----------------------------------------------------+
| Id | User | Host            | db   | Command | Time | State        | Info                                               |
+----+------+-----------------+------+---------+------+--------------+-----------------------------------------------------+
| 15 | root | localhost       | sec | Query   |    0| init         | show fullprocesslist                              |
| 16 | root | 127.0.0.1:42262| sec | Query   |    1| Sending data | select * from website where Name= '3testing' |
+----+------+-----------------+------+---------+------+--------------+-----------------------------------------------------+
•db。


表示数据库的名字。

Command

表示SQL类型(QueryUpdateInsertDelete)。

Time

表示执行时长。

State

表示状态。

Info

则包含了完整的SQL语句。


接下来切换到数据库sec中,执行explain命令,分析查询语句。


mysql> use sec
mysql> explain elect * from website where Name='3testing';
+----+-------------+----------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+----------+------+---------------+------+---------+------+-------+-------------+
|  1 | SIMPLE     | website | ALL  | NULL          | NULL | NULL    | NULL | 15000 | Using where |
+----+-------------+----------+------+---------------+------+---------+------+-------+-------------+
1 row in set (0.00 sec)


从而发现typeALL,即全表查询,即没有建立索引且牵扯到15000个记录,这里各项含义为。


select_type

表示查询类型,SIMPLE表示此查询不包括UNION查询或者子查询。

table

表示数据表的名字。

type

表示查询类型, ALL表示全表查询,索引查询为index类型。

possible_keys

表示可能选用的索引,这里NULL表示没有索引。

key

表示索引关键字。

rows

表示查询扫描的行数。





相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
相关文章
|
3天前
|
XML 数据管理 测试技术
深入探索软件自动化测试框架的设计与实现
【4月更文挑战第26天】 随着软件开发周期不断缩短,传统的手动测试方法已难以满足快速迭代的需求。本文聚焦于自动化测试框架的构建与优化,旨在提供一种高效、可维护且可扩展的软件测试解决方案。文章从自动化测试的必要性出发,详细阐述了自动化测试框架设计的核心要素,包括模块化设计、数据驱动测试以及关键词驱动测试等概念。同时,结合实例分析了如何利用流行的测试工具进行框架搭建,并提出了针对常见问题的创新解决方法。最后,通过案例研究展示了该框架在实际项目中的应用效果和潜在改进空间。
|
3天前
|
设计模式 测试技术 持续交付
深入白盒测试:提升软件质量与性能的关键策略
【4月更文挑战第20天】 在软件开发的复杂世界中,确保产品的质量和性能始终是至关重要的任务。白盒测试,作为软件测试领域的重要分支,提供了对程序内部结构和逻辑的深入分析手段。本文将探讨如何通过有效的白盒测试策略来优化软件性能,减少缺陷,并最终提高用户满意度。通过剖析代码检查、单元测试、集成测试等白盒测试技术,我们将了解这些方法如何揭示潜在的问题点,并为改进提供方向。
|
3天前
|
设计模式 前端开发 测试技术
软件质量的守门人——接口测试
接口作为API,是后端预定义的函数,用于系统间通信和数据交换。接口测试验证不同组件间的交互,确保其准确、可靠。常见应用场景包括集成测试、版本迭代测试、性能测试、安全测试和错误场景测试。随着服务端复杂性的增加,传统测试方法面临挑战,因此引入分层测试(如马丁福勒的测试金字塔模型)和自动化测试,以降低成本并提高效率。接口测试成为确保后端服务质量的关键,学习接口测试可从理解其价值、协议、工具使用及Mock测试等方面逐步进阶。
4 1
|
3天前
|
机器学习/深度学习 人工智能 自然语言处理
深入探索软件自动化测试的未来趋势
【5月更文挑战第12天】 随着软件开发周期的不断缩短和市场需求的快速变化,传统的手动测试方法已经难以满足现代软件质量保证的需求。自动化测试作为一种高效、可靠的解决方案,正逐渐成为行业标配。本文将深入探讨自动化测试的最新发展,分析其在持续集成/持续部署(CI/CD)环境中的作用,以及人工智能(AI)如何重塑测试实践。同时,我们还将展望自动化测试工具和技术的未来演进路径。
|
3天前
|
机器人 测试技术 语音技术
LabVIEW使用软件定义进行汽车电子测试
LabVIEW使用软件定义进行汽车电子测试
12 0
|
3天前
|
程序员 测试技术
程序员难以一次性写好代码并持续修复Bug,主要源于软件的高复杂性、需求不确定性、测试局限性和技术能力限制。
【5月更文挑战第11天】程序员难以一次性写好代码并持续修复Bug,主要源于软件的高复杂性、需求不确定性、测试局限性和技术能力限制。复杂的系统易产生意外问题,需求变化导致初始设计难完备,测试无法覆盖所有情况,而技术更新和个体能力差异也会引入错误。因此,持续调试和优化是保证软件质量的关键步骤。
16 0
|
3天前
|
人工智能 大数据 测试技术
深入探索软件自动化测试的未来
【5月更文挑战第8天】随着科技的不断发展,软件测试领域正经历着前所未有的变革。本文将深入探讨软件自动化测试的现状与未来,从人工智能、大数据和云计算等方面分析其对软件测试的影响,以及如何利用这些技术提高测试效率和质量。
|
3天前
|
机器学习/深度学习 人工智能 算法
深入探索软件自动化测试的优化策略
【5月更文挑战第4天】 随着软件开发周期的不断缩短和发布频率的增加,传统的手动测试方法已无法满足快速迭代的需求。因此,本文聚焦于自动化测试流程的优化,旨在提高测试效率和质量。文章首先回顾了自动化测试的基本概念与实施条件,随后分析了当前自动化测试面临的主要挑战,包括维护成本高、测试用例设计复杂等问题。在此基础上,提出了一系列优化策略:持续集成环境下的自动化测试、数据驱动测试、关键字驱动测试、以及基于人工智能的测试用例生成和维护等。通过案例分析和性能评估,验证了这些策略在提升测试覆盖率和减少人工干预方面的有效性。
|
3天前
|
机器学习/深度学习 敏捷开发 人工智能
探索软件自动化测试的未来趋势
【5月更文挑战第4天】 在快速发展的信息时代,软件已成为支撑现代社会运行的核心力量。随之而来的是软件测试领域面临的挑战和机遇,特别是自动化测试技术。本文将深入探讨自动化测试的最新发展,分析其对提高软件开发效率、降低维护成本的重要性,同时预测未来可能的技术趋势。通过实际案例分析和最新研究动态的梳理,旨在为读者呈现一个清晰的自动化测试技术蓝图。
|
3天前
|
测试技术 持续交付 数据安全/隐私保护
深入理解软件自动化测试中的数据驱动策略
【5月更文挑战第1天】 在软件测试领域,自动化测试已经成为提高测试效率和质量的重要手段。其中,数据驱动测试(DDT)作为一种高效实施自动化测试的策略,允许测试用例与测试数据分离,增强了测试脚本的可维护性和灵活性。本文将详细探讨数据驱动测试的核心概念、实现方式以及在实际中的应用案例,帮助读者更深入地理解如何利用数据驱动策略优化自动化测试流程。

热门文章

最新文章