当前位置: 首页 > 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; 进程间通信 进程间通信简介       进程间通信目的       初识进程间通信       进程间通信的分类 匿名管道通信       认识管道       匿名管道       匿名管道测试       管道的四种…...

一、大模型推理

https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md https://github.com/hiyouga/LLaMA-Factory/blob/main/examples/README_zh.md 安装 v7.1 https://github.com/hiyouga/LLaMA-Factory/releases/tag/v0.7.1 git clone --depth 1 https://github.com/hiyoug…...

.NET IoC 容器(三)Autofac

目录 .NET IoC 容器&#xff08;三&#xff09;AutofacAutofacNuget 安装实现DI定义接口定义实现类依赖注入 注入方式构造函数注入 | 属性注入 | 方法注入注入实现 接口注册重复注册指定参数注册 生命周期默认生命周期单例生命周期每个周期范围一个生命周期 依赖配置Nuget配置文…...

Day44 动态规划part04

背包问题 01背包问题&#xff1a;每件物品只能用一次完全背包问题&#xff1a;每件物品可以使用无数次 01背包问题 暴力解法&#xff1a;每一件物品其实只有两个状态&#xff0c;取或者不取&#xff0c;所以可以使用回溯法搜索出所有的情况&#xff0c;那么时间复杂度就是 o…...

html期末复习速览

一.基础标签 1.段落标签<p></p> 特点&#xff1a;分段分割 2.标题标签<h1></h1>……<h6></h6> 特点&#xff1a;文字加粗&#xff0c;单独占一行 3.换行标签<br /> 特点&#xff1a;单标签&#xff0c;强制换行 二.文本格式化…...

CTFHUB-信息泄露-目录遍历和PHPINFO

目录 目录遍历 PHPINFO 目录遍历 很简单&#xff0c;挨着把每个目录都点开看一下 发现2目录下有个 flag.txt 文件&#xff0c;点开发现了本关的flag PHPINFO 这关也很简单&#xff0c;进来之后是一个phpinfo页面&#xff0c;按 CTRL F键打开查询&#xff0c;输入flag&#…...

面向Java程序员的Go工程开发入门流程

对于一个像我这样没有go背景的java程序员来说&#xff0c;使用go开发一个可用的程序的速度是肉眼可见的缓慢。 其难点不在于go语言本身&#xff0c;而是搭建整个工程链路的过程&#xff0c;即所谓的“配环境”。 本文主要讲述如何配出一个适合go开发的环境&#xff0c;以免有同…...

vue3开发高德地图

在vue3的index.html 使用动态注入地址名和key <html lang"en"><head><meta charset"UTF-8" /><link rel"icon" type"image/svgxml" href"/vite.svg" /><meta name"viewport" conten…...

通过DLL方式链接glfw3.dll

主要是CMakeLists.txt文件变化 cmake_minimum_required(VERSION 3.10) project(glfwTest) set(CMAKE_CXX_STANDARD 11) aux_source_directory(. SRC_SOURCES) set(GLFW_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include) set(GLFW_LIBRARY_DIR ${CMAKE_SOURCE_DIR}/lib/glfw) add_ex…...

Python自然语言处理(NLP)库之NLTK使用详解

概要 自然语言处理(NLP)是人工智能和计算机科学中的一个重要领域,涉及对人类语言的计算机理解和处理。Python的自然语言工具包(NLTK,Natural Language Toolkit)是一个功能强大的NLP库,提供了丰富的工具和数据集,帮助开发者进行各种NLP任务,如分词、词性标注、命名实体…...

sqoop操作

介绍 sqoop是隶属于Apache旗下的, 最早是属于cloudera公司的,是一个用户进行数据的导入导出的工具, 主要是将关系型的数据库(MySQL, oracle...)导入到hadoop生态圈(HDFS,HIVE,Hbase...) , 以及将hadoop生态圈数据导出到关系型数据库中 操作 将数据从mysql中导入到HDFS中 1.全量…...