全栈软件测试工程师宝典连载(10)(下)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 全栈软件测试工程师宝典连载(10)(下)
③  磁盘top工具

iotop命令是一个用来监视磁盘I/O使用状况的top类工具。使用iotop需要在unbutu下另行安装,命令为apt-get install iotop。图3-31iotop的执行情况。

image.png

3-31  iotop命令


扩展阅读:磁盘分类

按照存储介质来分,磁盘可以分为机械磁盘与固态磁盘。

机械磁盘(Hard Disk  DriverHDD):机械磁盘是根据磁头寻道和盘片旋转而获取数据的,最小读写单位是扇区,每个扇区为512B

固态磁盘(Solid State  DiskSSD):固态磁盘采取“先擦除再写入”的原则,速度比机械抽盘快,但是会产生大量的垃圾。最小读写单位是页,通常大小是4KB8KB等。

不管是机械磁盘还是固态磁盘,离散的数据读写比性能连续的要低。

按照接口来分类,可以把硬盘分为。

IDEIntegrated Drive  Electronics):前缀为hd

SCSISmall Computer  System Interface):前缀为sd

SASSerial Attached  SCSI)。

SATASerial ATA):前缀为sd

FCFibre Channel)。

多块同类型的磁盘,可以按照 abc…的字母顺序来编号/dev/sda/dev/sdb。还可以划分为不同的逻辑分区,每个分区再用数字进行编号。比如/dev/sda,可以分成/dev/sda1/dev/sda2 2个分区。

另外也可以把多块磁盘组合成一个逻辑磁盘,构成冗余独立磁盘阵列,也就是 RAIDRedundant Array  of Independent Disks),从而可以提高数据访问的性能,并且增强数据存储的可靠性。具体细节可以参考3.2.1-3里面的介绍。


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.5 sy,  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,        0used.  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 3785 jerry  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,   0 stopped,  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.90   0.00  1.16 119.30   0.00  3.56  97.20


磁盘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' toclear the 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 whereName= '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

表示查询扫描的行数。


6)小结

本节所涉及的概念有文件储结构(包括索引节点和目录项)、虚拟文件系统 VFSLinux I/O分类和磁盘的性能指标。涉及到的命令有stat dfiostat cat /proc/slabinfoslabtoppidstatiotop


—————————————————————————————————


软件安全测试

https://study.163.com/course/courseMain.htm?courseId=1209779852&share=2&shareId=480000002205486

接口自动化测试

https://study.163.com/course/courseMain.htm?courseId=1209794815&share=2&shareId=480000002205486

DevOps 和Jenkins之DevOps

https://study.163.com/course/courseMain.htm?courseId=1209817844&share=2&shareId=480000002205486

DevOps与Jenkins 2.0之Jenkins

https://study.163.com/course/courseMain.htm?courseId=1209819843&share=2&shareId=480000002205486

Selenium自动化测试

https://study.163.com/course/courseMain.htm?courseId=1209835807&share=2&shareId=480000002205486

性能测试第1季:性能测试基础知识

https://study.163.com/course/courseMain.htm?courseId=1209852815&share=2&shareId=480000002205486

性能测试第2季:LoadRunner12使用

https://study.163.com/course/courseMain.htm?courseId=1209980013&share=2&shareId=480000002205486

性能测试第3季:JMeter工具使用

https://study.163.com/course/courseMain.htm?courseId=1209903814&share=2&shareId=480000002205486

性能测试第4季:监控与调优

https://study.163.com/course/courseMain.htm?courseId=1209959801&share=2&shareId=480000002205486

Django入门

https://study.163.com/course/courseMain.htm?courseId=1210020806&share=2&shareId=480000002205486

啄木鸟顾老师漫谈软件测试

https://study.163.com/course/courseMain.htm?courseId=1209958326&share=2&shareId=480000002205486

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6月前
|
机器学习/深度学习 人工智能 算法
新时代软件测试工程师的挑战与机遇
随着科技的飞速发展,软件测试在当今信息化社会中扮演着举足轻重的角色。本文将探讨新时代软件测试工程师所面临的挑战和机遇,分析其发展趋势及应对策略,旨在为广大软件测试从业人员提供启示和指导。
|
测试技术 数据库
腾讯游戏测试工程师的经验心得分享
腾讯游戏测试工程师的经验心得分享
416 0
|
21天前
|
编解码 安全 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(10-2):保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali——Liinux-Debian:就怕你学成黑客啦!)作者——LJS
保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali以及常见的报错及对应解决方案、常用Kali功能简便化以及详解如何具体实现
|
1月前
|
Java 测试技术 程序员
「测试线排查的一些经验-上篇」&& 后端工程师
「测试线排查的一些经验-上篇」&& 后端工程师
16 1
|
21天前
|
人工智能 安全 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(4-2):渗透测试行业术语扫盲完结:就怕你学成黑客啦!)作者——LJS
网络空间安全之一个WH的超前沿全栈技术深入学习之路(4-2):渗透测试行业术语扫盲完结:就怕你学成黑客啦!)作者——LJS
|
21天前
|
安全 大数据 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(3-2):渗透测试行业术语扫盲)作者——LJS
网络空间安全之一个WH的超前沿全栈技术深入学习之路(3-2):渗透测试行业术语扫盲)作者——LJS
|
21天前
|
SQL 安全 网络协议
网络空间安全之一个WH的超前沿全栈技术深入学习之路(1-2):渗透测试行业术语扫盲)作者——LJS
网络空间安全之一个WH的超前沿全栈技术深入学习之路(1-2):渗透测试行业术语扫盲)作者——LJS
|
3月前
|
算法
测试工程师的技能升级:LeetCode算法挑战与职业成长
这篇文章通过作者亲身体验LeetCode算法题的过程,探讨了测试工程师学习算法的重要性,并强调了算法技能对于测试职业成长的必要性。
70 1
测试工程师的技能升级:LeetCode算法挑战与职业成长
|
3月前
|
运维 测试技术
测试与开发问题之测试开发工程师与软件开发工程师和测试工程师如何区别
测试与开发问题之测试开发工程师与软件开发工程师和测试工程师如何区别
|
3月前
|
监控 安全 测试技术
测试与开发问题之为什么测试开发工程师需要有安全生产意识,文档编写能力对于测试开发工程师的重要性如何理解
测试与开发问题之为什么测试开发工程师需要有安全生产意识,文档编写能力对于测试开发工程师的重要性如何理解