当前位置: 首页 > news >正文

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

在优化接口并重新投入市场后,我们面临着一项关键任务:确保其在高压环境下稳定运行。于是,我们启动了一轮针对该接口的性能压力测试,利用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测试中的超时问题,还提升了系统的整体性能和稳定性,为网格交易功能的高效运行打下了坚实的基础。分享此经验,希望能为遇到类似问题的开发者提供参考与帮助。

相关文章:

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

在优化接口并重新投入市场后,我们面临着一项关键任务:确保其在高压环境下稳定运行。于是,我们启动了一轮针对该接口的性能压力测试,利用JMeter工具模拟高负载场景。然而,在测试进行约一分钟之后,频繁出现了…...

[数据集][目标检测]猕猴桃检测数据集VOC+YOLO格式1838张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1838 标注数量(xml文件个数):1838 标注数量(txt文件个数):1838 标注…...

摸鱼大数据——Hive函数7-9

7、日期时间函数 Hive函数链接:LanguageManual UDF - Apache Hive - Apache Software Foundation SimpleDateFormat (Java Platform SE 8 ) current_timestamp: 获取时间原点到现在的秒/毫秒,底层自动转换方便查看的日期格式 常用 to_date: 字符串格式时间…...

python连接数据库

python连接MYSQL、postgres、oracle等的基本操作 python连接mysql MySQLdb MySQLdb又叫MySQL-python ,是 Python 连接 MySQL 的一个驱动,很多框架都也是基于此库进行开发,只支持 Python2.x,而且安装的时候有很多前置条件&#…...

能不能接受这些坑?买电车前一定要看

图片来源:汽车之家 文 | Auto芯球 作者 | 雷慢 刚有个朋友告诉我,买了电车后感觉被骗了, 很多“坑”都是他买车后才知道的。 不提前研究,不做功课,放着我这个老司机不请教, 这个大冤种他不当谁当&…...

k8s中pod如何排错?

排除Kubernetes Pod故障通常涉及一系列步骤,以诊断问题并找到解决方案。以下是一些常见的故障排除方法: 检查Pod状态: 使用kubectl get pods查看Pod的状态。如果Pod没有处于Running状态,查看更详细的信息,使用kubectl describe …...

【手撕面试题】Vue(高频知识点二)

每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么&…...

四、.Net8对接Ollama实现文字翻译(.Net8+SemanticKernel+Ollama)本地运行自己的大模型

.Net8SemanticKernelOllama 一、Semantic Kernel官方定义SK能做什么? 二、基本使用1、普通对话2、使用插件实现文本翻译功能 三、IChatCompletionService、ITextGenerationService、ITextEmbeddingGenerationService 很多情况都有这样的需求,使用自有系统…...

初始C++

感谢大佬的光临各位,希望和大家一起进步,望得到你的三连,互三支持,一起进步 个人主页:LaNzikinh-CSDN博客 文章目录 前言一.引用二.内联函数三.类和对象总结 前言 之前讲c的命令空间和第一个程序的运行,继…...

Chapter 5 Current Mirrors and Biasing Techniques

Chapter 5 Current Mirrors and Biasing Techniques 这一章介绍电流镜 5.1 Basic Current Mirrors MOS工作在饱和区, 表现为一个电流源. 考虑电源变化, PVT波动, 我们会首先产生一路精准电流源, 再复制这路电流. 如何复制呢? 电流转电压再转电流就行了, 如下图所示 考虑到…...

Avalonia Image控件上通过鼠标拖动画出矩形框

注册鼠标事件&#xff1a;首先&#xff0c;你需要注册 Image 控件上的鼠标事件&#xff0c;包括 PointerPressed、PointerMoved 和 PointerReleased。你可以在 XAML 文件或代码中注册这些事件。 <Image PointerPressed"Image_PointerPressed" PointerMoved"…...

Wireshark Lua插件入门

摘要 开发中经常通过抓包分析协议&#xff0c;对于常见的协议如 DNS wireshark 支持自动解析&#xff0c;便于人类的理解&#xff0c;对于一些私有协议&#xff0c;wireshark 提供了插件的方式自定义解析逻辑。 1 动手 废话少说&#xff0c;直接上手。 第一步当然是装上wiresh…...

XXE漏洞简介

目录 漏洞原理 漏洞危害 前置知识 XML简介 DTD简介 DTD的两种声明方式 实体 实体分类 内置实体(Built-inentities) 字符实体&#xff08;Characterentities&#xff09; 通用实体&#xff08;Generalentities&#xff09; 参数实体(Parameterentities) XXE漏洞…...

小白跟做江科大32单片机之蜂鸣器

1.复制之前编写的工程库项目&#xff0c;详细工程库创建过程如下链接&#xff1a; 小白跟做江科大32单片机之LED闪烁-CSDN博客https://blog.csdn.net/weixin_58051657/article/details/139295351?spm1001.2014.3001.55022.按照江科大老师给的图片进行连接蜂鸣器 接线时要用公…...

IsoBench:多模态基础模型性能的基准测试与优化

随着多模态基础模型的快速发展&#xff0c;如何准确评估这些模型在不同输入模态下的性能成为了一个重要课题。本文提出了IsoBench&#xff0c;一个基准数据集&#xff0c;旨在通过提供多种同构&#xff08;isomorphic&#xff09;表示形式的问题&#xff0c;来测试和评估多模态…...

MyEclipse使用教程

MyEclipse使用教程如下&#xff0c;按照以下步骤&#xff0c;您可以逐步熟悉并掌握MyEclipse的基本使用&#xff1a; 一、MyEclipse安装与准备 软件准备&#xff1a; 在使用MyEclipse之前&#xff0c;您需要确保已经安装了JDK&#xff08;Java Development Kit&#xff09;。J…...

TiDB学习9:Ti Cloud简介

目录 1. 为什么选择TiDB 2. 多租户 3. TiDB架构 4. 什么是TiDB Cloud 5. TiDB Cloud Provider Region 6. TiDB Cloud 入门 6.1 在浏览器中打开TiDB Cloud 6.2 创建您的账户 6.3 Developer Tier 与Dedicated Tier 6.3.1 Developer Tier 6.3.2 Dedicated Tier 6.3.2.…...

JavaScript 创建新节点的方法

在 JavaScript 中&#xff0c;可以使用 document.createElement() 方法来创建新的节点。该方法接受一个字符串参数&#xff0c;表示要创建的节点类型&#xff0c;如 "div"、"p" 等。 创建一个新节点的基本步骤如下&#xff1a; 使用 document.createElem…...

在phpstorm2024版里如何使用Jetbrains ai assistant 插件 ?

ai assistant激活成功后&#xff0c;如图 ai assistant渠道&#xff1a;https://web.52shizhan.cn/activity/ai-assistant 在去年五月份的 Google I/O 2023 上&#xff0c;Google 为 Android Studio 推出了 Studio Bot 功能&#xff0c;使用了谷歌编码基础模型 Codey,Codey 是…...

进程间通信(27000字超详解)

&#x1f30e;进程间通信 文章目录&#xff1a; 进程间通信 进程间通信简介       进程间通信目的       初识进程间通信       进程间通信的分类 匿名管道通信       认识管道       匿名管道       匿名管道测试       管道的四种…...

从BUUCTF的Hack World靶场,聊聊那些年我们踩过的SQL注入“异或”盲注坑

从BUUCTF的Hack World靶场&#xff0c;聊聊那些年我们踩过的SQL注入"异或"盲注坑 在CTF竞赛的Web安全赛道上&#xff0c;SQL注入始终是经久不衰的考点。当新手们刚掌握联合查询和报错注入时&#xff0c;往往会在一道名为Hack World的题目前栽跟头——这道来自CISCN2…...

突破性AMD Ryzen硬件调试方案:SMUDebugTool深度解析与实战指南

突破性AMD Ryzen硬件调试方案&#xff1a;SMUDebugTool深度解析与实战指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: ht…...

从Dify到Coze再回来:一个后端开发用Gin+Swagger构建AI工作流的踩坑实录

从Dify到Coze再回来&#xff1a;一个后端开发用GinSwagger构建AI工作流的踩坑实录 作为一名长期使用Gin框架的后端开发者&#xff0c;当我第一次尝试将现有服务接入Dify平台构建AI工作流时&#xff0c;本以为会是一次顺畅的旅程。毕竟&#xff0c;我们的API已经通过Swagger 2.0…...

为什么小数据集上神经网络会突然‘开窍‘?揭秘Grokking现象背后的LU机制

为什么小数据集上神经网络会突然"开窍"&#xff1f;揭秘Grokking现象背后的LU机制 在机器学习实践中&#xff0c;我们常常观察到一种反直觉的现象&#xff1a;当神经网络在小规模算法数据集上训练时&#xff0c;测试准确率会在长时间停滞于随机猜测水平后突然跃升至接…...

SmolVLA开发环境搭建:从操作系统安装到模型运行的完整路径

SmolVLA开发环境搭建&#xff1a;从操作系统安装到模型运行的完整路径 如果你刚拿到一台新电脑&#xff0c;或者想把旧机器彻底清理干净&#xff0c;从头开始搭建一个能跑SmolVLA模型的环境&#xff0c;那这篇文章就是为你准备的。很多教程都假设你已经有了一个可用的系统&…...

40 个 AI agent 跑营销,还不是最狠的

过去一年&#xff0c;AI 做营销最常见的用法&#xff0c;还是写文案、出海报、改标题、做几个短视频脚本。大家也都看腻了。 现在&#xff0c;真正的变化开始了。 AI 开始往营销里最难、最费人、但又最影响结果的地方发起来进攻&#xff0c;那就是&#xff1a; 盯数据、跑测…...

OpenRGB:开源跨平台RGB灯光控制方案,告别多软件困扰实现设备统一管理

OpenRGB&#xff1a;开源跨平台RGB灯光控制方案&#xff0c;告别多软件困扰实现设备统一管理 【免费下载链接】OpenRGB Open source RGB lighting control that doesnt depend on manufacturer software. Supports Windows, Linux, MacOS. Mirror of https://gitlab.com/CalcPr…...

强化学习实战:Sarsa vs Q-learning,on-policy和off-policy到底怎么选?

强化学习实战&#xff1a;Sarsa与Q-learning的深度对比与策略选择指南 1. 理解策略分类的核心逻辑 在强化学习领域&#xff0c;策略选择直接影响算法的行为模式和学习效果。我们先从最基础的概念切入&#xff1a;什么是策略&#xff1f;简单来说&#xff0c;策略就是智能体在特…...

【限时公开】Cuvil 0.8.3+PyTorch 2.3+Linux内核6.5组合部署黄金配置(含3个已知crash漏洞规避补丁)

第一章&#xff1a;Cuvil 编译器在 Python AI 推理中的应用 避坑指南Cuvil 是一个面向 AI 模型推理优化的轻量级编译器&#xff0c;支持将 PyTorch/TensorFlow 模型图转换为高性能、低延迟的 C 执行后端。在 Python 生态中直接集成 Cuvil 时&#xff0c;开发者常因环境兼容性、…...

springboot+vue基于web的校园商铺摊位管理系统

目录功能模块分析技术实现要点扩展功能建议数据库设计关键表项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作##同行可拿货,招校园代理 ,本人源头供货商功能模块分析 后台管理模块&#xff08;SpringBoot&#xff09; 管理员登…...