首页 > 其他分享 >服务压测偶现卡住问题分析

服务压测偶现卡住问题分析

时间:2023-12-28 14:55:47浏览次数:30  
标签:链表 结论 加锁 压测 卡住 偶现 队列 对象 日志

服务框架介绍

服务是一个生产者,一个消费者,通过对象池分配对象,通过加锁队列进行数据交互。

现象

通过观察服务日志,发现服务经常报timeout错误

初步定位

内核打印执行步骤,发现服务是阻塞在最后一帧,由于内核没有发出最后一帧,因此服务一直在尝试获取最后一帧

详细日志分析

通过分析,发现最后一帧数据没有发出来是因为队列中数据被破坏了,生产者生产了数据,压入队列,消费者在提取数据时,队列中链表关系就被破坏了

分析过程

第一步:因为对象池和加锁队列都已经运行5年了,开始不能怀疑是这两个结构出了问题,对于这种异常,先怀疑是最近修改的代码导致内存越界,因此引发这种异常现象。
结论:通过内存检测工具,未发现内核有内存泄露

第二步:开始分别阅读对象池和加锁队列源码
结论:两份源码都没有发现异常,但是发现对象池和加锁队列共用一个队列,两者都会对元素的前项指针和后项指针进行操作,这是有问题的

第三步:放弃使用对象池,直接分配内存
结论:问题被解决,但是实现方案不好,频繁分配内存会造成内存碎片,继续研究对象池方案

第四步:拆分对象池和加锁队列,让他们使用不同的链表节点
结论:测试下来没有解决问题

第五步:继续加日志,分析日志
结论:在分析过程中发现服务运行中会出现队列中的数据和队列长度不一致的情况。

第六步:对于数据和队列长度不一致的情况,怀疑是队列没有加锁导致,对队列加锁部分增加日志
结论:队列加锁没有问题,但是偶然发现从对象池中获取数据,在没有归还之前居然还可以取出来继续被使用,这里不符合预期,
检查对象池代码,发现对象池和加锁队列还是共用的一个链表节点,修改代码继续测试

最终结论:问题解决。

小结

其实对象池本身是没有问题的,加锁队列本身也是没有问题。当时在第二步我就发现对象池和加锁队列共用链表可能有问题,
但是当时修改代码不细致,得出了第四步错误的结论,使得我定位问题多花了一天时间。
定位这种问题,修改代码一定要细节,修改的部分可以加日志确认,问题分析正确由于错误的编码得出错误的结论是不应该的。

标签:链表,结论,加锁,压测,卡住,偶现,队列,对象,日志
From: https://www.cnblogs.com/zhanggaofeng/p/17932725.html

相关文章

  • 压测工具(vegeta)-测试haproxy
    一、压测工具vegeta1、介绍Vegeta是一个用Go语言编写的多功能的HTTP负载测试工具,它提供了命令行工具和一个开发库。 官方地址:https://github.com/tsenart/vegeta2、安装Vegeta wgethttps://github.com/tsenart/vegeta/releases/download/v7.0.3/vegeta-7.0.3-linux-......
  • Jmeter 压测工具使用手册(完整版)
    一、jemter简介jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单。因为jmeter是java开发的,所以运行的时候必须先要安装jdk才可以。jmeter是免安装的,拿到安装包之后直接解压就可以使用,同时它在......
  • logstash抽取clickhouse数据库偶现网络错误异常并提示FORMAT TabSeparatedWithNamesAn
     如上图错误信息所示,可以看到第一次sql查询是正常的,在第二次offset偏移的时候报了网络错误。起初的想法就是clickhouse的问题,把sql粘贴出来放入clickHouse中单独执行发现sql并无问题。然后又认为是logstash的问题并分别下载了logstash-7.3.1、logstash-7.17.15、logstash-8.11.......
  • VS2022远程调试Linux程序卡住问题解决
    问题:说明:使用vs2022第一次远程调试linux上的程序时,会出现调试器启动时卡住问题。原因就是第一次调试时,会在目标服务器下下载vsdbg工具,因为下载源在国外,所以下载特别慢,就会造成卡住的现象。解决:uname-m 查看远程调试时,用户文件夹下会多一个.vs-debugger隐藏文件夹,如果是使用......
  • 《安富莱嵌入式周报》第329期:圣诞前夕,各种软件井喷式更新,开源600Wh的UPS低压电源,各种
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 圣诞前夕,各种软件井喷式发布新版本视频版:https://www.bilibili.com/video/BV19Q4y1u7Es 1、开源600Wh的UPS低压电源https://pop.fsck.pl/projects/secondlife-ups-Mk......
  • Golang压测ws
    packagemainimport( "fmt" "log" "sync" "time" "github.com/gorilla/websocket")funcmain(){ //设置要压测的WebSocket服务地址 url:="ws://192.168.252.128:8080/" //设置并发请求数量 concurrency:=1......
  • TiDB在银行业核心系统POC测试应用压测参考手册
    背景在信创和国产化的背景下,政企银行国企等会在不久的将来全面实现国产化。就银行业底层使用的数据库而言,会逐步从小oracle小机、DB2大机等国外产品逐步替换为使用国产数据库,从边缘系统开始替换积累使用经验,后逐渐全面覆盖到核心系统。在核心系统迁移到国产数据库前,需要做很多测试......
  • 作为DBA,你需要掌握这些压测工具
    前言:数据库系统正式上线前,压测是必不可少的一步。数据库系统能承载多少并发,DBA要做到心中有数。基本概念:TPS/QPS:衡量吞吐量。(TPS:每秒事务处理量(TransactionPerSecond)、每秒查询率QPS(QueryPerSecond)是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准)响应......
  • ConcurrentHashMap一直卡住bug
    目录jdk11ConcurrentHashMapbug,会一直卡在这里:"main"#1prio=5tid=0x00007f4bd8029800nid=0xbd75runnable[0x00007f4bde485000]java.lang.Thread.State:RUNNABLEJavaThreadstate:_thread_in_vm_trans-java.util.concurrent.ConcurrentHashMap.trans......
  • 使用阿里云性能测试工具 JMeter 场景压测 RocketMQ 最佳实践
    作者:森元需求背景新业务上线前,我们通常需要对系统的不同中间件进行压测,找到当前配置下中间件承受流量的上限,从而确定上游链路的限流规则,保护系统不因突发流量而崩溃。阿里云PTS的JMeter压测可以支持用户上传自定义的JMeter脚本,按照自定义的逻辑,借助PTS强大的分布式压测能力......