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

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

3.2.3 TomCat的性能监控


      [28]TomcatApache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由ApacheSun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的ServletJSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。


      Tomcat的计数器如表3-16所示。


3-16 Tomcat的计数器

计数器

描述

JVM内存

关注GC回收频率, Full GC次数越少越好

最大线程数

线程连接数长期超过80%,需要优化

数据库连接数

活动连接数长期超过80%,需要优化数据库连接池

请求数/请求状态

线程数、线程状态,大量Blocked状态线程可以用Dump线程栈信息来分析


      Tomcat的性能监控工具Probe请参看第8.4.2节来安装和使用。


3.2.4 MySQL监控


      MySQL是最流行的关系型数据库管理系统,在Web应用方面MySQL是最好的 RDBMS(Relational DatabaseManagement System:关系数据库管理系统)应用软件之一。MySQL的关键性能指标如表3-17所示。


3-17 MySQL的计数器

计数器

分析

Threads_connected

表示当前有多少个客户连接该mysql服务器,连接数是否过多,网络是否存在问题,它是动态变化的,当达到最大连接数时,数据库系统就不能提供更多的连接数了,这时,程序还想新建连接线程,数据库系统就会拒绝,如果程序没做太多的错误处理,就会出现报错信息。

Threads_running

如果数据库超负荷,将会得到一个正在(查询的语句持续)增长的数值。这个值也可以小于预先设定的值。这个值在很短的时间内超过限定值是没问题的。若超过预设值时且5秒内没有回落,要同时监视其他的一些值。

Aborted_clients

客户端被异常中断的数值,对于一些应用程序是没有影响的,但对于另一些应用程序可能要跟踪该值,因为异常中断连接可能表明一些应用程序有问题。

Questions

每秒钟获得的查询数量,也可以是全部查询的数量。

Opened_tables

指表缓存没有命中的数量。如果该值很大,就需要增加table_cache的数值。

Select_full_join

没有主键(key)联合(join)的执行。该值可能是零。这是捕获开发错误的好方法,因为这样的查询有可能降低系统的性能。

Select_scan

执行全表搜索查询的数量。如果发现该值持续增长,说明需要优化,缺乏必要的索引或其他问题。

Slow_queries

超过该值(--long-query-time)的查询数量,或没有使用索引查询数量。对于全部查询会有小的冲突。如果该值增长,表明系统有性能问题。

Threads_created

该值一般较低。较高的值意味着需要增加thread_cache的数值,或遇到了持续增加的连接,表明存在潜在的问题


      进入MySQL后,可以通过show status;命令查看当前的计数器,使用flush status;命令清空当前的计数器。


MariaDB [sec]> show status;
+-----------------------------------------------+-------------+
| Variable_name                                      | Value   |
+-----------------------------------------------+-------------+
| Aborted_clients                                    | 0          |
| Aborted_connects                                   | 0          |
| Access_denied_errors                              | 0           |
| Acl_column_grants                                  |0           |
| Acl_database_grants                                |3           |
| Acl_function_grants                                |0           |
Uptime_since_flush_status                           | 39          |
+-----------------------------------------------+-------------+
368 rows in set (0.01 sec)


MONyog是一个优秀的MySQL监控工具,可以实时监测MYSQL服务器,查看MySQL服务器的运行状态。由于该工具非常强大,读者可以通过其他渠道进行了解。


3.2.5 JVM性能监控


      JVMJava Virtual MachineJava虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。


引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。在JDK1.7之前JVM存在年轻代(Young Generation)、年老代(Old Generationn)和持久代(Permanent Generation)。


1. 年轻代与年老代中没有被回收的数据块存储

      年轻代包括Eden区和Survivor区。Eden区有一个存储单元,Survivor区有两个存储单元:S0US1U,为了描述方便,假设Eden区做多可以存储三个数据块,Survivor区做多可以存储四个数据块。年老代也只有一个区,最多可存储四个数据块。下面来看一下年轻代与年老代中没有被回收的数据块存储。

image.png


image.png

3-37  年轻代与年老代中没有被回收的数据块存储

1)新来数据块a1a2,进入年轻代的Eden区。见图3-371)所示。

2)数据块a3 产生,进入Eden区,Eden区满了,把a1a2a3移入S0U。见图3-372)所示。

3Eden区的指针指向S0U。数据块a2a3被回收,留下了数据块a1Eden区进入了数据块b1b2。见图3-373)所示。

4)数据块b3 产生,进入Eden区,Eden区满了,把b1b2b3移入S0U。见图3-374)所示。

5Survivor区第一个存储单元满了,把a1b1b2b3S0U单元移入S1U。见图3-375)所示。

6Eden区的指针指向S1U。数据块c1c2产生,进入Eden区, S1Ub3被回收,剩下a1b1b2。见图3-376)所示。

7Eden区产生数据块c3Eden区满了,这时候由于S1Ua1被回收,而b1b2没有被回收,所以这时候只能把Eden区的c1c2Eden区移入S1U。见图3-377)所示。

8S1U中存在b1b2c1c2,这时候Survivor区的S1U,但是由于b1b2是从S1U中过来的,而c1c2是从Eden区过来的,所以只能把数据块b1b2S1U移入到年老代。见图3-378)所示。

9)这个时候再把Eden区的数据块c3Eden区移入S1U。见图3-379)所示。

10Eden区产生数据块d1d3d3Eden区满了,而S1U仅存在了数据块c3,把Eden区的d1d3d3移入Survivor区的第二个存储单元。见图3-3710)所示。

11)由于当前S1U中的数据块c3d1d3d3都是从Eden区过来的,这个时候S1U已经满了,所以要把数据块c3d1d3d3S1U移到S0U。见图3-3711)所示。

12Eden区的指针返回指向S0UEden区产生了新的数据块e1e2S0U中的d1d3被回收,剩下c3d2。见图3-3712)所示。

13Eden区产生数据块e3Eden区满了,这时候S0U中存在数据块c3d2,所以只能把Eden区的e1e2先移入到S0U中。见图3-3713)所示。

14S0U中目前存在数据块c3d2e1e2,由于c3d2是从S1U中过来的,而e1e2是从Eden区过来的,所以只能把c3d2S0U中移入到老年代。见图3-3614)所示。

15)接下来再把Eden区产生数据块e3移入到S0U。见图3-3715)所示。

16)按照这种规律进行下去。

17)这个时候,Eden区有数据块g1g2S1U有数据块e1e2 f1f2,年老代中存在数据块b1b2c1d2。见图3-3717)所示。

18S1U与年老代中存在数据块都满,把年老代中得数据块丢弃,把S1U中的e1e2移入年老代。见图3-3718)所示。按照这个规律进行下去。

由此看见。

新产生的数据首先进入Eden区。

Eden区的数据满后进入Survivor区。

只有在两个Survivor区都存储过的数据才可以进入老年代。

Eden区轮询指向Survivor区中的两个区。

老年代存在数据,但是年轻代数据已满,会清空老年代。


2. 元空间[33]

由于持久代的问题比较多,从JDK8开始废弃了持久代迎来元空间(Metaspace),官方原文是这样写的:This is part of theJRockit and Hotspot convergence effort. JRockit customers do not need toconfigure the permanent generation (since JRockit does not have a permanentgeneration) and are accustomed to not configuring the permanent generation.


下面来看一下元空间。

•元空间的内存大小。

元空间是方法区的在HotSpot jvm 中的实现,方法区主要用于存储类的信息、常量池、方法数据、方法代码等。方法区逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫“非堆”。

元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。,理论上取决于32/64位系统可虚拟的内存大小。可见也不是无限制的,需要配置参数。


•常用配置参数。

ØMetaspaceSize

初始化的Metaspace大小,控制元空间发生GC的阈值。GC后,动态增加或降低MetaspaceSize。在默认情况下,这个值大小根据不同的平台在12M20M浮动。使用Java -XX:+PrintFlagsInitial命令可以查看初始化参数。


ØMaxMetaspaceSize

限制Metaspace增长的上限,防止因为某些情况导致Metaspace无限的使用本地内存,影响到其他程序。该参数的默认值为4294967295B(大约4096MB)。


ØMinMetaspaceFreeRatio

当进行过Metaspace GC以后,会计算当前Metaspace的空闲空间的比例,如果这个比例小于这个参数(即实际非空闲占比过大,内存不够用),那么虚拟机将增长Metaspace的大小。参数的默认值为40%。设置该参数可以控制Metaspace的增长的速度,设置得太小会导致Metaspace增长的缓慢,Metaspace的使用逐渐趋于饱和,可能会影响之后类的加载。而设置得太大,会导致Metaspace增长的过快,浪费内存。


ØMaxMetasaceFreeRatio

当进行过Metaspace GC之后,会计算当前Metaspace的空闲空间比,如果空闲比大于这个参数,那么虚拟机就会释放Metaspace的部分空间。参数的默认值为70%


ØMaxMetaspaceExpansion

Metaspace增长时的最大幅度。该参数的默认值为5452592B(大约为5MB)。

ØMinMetaspaceExpansion

Metaspace增长时的最小幅度。该参数的默认值为340784B(大约330KB为)。


3. jps

jpsJava Virtual Machine Process StatusTool)是Java提供的一个显示当前所有Java进程pid的命令。

jps 命令格式:jps [options ] [ hostid ]

[options]选项。

Ø-q

仅输出VM标识符,不包括classname,jar name,argumentsin main method

Ø-m

输出main method的参数

Ø-l

输出完全的包名,应用主类名,jar的完全路径名

-Øv

输出jvm参数

Ø-V

输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件

Ø-Joption

传递参数到vm,例如:-J-Xms512m

[hostid]

Ø [protocol:][[//]hostname][:port][/servername]

•命令的输出格式。

Ølvmid [ [classname| JARfilename | "Unknown"] [ arg* ] [ jvmarg* ] ]

jps。最基本的使用方式。


>jps
20388Bootstrap
14364 Jps


jps -l。输出主类或者jar的完全路径名。


>jps -l
18756sun.tools.jps.Jps
20388 org.apache.catalina.startup.Bootstrap


jps -v。输出jvm参数。

>jps -v
20388Bootstrap-Djava.util.logging.config.file=C:\xampp\tomcat\conf\logging.properties-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager-Djava.endorsed.dirs=C:\xampp\tomcat\endorsed -Dcatalina.base=C:\xampp\tomcat-Dcatalina.home=C:\xampp\tomcat -Djava.io.tmpdir=C:\xampp\tomcat\temp
13948 Jps-Denv.class.path=C:\Program Files\Java\jdk1.8.0_131\\lib\dt.jar;C:\ProgramFiles\Java\jdk1.8.0_131\\lib\tools.jar;C:\apache\apache-tomcat-8.0.30\lib\servlet-api.jar;-Dapplication.home=C:\Program Files\Java\jdk1.8.0_131 -Xms8m


jps -q。仅仅显示java进程号。


>jps -q
20388
server.resin.Resin

jps -mlv <IP>。远程查看

4. jstat

      jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。关于jstat的使用查看表3-18所示。


3-18 jstat命令

参数

解释

jstat –class<pid>

显示加载class的数量,及所占空间等信息

jstat -compiler <pid>

显示VM实时编译的数量等信息

jstat -gc <pid>

可以显示gc的信息,查看gc的次数,及时间

jstat -gccapacity <pid>

可以显示,VM内存中(young,old)对象的使用和占用大小

jstat -gcutil <pid>

统计gc信息

jstat -gcnew <pid>

年轻代对象的信息

jstat -gcnewcapacity<pid>

年轻代对象的信息及其占用量

jstat -gcold <pid>

old代对象的信息

jstat -gcoldcapacity <pid>

old代对象的信息及其占用量

jstat -printcompilation  <pid>

当前VM执行的信息


5. jVisualVM &jmap

      通过命令jmap-dump:format=b,file=<path>\<filename>.hprof <pid>,把<pid>的信息导入.hprof格式的文件,然后打开jVisualVM GUI 界面,载入刚生成的.hprof文件,即可查看该进程在JVM的信息了。如图3-38所示。

image.png

3-38  jVisualVM


3.2.6 APM工具简介

      [29]APMApplicationPerformance Management)是一种应用性能监控工具,通过汇聚业务系统的各个处理环节的实时数据,分析业务系统各个事务处理的交易路径和处理时间,实现对应用的全链路性能监测。目前主流的APM工具,基本都是参考了GoogleDapper(大规模分布式系统的跟踪系统)体系,通过跟踪业务请求的处理过程,完成对应用系统在前后端处理、服务端调用的性能消耗跟踪,提供可视化的界面来展示对跟踪数据的分析。

常见的APM包括。


1. Pinpoint

网址为:https://github.com/naver/pinpoint,是一款Java编写的大规模分布式系统的APM工具,由韩国人开发的开源的分布式跟踪组件,其特点是。

Ø分布式事务跟踪,跟踪跨分布式应用的消息。

Ø自动检测应用拓扑,帮助搞清楚应用的架构。

Ø水平扩展以便支持大规模服务器的集群。

Ø提供代码级别的可见性以便轻松定位失败点和瓶颈。

Ø使用字节码增强技术,添加新功能而无需修改代码。


2.SkyWalking

网址为:https://github.com/apache/incubator-skywalking2015年由个人吴晟,一名华为的开发者开源产品,2017年加入Apache孵化器。它针对分布式系统的应用性能监控系统,特别针对微服务、cloudnative和容器化(Docker,Kubernetes, Mesos)架构,其核心是个分布式追踪系统。SkyWalking使用Java探针字节码增加技术,实现对整个应用的监控。而对应用是零侵入的。


3.Zipkin

网址为:https://github.com/openzipkin/zipkin。是由Twitter团队开源的一个分布式的跟踪系统。它有助于收集数据需要解决潜在的问题。它管理数据的收集和查找。Zipkin结合spring-cloud-sleuth使用较为简单,集成也很方便。但是功能比较简单。


4.CAT

CATCentral Application Tracking)是美团和大众点评开发的一款APM工具。它是基于Java开发的实时应用监控平台,包括实时应用监控,业务监控。


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


软件安全测试

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

相关实践学习
通过云拨测对指定服务器进行Ping/DNS监测
本实验将通过云拨测对指定服务器进行Ping/DNS监测,评估网站服务质量和用户体验。
目录
相关文章
|
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月前
|
监控 安全 测试技术
测试与开发问题之为什么测试开发工程师需要有安全生产意识,文档编写能力对于测试开发工程师的重要性如何理解
测试与开发问题之为什么测试开发工程师需要有安全生产意识,文档编写能力对于测试开发工程师的重要性如何理解