接口性能测试复盘:解决JMeter超时问题的实践

news2024/11/18 10:54:01

在优化接口并重新投入市场后,我们面临着一项关键任务:确保其在高压环境下稳定运行。于是,我们启动了一轮针对该接口的性能压力测试,利用JMeter工具模拟高负载场景。然而,在测试进行约一分钟之后,频繁出现了“连接超时”的错误信息,即“Failed: Connection timed out”。这不仅阻碍了我们构建一个持续稳定的压力测试环境,还对准确评估系统承载能力带来了挑战。
在这里插入图片描述

问题排查与解决方案概览:

nginx问题排查

端口耗尽问题是一种常见的网络资源瓶颈,特别是在高并发的测试或生产环境中。当一个服务器在短时间内需要处理大量的网络连接时,如果可用端口数量不足,就会导致新的连接请求无法得到及时响应,从而引发服务延迟或失败。

  1. 端口耗尽问题的初步分析

    • 在这个问题中,初步分析指出错误源于JMeter客户端无法及时与服务器建立TCP连接。JMeter是一款常用的性能测试工具,它通过模拟多个用户同时访问服务器来测试系统的性能。
    • 监控工具的检测显示,部署了nginx的服务器端口占用量达到了6万个,接近了TCP/IP协议定义的端口上限(65535个)。这表明服务器正在处理大量的网络连接,端口资源变得非常紧张。
  2. 解决端口耗尽问题的措施

    • 减少并发线程数:通过降低JMeter发起的并发连接数,可以减少同时向服务器发起的连接请求,从而减轻对端口资源的压力。
    • 调整nginx配置:将nginx配置调整到8核16GB的资源,可以增加服务器处理连接的能力。这可能包括增加工作进程数、优化内存和CPU使用等。
    • 成功缓解端口资源紧张的问题:通过上述措施,服务器的端口资源得到了更有效的管理,减少了端口耗尽的风险。
  3. 监控端口使用状况

    • 使用命令查看端口使用状况:netstat -nat|grep -i 8080|wc -l 命令可以帮助我们查看特定端口(如8080)的使用情况。这个命令会列出所有与8080端口相关的网络连接状态,并通过wc -l计算连接数。
    • 如果发现连接数在6万左右,那么很可能是端口号已经用尽。这种情况下,需要采取措施减少并发连接数或者增加服务器的处理能力,以防止端口耗尽导致的服务不可用。

网络排查

  1. 网络与资源监控优化是一个持续的过程,需要对系统的各个方面进行细致的观察和调整。在本例中,我们对业务服务器状态进行了深入调查,发现了一些关键的问题和解决方案。

  2. 问题诊断

    • 初步调查发现,网络流量的激增与数据库查询活动有关。特别是,健康检查接口的设计导致了频繁的数据库加载,这个接口为了监测是否有遗漏的订单,不断地加载所有活跃订单。这种设计在高并发的环境下会导致大量的数据库查询操作,从而引起网络流量的显著增加。
    • 由于健康检查接口的操作,CPU和内存的使用率急剧上升,给服务器带来了巨大的压力。这种资源的过度使用不仅影响了服务的稳定性,还可能导致性能下降和其他服务的故障。
  3. 解决措施

    • 关闭健康检查接口中的监控功能:通过关闭或者优化这部分功能,减少了不必要的数据库查询,从而降低了网络流量和系统负载。
    • 尽管采取了上述措施,测试的稳定性有所改善,但是系统中仍然存在超时现象。这表明可能需要进一步的优化措施,比如优化数据库索引、调整查询算法或者增加更多的服务器资源。
  4. 性能监控工具的应用

    • 网络分析:使用iftop -i eth1 -P命令可以实时监控指定网络接口(如eth1)的流量情况,帮助快速识别流量异常的根源。
    • CPU分析:使用top命令可以实时显示系统中各个进程的CPU使用情况,帮助我们找出消耗CPU资源最多的进程。
    • JVM内存分析:使用jstat -gc [pid] 时间间隔单位毫秒 次数,例如jstat -gc 189 1000 10,可以监控指定Java进程(如pid=189)的垃圾收集情况,帮助我们了解内存的使用和垃圾收集的频率。

GC排查

内存管理与GC(垃圾收集)优化是确保Java应用性能和稳定性的关键因素。在本例中,我们使用了Arthas工具来追踪和诊断性能问题,并采取了有效的优化措施。

  1. 问题诊断

    • 使用Arthas工具追踪发现,发送订单到Cep服务的过程耗时较长。Arthas是一个Java诊断工具,能够帮助开发者即时查看和诊断运行中的Java程序,无需重启或修改代码。
    • 问题的原因在于Cep服务虽然配置了5GB内存,但实际可用内存仅为2GB。这种差异可能是由于JVM内存分配不当或者系统其他部分占用了过多内存导致的。
    • 由于可用内存较低,导致在处理大量订单时频繁触发Full GC(全面垃圾收集)。Full GC会暂停所有应用线程,直至垃圾收集完成,这会严重影响应用的响应时间和吞吐量。
  2. 解决措施

    • 我们通过限制存活订单数不超过20万来避免内存溢出。这个限制减少了同时在内存中处理的订单数量,从而降低了内存的使用量。
    • 清理部分订单后,测试恢复正常。这意味着通过释放不再需要的对象所占用的内存,我们能够减少GC的频率和持续时间,提高应用的性能。
  3. 内存管理和GC优化的一般原则

    • 合理配置JVM内存:根据应用的需求和服务器的资源情况,合理设置堆内存(-Xmx)和非堆内存(-XX:MaxMetaspaceSize等)的大小,避免内存不足或过度分配。
    • 代码优化:优化代码以减少不必要的对象创建和长时间持有大对象,可以使用对象池或软引用等技术来管理对象生命周期。
    • GC策略调整:选择合适的垃圾收集器(如CMS、G1等),并根据应用的特点调整GC参数,比如增大年轻代比例、调整晋升阈值等。
    • 性能监控:使用各种性能监控工具(如Arthas、JVisualVM、PerfMa等)实时监控系统的内存和GC状态,及时发现并解决问题。

连接管理策略

连接管理策略是确保应用能够在高并发环境下稳定运行的关键因素之一。在本例中,我们通过分析JMeter的默认行为和调整配置,解决了连接管理的问题。

  1. 问题诊断

    • 使用JMeter进行性能测试时,我们发现默认情况下JMeter使用的是短连接模式。这意味着每次请求完成后,TCP连接会被立即关闭,而不是被重新用于后续的请求。
    • 由于未启用KeepAlive选项,端口在释放后不会被立即回收。在TCP协议中,KeepAlive是一种检测和控制空闲连接的机制,它能够确保连接在关闭后快速释放占用的资源。
    • 这种端口未立即回收的情况影响了后续连接的建立,因为在TCP/IP网络中,一个端口在一段时间内只能被一个连接使用。如果端口未能及时释放,新的连接请求就会被阻塞,导致性能下降或超时错误。
  2. 解决措施

    • 我们通过修改JMeter的配置,开启了KeepAlive选项。这个选项使得TCP连接在关闭后能够更快地被系统回收,从而减少了端口资源的消耗。
    • 开启KeepAlive后,端口的使用效率得到了显著提升,后续连接建立的延迟和失败率都大幅降低。这不仅提高了性能测试的效率,也使得测试结果更加准确和可靠。
  3. 连接管理策略的一般原则

    • 长连接与短连接的选择:根据应用的实际需求选择适合的连接模式。长连接可以减少连接建立和关闭的开销,但需要更复杂的连接管理机制来处理异常和空闲状态。
    • KeepAlive的配置:在可能的情况下启用KeepAlive,以便及时检测和释放不再需要的连接。但需要注意,KeepAlive不适合所有场景,比如移动网络环境下可能会增加电池消耗。
    • 资源调优与监控:合理配置线程池、数据库连接池等资源池的大小,监控资源使用情况,及时调整参数以适应不同的负载情况。
    • 适应性与容错性:设计适应性强和容错性高的系统,能够处理网络波动、服务不可用等异常情况,保证系统的稳定运行。

总结与启示:

  • 性能优化是个系统工程,需综合考虑网络、硬件资源、软件配置及测试工具设置。
  • 细致监控与诊断是关键,借助专业工具(如arthas、iftop)定位瓶颈。
  • 资源管理至关重要,合理分配内存和线程数,避免资源过度消耗。
  • 连接策略调整,如启用KeepAlive,能有效提升连接效率和测试稳定性。

通过这一系列排查与优化措施,我们不仅解决了JMeter测试中的超时问题,还提升了系统的整体性能和稳定性,为网格交易功能的高效运行打下了坚实的基础。分享此经验,希望能为遇到类似问题的开发者提供参考与帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1708056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端 CSS 经典:水波进度样式

前言&#xff1a;简单实现水波进度样式&#xff0c;简单好看。 效果图&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><meta http-equiv"X-UA-Compatible" cont…

产线虚拟现实vr仿真软件开发在线上能全面呈现企业品质和专业度

在数字化浪潮中&#xff0c;上海VR全景场景制作公司凭借其领先的VR全景制作技术&#xff0c;正为各行各业带来前所未有的沉浸式体验。无论是学校企业场地的生动展示&#xff0c;还是汽车内饰与外观的360度全景呈现&#xff0c;我们都能通过VR虚拟现实制作技术&#xff0c;让您的…

双击移动硬盘打不开?原因分析与数据恢复全攻略

在日常生活和工作中&#xff0c;移动硬盘作为数据存储和传输的重要工具&#xff0c;扮演着至关重要的角色。然而&#xff0c;当我们遇到双击移动硬盘无法打开的情况时&#xff0c;往往会感到十分困扰。本文将详细探讨双击移动硬盘打不开的原因&#xff0c;并提供两种有效的数据…

(C语言) 泛型表达式

文章目录 ⭐语法⭐举例&#x1f6a9;判断对象类型&#x1f6a9;判断指针&#x1f6a9;函数重载&#x1f6a9;嵌套使用 END ⭐语法 Ref: 泛型选择 (C11 起) - cppreference.com 关键词&#xff1a; Genericdefault _Generic(控制表达式 , 关联列表) (C11 起) 关联列表 类型名:…

floodfill 算法(上)

目录 图像渲染 题意&#xff1a; 题解&#xff1a; 非递归&#xff1a; 递归&#xff1a; 岛屿数量 题解&#xff1a; 非递归&#xff1a; 递归&#xff1a; 岛屿的最大面积 题解&#xff1a; 非递归&#xff1a; 递归&#xff1a; 被围绕的区域 题解&#xff1a…

【加密与解密(第四版)】第十四章笔记

第十四章 漏洞分析技术 14.1 软件漏洞原理 缓冲区溢出漏洞&#xff1a;栈溢出 堆溢出、整型溢出&#xff08;存储溢出、计算溢出、符号问题&#xff09; UAF&#xff08;Use-After-Free&#xff09;漏洞 14.2 ShellCode 功能模块&#xff1a;下载执行、捆绑、反弹shell 14.3 …

采用java语言+B/S架构+后端SpringBoot前端Vue开发的ADR药品不良反应智能监测系统源码

采用java语言&#xff0b;B/S架构&#xff0b;后端SpringBoot前端Vue开发的ADR药品不良反应智能监测系统源码 ADR监测引擎每日主动获取检验数据、病历内容&#xff08;可拓展&#xff09;、以及其他临床数据&#xff0c;根据知识库内容自动判定患者是否有不良反应迹象&#xf…

kettle组件之java代码,快速上手必看

我们先了解不同于java代码的kettle的一些方法 1、getRow()&#xff1b; 获取每一行数据&#xff0c;循环读数据&#xff1b;返回的是Object[]数组 2、get(Fields.in,"字段名"); 获取具体的某个字段的名称 3、get(Fields.in,"字段名").getString(r); …

【软考】下篇 第15章 面向服务架构设计理论与实践

目录 一、SOA定义二、微服务微服务优势微服务与SOA对比微服务架构模式方案微服务设计约束 三、SOA参考架构四、SOA设计的标准要求五、SOA设计原则六、SOA设计模式七、SOA实施 一、SOA定义 面向服务的体系结构 (Service-Oriented Architecture,SOA), 从应用和原理的角度看&…

网络原理-HTTPS协议

在前面说到HTTP中,我们通过抓包,可以看到许多信息内容,其中往往会包含一些敏感信息,这些都是明文传输,当我们的请求被黑客或者不法分子截获后,那就很危险了,因此衍生出了HTTPS协议来对传输数据进行加密。 一、加密原理 基本原理如下&#xff1a; 明文 密钥 > 密文 密文…

线性稳压电路和开关稳压电路

稳压二极管稳压电路 电网电压增大&#xff0c;导到u1端的电压增大&#xff0c;从而使输出电压&#xff0c;稳压二极管两端的电压增大&#xff0c;稳压二极管两端电压增大&#xff0c;使流过的电注增大。那么&#xff0c;流过线性电阻R的总电流增大。 Ur电压增大&#xff0c;从…

网络故障排除—NAT-源进源出

多网络双出口一边是运营商A,一边是运营商B&#xff0c;将内网服务器分别映射到运营商B和运营商A出口。查了保证内部上网用户网速快管理员开启了运营商选路功能&#xff0c;运营商B的网站从运营商B出去&#xff0c;然后写有两条等价默认路由分别指向两个外网出口。营商A的网站从…

内网安全-隧道搭建穿透上线内网穿透-nps自定义上线内网渗透-Linux上线-cs上线Linux主机

目录 内网安全-隧道搭建&穿透上线内网穿透-nps-自定义-上线NPS工具介绍搭建过程 nps原理介绍MSF上线CS上线 内网渗透-Linux上线-cs上线Linux主机1.下载插件2.导入插件模块3.配置监听器4.服务端配置5.配置C2监听器并生成木马6.执行木马 内网安全-隧道搭建&穿透上线 内网…

重学java 49 增强for

知之俞明&#xff0c;则行之越笃&#xff1b;行之愈笃&#xff0c;则知之愈益&#xff1b; —— 24.5.28 一、基本使用 1.作用: 遍历集合或者数组 2.格式: for(元素类型 变量名:要遍历的集合名或者数组名) 变量名就是代表的每一个元素 3.快捷键: 集合名或者数组名.for package …

Transformers x SwanLab:可视化NLP模型训练

HuggingFace 的 Transformers 是目前最流行的深度学习训框架之一&#xff08;100k Star&#xff09;&#xff0c;现在主流的大语言模型&#xff08;LLaMa系列、Qwen系列、ChatGLM系列等&#xff09;、自然语言处理模型&#xff08;Bert系列&#xff09;等&#xff0c;都在使用T…

Web3探索加密世界:空投常见类型有哪些?附操作教程

每种空投类型都有独特的特征和目的&#xff0c;我们需要了解不同类型的加密空投。本文给大家介绍的是流行的加密货币空投类型&#xff0c;以及一般空投是如何做的。感兴趣的话请看下去。 一、空投常见类型 1、持有者空投 持有者空投向钱包中持有一定数量数字货币的人免费发放…

基于MyBatisPlus表结构维护工具

SuperTable表结构维护工具 一、简述 用于同步表实体与数据库表结构&#xff0c;同步建表、删改字段、索引&#xff0c;种子数据的工具… 一、开发环境 JDK&#xff1a;JDK8SpringBoot&#xff1a;2.7.2MyBatisPlus: 3.5.6MySQL: 5.7其他依赖&#xff1a;略 二、特性 表结…

大话C语言:第18篇 函数

1 函数概述 函数是c语言的功能单位&#xff0c;实现一个功能可以封装一个函数来实现。函数是一种可重用的代码块&#xff0c;用于执行特定任务或完成特定功能。函数主要作用是对具备相同逻辑的代码进行封装&#xff0c;提高代码的编写效率&#xff0c;实现对代码的重用。例如&a…

【Spring】深入学习AOP编程思想的实现原理和优势

【切面编程】深入学习AOP编程思想的实现原理和优势 前言AOP的由来及AOP与代理的关系AOP的实现方式详解静态代理动态代理 AOP的应用场景记录日志权限控制数据库事务控制缓存处理异常处理监控管理 AOP的底层实现全流程解析Spring AOP的简介动态代理的实现原理Spring AOP的实现原理…

流水账(CPU设计实战)——lab3

Lab3 Rewrite V1.0 版本控制 版本描述V0V1.0相对V0变化&#xff1a; 修改了文件名&#xff0c;各阶段以_stage结尾&#xff08;因为if是关键词&#xff0c;所以module名不能叫if&#xff0c;遂改为if_stage&#xff0c;为了统一命名&#xff0c;将所有module后缀加上_stage&a…