(性能测试)--记录一次高可用场景导致CPU资源升高

cpu · 浏览次数 : 0

小编点评

一、测试场景 1.1 限流测试场景 1.2 被测交易:查询类交易,HTTP协议 1.3 交易链路:jmeter - web - coimpre(前置服务) -- coimbp -- cobp (coimbp 、coimpre 都会访问同一个数据库) 1.4 注意事项:跨网段存在网络延迟,可能导致TPS波动情况 二、场景配置 2.1 配置coimpre 服务的限流参数 三、场景执行 3.1 执行场景使TPS 大于 限流参数,出发限流报错 3.2 通过日志以及服务返回确认是否成功触发限流 四、测试问题 4.1 监控coimpre服务CPU资源,从5% 上升至 90%以上 4.2 两次i验证执行,确认问题存在 五、排查思路 5.1 使用top命令监控消耗CPU高的进程是否为java服务 5.2 使用top -Hp pid 查看进程下的线程消耗进一步确认是哪个线程消耗 5.3 打印线程dump文件,分析dump文件查看该线程此时的业务操作 5.4 定位问题,给出优化意见,测试验证 5.4.1 通过dump文件分析,有问题的线程主要是在java net.URClassLoader.findResouce()方法 5.4.2 项目组确认,交易报错后,日志会打印错误信息并带出是哪个jar包导致的错误 5.4.3 共同认定是该问题导致的cpu升高,开发人员修改此处代码,不再遍历jar 5.4.4 修改后,重新部署版本,再次验证限流,cpu资源下降至10% 六、归纳总结 本次测试中,在高可用场景下对限流功能进行了测试。由于被测交易为查询类交易,HTTP协议,且涉及多个服务之间的调用,因此在测试过程中需要注意跨网段存在网络延迟对TPS波动的影响。通过对限流参数的配置和测试,使得在TPS超过限流参数时能够正确触发限流报错。经排查,发现限流报错是由于Java应用程序在处理请求时,线程消耗大量CPU资源导致的。经过开发人员的优化,修改了处理逻辑,减少了不必要的jar包遍历,从而解决了CPU资源过高的问题。最终,在重新部署修改后的版本后,再次进行限流测试,实现了TPS降至10%的正常水平。

正文

测试场景:高可用场景--限流测试;

被测交易:查询类交易,HTTP协议;

交易链路:jmeter - web - coimpre(前置服务) -- coimbp -- cobp (coimbp 、coimpre 都会访问同一个数据库);

注:cobp 为合肥机房,其他服务均为北京机房,要注意跨网段存在网络延迟(会导致TPS波动情况);

场景配置:配置coimpre 服务的限流参数;

场景执行:执行场景使TPS 大于 限流参数,出发限流报错,可通过日志以及服务返回确认是否成功触发限流;

测试问题:交易触发限流后,监控coimpre服务CPU资源,从5% 上升至 90%以上,两次i验证执行,确认问题存在;

排查思路:

  1. 使用top命令监控消耗CPU高的进程是否为java服务,(程序为java开发);

  2. 使用top -Hp pid 查看进程下的线程消耗进一步确认是哪个线程消耗;

  

   3. 打印线程dump文件,分析dump文件查看该线程此时的业务操作‘(第一个图是 linux下 jcmd生成的,第二个是使用的 java VisualVM 生成的)

  

  

     4. 定位问题,给出优化意见,测试验证;

    4.1 通过dump文件分析,有问题的线程主要是在java net.URClassLoader.findResouce()方法,通过第一个图可以看到java util.zip,ziprile getentry,结合两个方法,并通过和开发沟通是否对某个 ZIP 文件中文件文件有操作。

    4.2 项目组确认,交易报错后,日志会打印错误信息并带出是哪个jar包导致的错误,从而就会遍历整个jar目录。

    4.3 共同认定是该问题导致的cpu升高,开发人员修改此处代码,不再遍历jar。

    4.4 修改后,重新部署版本,再次验证限流,cpu资源下降至10%

与(性能测试)--记录一次高可用场景导致CPU资源升高相似的内容:

(性能测试)--记录一次高可用场景导致CPU资源升高

测试场景:高可用场景--限流测试; 被测交易:查询类交易,HTTP协议; 交易链路:jmeter - web - coimpre(前置服务) -- coimbp -- cobp (coimbp 、coimpre 都会访问同一个数据库); 注:cobp 为合肥机房,其他服务均为北京机房,要注意跨网段存

[转帖]记一次压测引起的nginx负载均衡性能调优

https://xiaorui.cc/archives/3495 这边有个性能要求极高的api要上线,这个服务端是golang http模块实现的。在上线之前我们理所当然的要做压力测试。起初是 “小白同学” 起头进行压力测试,但当我看到那压力测试的结果时,我也是逗乐了。 现象是,直接访问Golang

[转帖]专注于GOLANG、PYTHON、DB、CLUSTER 记一次压测引起的nginx负载均衡性能调优

https://xiaorui.cc/archives/3495 rfyiamcool2016年6月26日 0 Comments 这边有个性能要求极高的api要上线,这个服务端是golang http模块实现的。在上线之前我们理所当然的要做压力测试。起初是 “小白同学” 起头进行压力测试,但当我看到

[转帖]记一次线上Oracle连接耗时过长的问题

https://www.cnblogs.com/changxy-codest/p/15670495.html 问题现象 1、远程Oracle数据库通过IP:PORT/SERVICE_NAME连接 2、应用服务通过Docker容器部署,访问Oracle联通性测试接口,需要50s左右才能返回连接成功;

kafka学习之三_信创CPU下单节点kafka性能测试验证

# kafka学习之三_信创CPU下单节点kafka性能测试验证 ## 背景 ``` 前面学习了 3controller+5broker 的集群部署模式. 晚上想着能够验证一下国产机器的性能. 但是国产机器上面的设备有限. 所以想着进行单节点的安装与测试. 并且记录一下简单结果 希望对以后的工作有指

使用 Linux dd 命令测试磁盘读写性能

使用 Linux dd 命令测试磁盘读写性能 从帮助手册中可以看出,dd命令可以复制文件,根据操作数进行转换和格式化。我这里记录一下dd命令用于测试磁盘I/O性能的过程。 dd 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。 dd 命令用法: Usage: d

[转帖]性能分析之TCP全连接队列占满问题分析及优化过程(转载)

https://cloud.tencent.com/developer/article/1420726 前言 在对一个挡板系统进行测试时,遇到一个由于TCP全连接队列被占满而影响系统性能的问题,这里记录下如何进行分析及解决的。 理解下TCP建立连接过程与队列 从图中明显可以看出建立 TCP 连接的时

[转帖]性能分析之TCP全连接队列占满问题分析及优化过程

https://www.cnblogs.com/wx170119/p/12068005.html 前言 在对一个挡板系统进行测试时,遇到一个由于TCP全连接队列被占满而影响系统性能的问题,这里记录下如何进行分析及解决的。 理解下TCP建立连接过程与队列 从图中明显可以看出建立 TCP 连接的时候,有

[转帖]性能分析之TCP全连接队列占满问题分析及优化过程(转载)

https://www.cnblogs.com/wx170119/p/12068005.html 前言 在对一个挡板系统进行测试时,遇到一个由于TCP全连接队列被占满而影响系统性能的问题,这里记录下如何进行分析及解决的。 理解下TCP建立连接过程与队列 从图中明显可以看出建立 TCP 连接的时候,有

企业级测试能力提升总结

# 企业级测试能力提升总结 ## 学习的部分内容 ``` 1. UI自动化 2. API自动化 3. 性能测试 4. 测试服务架构 5. 部分迁移AI,数据相关的测试技术. ``` ## 学习时记住的一些重点-1 ``` 1. 关于软件研发的发展 传统业务是大鱼吃小鱼 软件业务是快鱼吃慢鱼 软件业其