当前位置: 首页 > 后端技术 > Java

基于 PTS 压测轻松玩转问题诊断

时间:2023-04-01 15:52:23 Java

基于PTS压力测试的轻松问题诊断站点性能、容量和稳定性。作者:智云为什么要定位压测的问题?性能测试PTS(PerformanceTestingService)是一个SaaS压测平台,具有强大的分布式压测能力,能够模拟海量用户的真实业务场景,全面验证业务站点的性能、容量和稳定性。在持续测压服务器水位的过程中,我们可以从压测视图或者压测报告中看到更全面的压测指标,比如QPS、RT、TPS等,但仅仅从这些指标来看,它无法快速定位到服务器的具体问题。比如我们可以从整个场景的错误信息中心看到错误码对应的接口的响应体,但是下游是哪个环节错了,错误的栈是什么,你是看不到的这里简单的从report上看,但是接口下游有什么问题,errorstack是什么,正是用户关心的问题。借助问题诊断,我们可以理清被压接口的上下游调用。同时从链路视图中我们可以看到整个链路经过的消息组件(Kafka、RocketMQ等)、缓存(Redis、MongoDB等)。等),数据库(MySQL,Oracle等),RPC调用(Feign,Dubbo,HttpClient等),比如某个接口状态码异常或者其他错误,那么我们可以从调用链上看那就是rpc调用有问题,就是数据库读写有问题,从调用链可以看到对应的错误栈。根据这些信息,应该比较清楚问题出在哪里。问题诊断基本介绍及核心优势基本介绍用户在进行问题诊断时,主要关心的是接入问题诊断是否需要对应用端代码进行一系列修改,是否需要复杂的配置等等。PTS提供的问题诊断基于JavaAgent,用户端无需修改业务代码。对于基于Tomcat的部署方式,用户只需在启动脚本中添加一些必要的参数即可接入问题诊断;对于Kubernetes用户,用户只需要在Yaml配置文件中添加一些必要的注解即可访问问题诊断。对于链接收集规则,PTS会提供默认配置,用户也可以根据自己的需要进行更改。PTS集成问题诊断在压测??过程中,对于每一个请求,在压力引擎侧都会生成一个TraceId,通过TraceId关联请求中涉及的上下游环节,用户可以看到作为入口到本次请求结束所涉及的完整调用链,同时问题诊断会为调用链生成对应的应用拓扑视图,让用户清晰的看到应用之间的调用关系。对于异常的接口,我们可以在调用链中看到相应的错误原因。同时,用户可以根据具体的错误堆栈对服务端问题进行排查和优化。压测过程中,用户可以实时查看指定请求的调用链。同时,压测结束后,还可以从压测报告中追溯问题。核心优势1.零代码入侵:对于Java类业务,用户端无需修改业务端代码即可完成探针接入进行问题诊断。2、集成度高:压测、监控、问题诊断集成在同一个控制台,用户理解和操作成本较低。3.全面的监控指标:在压测过程中,除了比较基础的监控指标外,还针对各个服务提供了接口、机器、应用层面的监控。4、门槛低:只需简单配置参数即可完成问题诊断探针接入。同时,探针还具备多协议mock、全链路压力测试等功能。问题诊断快玩起来接入问题诊断的基本流程如下:连接探头,检查是否连接成功。【问题诊断】->【探针接入[1]】文档中的步骤进行问题诊断探针接入。我们可以在PTS控制台中选择应用配置或应用监控、接口监控、机器监控中的一项来查看应用探针是否连接成功。我们这次演示的压测场景涉及五个应用,分别是petstore-web、petstore-user、petstore-order、petstore-catalog、petstore-cart。这里以应用监控为例,检查应用是否连接成功。点击【问题诊断】->【应用监控[2]]->依次选择我们在PTS控制台配置的Region和Namespace。如果看到压测场景涉及的所有应用都在这个页面上,说明应用连接成功。打开压测场景中的问题诊断开关,然后我们在PTS控制台的【压测中心】->【创建场景【3】】中创建一个压测场景,这里可以选择PTS场景或者JMeter场景等这里,PTS以场景为例,因为本次演示主要是为了验证问题诊断的能力,所以需要在场景配置中的【高级设置】中打开问题诊断开关。对于具体的监控采集规则,PTS会将默认采集开关的配置推送给用户。同时采样率设置为1/1000,用户也可以根据自己的需要进行自定义。开始压测,查看应用监控。完成以上步骤后,我们的压测场景就具备了诊断问题的能力。我们点击开始压测后,可以在应用监控、接口监控、机器监控中选择我们关心的服务,查看对应的监控情况。这里我们以应用监控[2]为例。其他类型监控的操作步骤类似。我们选择petstore-user服务来查看应用监控,如下图所示:压测结束后,查看整个场景的错误信息。压测报告,具体步骤:PTS控制台->【压测中心】->【报告列表[4]],选择对应的压测报告,在概览页面可以看到整个场景的信息,如图如下图显示:选择探针采样,查看具体的调用链,点击【查看采样日志】,采样类型选择“探针采样”,然后过滤出问题诊断探针采集到的调用链,如图下图:查看callChain具体的错误栈信息,定位问题在server端过滤掉probe端收集到的调用链后,就可以分析出问题接口的调用链了。比如商品列表的接口返回的状态码是500,点击查看详情查看具体原因,如下图:可以从调用栈中看到具体的错误原因,如优化和修复服务器代码。同时,您可以通过应用拓扑视图和数据库视图查看服务之间的调用和数据库使用情况。这里以应用拓扑视图为例,如下图所示:压力测试报告中常见错误码汇总问题诊断错误码汇总问题诊断调用链路中常见错误码汇总如下:java.lang.NullPointerException:服务器端的空指针。具体可以根据调用链中的errorstack查看server端的代码。com.microsoft.sqlserver.jdbc.SQLServerException:报服务器SQL错误,可根据调用链收集的堆栈信息检查服务器SQL语法。压力测试报告错误码汇总这里列出了压力测试报告中常见的错误。从整个场景的错误信息我们可以看到相关的错误信息,如下:classjava.net.SocketTimeoutException:null表示请求正在等待响应或者读取中超时(idle)。请检查服务器健康状态或PTS压测接口超时设置是否合理。此外,服务器的处理能力也可能存在瓶颈。classjava.net.ConnectException:null表示建立TCP连接时请求失败或被对端(压测端)拒绝。请检查服务器的健康状态,或者网络连接层是否存在瓶颈。classjava.util.concurrent.TimeoutException:null表示在与对端建立TCP连接时请求失败或被对端拒绝(压测端)。请检查服务器的健康状态,或者网络连接层是否存在瓶颈。classorg.apache.http.ConnectionClosedException:Connectionclosed表示连接异常关闭,服务端主动关闭连接。classjava.io.IOException:Connectionresetbypeer指示连接已重置。如果使用负载均衡,检查负载均衡配置是否有问题。classorg.apache.http.ConnectionClosedException:Connectionclosedunexpectedly表示在接收到数据之前连接已经关闭。服务器可能无法及时响应或提前终止调试或压力测试。classjava.lang.RuntimeException:java.net.UnknownHostException表示无法解析域名信息。请检查域名是否已经正常注册并可以解析,未注册的域名是否已经绑定。classorg.apache.hc.core5.http.ProtocolException:Header'key:value'isillegalforHTTP/2messages表示当服务端偏好使用HTTP2协议时,场景配置了HTTP2不支持的header协议。请在移除相应的Header后移动Retry。HTTP2不支持的常见标头包括:Connection、Keep-Alive、Proxy-Connection、Transfer-Encoding、Host、Upgrade。原文链接本文为阿里云原创内容,未经许可不得转载。