意想不到,这个神奇的bug让我加班到深夜

减小伺服电机共振的方法(以松下伺服为例) 嘿 ! 我是【小黄】 , 我们又见面啦 !!! 毕竟技术只有大家交流才会进步嘛 ! 这博客是对自己学习的一点点记录和总结 ,如果您对自动控制感兴趣的话 ,可以关注一下我的动态 , 我们一起学习呀 ! 我们都还年轻 ,我们还有无限可能 。 YES ! 减小伺服电机共振的方法(以松下伺服为例)1. 准备工作:1.1.1 如何推定共振点:1.1.2 测定实操:1.1.3 总结:2. 下期预告: 在我们调试完伺服参数以后机器人运动到某个特定位置会产生振动或异响,我们要做的就是消除这个异响保.. 阅读详情

给大家分享一个近期解决的线上问题,起因是这样的,近期参与公司的一个项目,工程量很大,代码编写测试过后终于到了紧张的上线时刻。

 

项目上线

上线前照例忐忑不安了一番,因为工程量比较大,预估可能不会很顺利,但还不至于到了祈祷服务器不要出bug的地步,bug对于程序员来说简直是家常便饭,没有bug反而可能会嘀咕半天,这都是职业病,没治。

紧张了一会儿,我屏气凝神,点了上线按钮,那一刻简直就像在点核按钮一样,生怕点下去后服务器会轰的一声炸掉。

结果一切正常。。。

这不对啊,这时博主的职业病又犯了,这么大的改动不会这么顺利吧,内存、CPU、tp99耗时一切正常,这太不正常了吧。

 

说曹操曹操就到

就在博主想为什么没有bug时,bug简直就像听到了我的召唤一样如约而至,博主当时甚至在想为什么梦想中的500万彩票就这么不听话呢?

(bug妹妹:“程序员哥哥,我来啦”;

500万妹妹:“不,程序员哥哥,不要说门,窗户都没有。。。”)

上线最初一切正常,问题就出在了接下来的一段时间里。

在接下来的时间里,tp99耗时就像通货膨胀一样不可遏制的一路上扬,线上收入就像股市一样不可遏制的一路重挫。

这时博主的内心反而踏实了很多,没错,就是这个味儿,还是熟悉的配方还是熟悉的味道,I know it。

废话少说,赶紧回滚,线上恢复正常后接下来就是问题排查了。

 

排查问题

从监控上看,一次请求的处理时间会越来越高,那么显然问题的关键就是定位耗时出现在了哪段代码上。

没有办法,只能一点一点的去找监控了,幸好代码中监控比较丰富,一番梳理后最终锁定在了这样一行代码:



// 监控代码
obj a = b;
// 监控代码

这段代码本质上是在干什么呢?很简单,就是对象的copy,而且在我们的实现中还是浅copy,也就是仅仅copy了一些字段。

从监控看就是这行代码导致了tp99耗时不断上涨。

这。。这怎么可能呢?简简单单的一个对象拷贝竟然会让耗时上涨那么多,而且还是随着时间缓慢上涨,这也太神奇了吧。

当人遇到自己不能理解的问题时通常会归因于外部因素,博主也不能免俗。

接下来就是怀疑人生的时刻。

不会是监控有问题吧,不会是编译器的原因吧,不会是硬件的原因吧,不会是天气的原因的吧,不会是马上就要国庆放假的原因吧,总之不是我的原因。

一番思索后最终理性战胜了自己,哪有那么多原因,在没有其它证据下目前看就是这个对象拷贝导致的。

那么为什么一个简单的对象拷贝会导致CPU消耗越来越高,耗时越涨越多呢?

这里的关键在于意识到这一点,既然随着时间的推移耗时会越来越高,那么很显然是某个全局性质的数据随着请求的处理越堆积越多,而出问题的这个对象使用到了这个全局数据。没错,就是这样,终于要见到曙光啦,哈哈,激动!

这就解释了为什么这个对象随着时间的推移就和美债一样越滚越多,变得越来越庞大了,虽然美国政府可能没打算还美债,但是CPU拷贝越来越多的数据必然导致耗时越来越高。

 

找出bug

既然明确了方向,接下来就有针对性了。

首先去看一下这个对象都有哪些成员变量,对于内置类型像int、bool之类肯定不会有问题,因为这些类型的变量大小是固定的,需要注意的就是这种vector、set之类的容器。

最终经过一番检查后断定问题就是出在了某个vector成员变量上,同时也验证了上述猜想。

 

真相大白

问题是这样的。

这个对象的某个vector成员变量每次在处理请求时都要用另一个对象(假设为对象A)的数据来进行初始化,就像这样:

 

在每次处理一个请求之前,A持有的Data都会被push一些特定的数据。

而系统为了优化内存分配开销,对象A被放到了内存池中,就像这样:

由于对象被放到了内存池,因此对象A是不会被释放的,这就让对象A无形中变为了全局性质的对象。

现在,有的同学可能已经发现问题了,那就是,如果对象A在放回内存池后没有清空持有的Data,那么就会导致这样的一个问题,那就是A持有的Data随着每个请求的到来不断的被push数据,这就会导致A持有的Data就像泡沫一样越吹越大,相应的Obj对象持有的vector也会越来越大:

 

在这种情况下拷贝Obj对象必然要拷贝持有的vector,由于vector越来越大,因此消耗在拷贝上的时间也越来越多,使用内存池本意是好的,但由于使用完后忘记清理其保存的旧数据反而造成了内存泄漏。

 

经验教训

这次的问题从代码编写角度看是这样的,对象A中Data字段的清理工作没有放在对象A的Clear函数,反而要靠使用者自己清理,由于代码非常复杂极其容易疏漏,博主就在这里踩坑了。。。

因此,总结下来经验教训就是:

  1. 向类中添加新成员时一定要注意其清理工作,使用前一定要确保该成员是崭新的,里面没有之前旧存货。

  2. 代码中添加必要的监控,有利于排查问题

  3. 测试的时间要稍微长一些,否则类似这里的问题不容易暴露

  4. 程序员遇到bug是很正常的,大胆假设,小心求证,每次问题的解决都是能力的提升

查到问题后,修bug、自测、验证、代码提交一气呵成,再次上线就明天了,收工回家。

从下午上线发现问题到问题解决耗时超过6小时,博主到家时,已是满天繁星。

希望本文能帮助大家避开一些坑,关注公众号“码农的荒岛求生”回复“bug”你会看到博主踩过的坑,也希望你能少走弯路。

 

Eplan P8自动线号生成全攻略:从电位定义点到连接编号的完整流程 本文详细解析了Eplan P8自动线号生成的全流程,从电位定义点的创建配置到连接编号的标准化管理,帮助电气设计人员提升图纸规范性和工作效率。重点介绍了自动编号方案的定义与调整技巧,以及企业级标准化实施建议,是掌握Eplan P8自动线号功能的实用指南。 阅读详情

相关推荐

Ubuntu图形界面崩溃?从tty到GUI的终极修复指南

本文提供了Ubuntu图形界面崩溃后进入tty的终极修复指南。详细介绍了如何诊断显示管理器(如LightDM或GDM3)状态,并通过重装、切换显示管理器、修复依赖、系统升级及排查显卡驱动等核心方案,逐步恢复GUI。帮助用户从命令行界面高效修复桌面环境,避免数据丢失。

vulkan6gpu的博客 778

JavaScript 如何在所有的浏览器中,均可获取元素当前显示样式

一、代码部分 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> #box{ width: 200px; height: 200px; ...

路虽远,行则必至! 898

LTE 中设置voice/data centric的差异

1. 什么是voice centric和data centric Voice centric和data centric的差别在于以语音为中心还是以数据为中心。这里的以某某为中心可不是说说而已。举个栗子,UE一般搜网注册都会按照LUG(LTE->UMTS->GSM)或者LC(LTE->CDMA)的顺序进行,如果UE(未开通VOLTE)注册到LTE时,网络提示不支持语音,比如CSFB。UE就必须disable LTE后回到GU或者CDMA,否则留在不能语音的网络下,UE就会...

alimingh的博客 5234

@程序员,你还在加班写 Bug 吗?

并非所有的bug都值得改,也可以不改。作为软件开发者,最想做的事情就是给客户建立并发布最完美的产品和功能。但你也知道,软件开发并不容易,每次修改肯定都会引入bug。毕竟,...

优快云资讯 1327

AD9361数字调制入门:从IQ调制原理到动手实现第一个ASK信号(Vivado工程详解)

本文详细介绍了如何使用AD9361射频收发器实现ASK数字调制,从IQ调制原理到Vivado工程实现。通过Verilog代码示例和FPGA架构设计,帮助开发者理解纯逻辑实现数字调制解调的关键技术,特别适合软件无线电(SDR)初学者入门实践。

weixin_29158047的博客 374

用Origin快速拟合荧光寿命、PL Decay (TRPL)数据分析处理

用Origin快速拟合荧光寿命、PL Decay (TRPL)数据分析处理

A20802013的博客 2万+

程序员如何在春节假期避免加班?

点击上方“程序人生”,选择“置顶公众号”第一时间关注程序猿(媛)身边的故事平日奋战在修复BUG前线的IT界精英程序员们马上就要开始新年假期了平时加班忙成狗的你今年过年想好怎么做才能不加班了么?回想2017年那轰动全国的被迫加班莫过于鹿晗和关晓彤公开恋情导致微博服务器瘫痪的事件万万想不到鹿晗表白来的如此突然即使程序员在自己的婚礼上也难逃加班悲剧但是我!不!相!信!我们程序员只有加班的命!所以今年过

程序人生的博客 3467

华为P812E光猫补全shell配置PON口模式

终于看到华为企业级的带2.5电口P812E横空出世了,相信很多发烧友也已经将此收入昂中。相信体验的同时,遇到的第一件事情就是配置PON口模式的问题,本文将带发烧基友解锁模式。

GUAIYU的博客 5726

意想不到,这个神奇的 Bug 让我加班到深夜

作者 |码农的荒岛求生来源 |码农的荒岛求生(ID:escape-it)给大家分享一个近期解决的线上问题,起因是这样的,近期参与公司的一个项目,工程量很大,代码编写测试过后终于到了紧...

程序人生的博客 558

AD936x Evaluation Software 实战配置指南:从寄存器设置到滤波器优化

本文提供AD936x Evaluation Software的实战配置指南,详细解析从工程创建、RF向导与时钟模块配置,到数字滤波器优化、数字接口设置及增益控制的完整流程。重点分享寄存器设置、滤波器系数权衡及PLL稳定技巧等核心要点,帮助开发者高效配置AD9361/AD9363射频芯片,快速应用于SDR、基站等场景。

perl8的博客 697

STM32--LoRa通信模块

模块根据MD0的配置与AUX引脚的状态会进入不同的功能其中在通信功能下,包含4种工作模式。

qq_47258284的博客 1万+

意想不到!这个神奇的bug让我加班到深夜

意想不到!这个神奇的bug让我加班到深夜 2021-05-30 16:07:08·马小乎 给大家分享一个近期解决的线上问题,起因是这样的,近期参与公司的一个项目,工程量很大,代码编写测试过后终于到了紧张的上线时刻。 项目上线 上线前照例忐忑不安了一番,因为工程量比较大,预估可能不会很顺利,但还不至于到了祈祷服务器不要出bug的地步,bug对于程序员来说简直是家常便饭,没有bug反而可能会嘀咕半天,这都是职业病,没治。 紧张了一会儿,我屏气凝神,点了上线按钮,那一刻简直就像在点核按钮一样,生怕点下去

maxiao112的博客 169

华为OD机试真题 新系统【查找能被整除的最大整数】

华为OD新系统机试真题【查找能被整除的最大整数】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【查找能被整除的最大整数】

qq_45776114的博客 671

记一个神奇的Bug

多年以后,当Abraham凝视着一行行新时代的代码在屏幕上川流不息的时候,他会想起2019年4月17日那个不平凡夜晚,以及在那个夜晚他发现的那个不可思议的Bug。 虽然像无数个普普通通的夜晚一样,我在公司加班,一样ssh到公司在北京的服务器,但是发现resnet50的计算精度比上一版代码低了1%。一通着急忙慌的Debug之后无济于事,只能求助于Git来比较新旧版本异同。 由于精度降低...

dianhuo7207的博客 208

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

放弃加班写BUG!程序员用DeepSeek竟能躺着完成项目?

结果用DeepSeek的版本适配器,边喝奶茶边点"自动转换"按钮,下班前居然收到了成功编译的通知。最让我感动的是迁移报告里那行小字:"发现3处JPA方法命名不规范,已自动修正"——这哪是工具,分明是请了个不要工资的代码审查员。上次赶着交差时,我试着在控制台输入"生成带熔断机制的Feign客户端",20秒后得到的模板代码不仅整合了Hystrix,连降级策略都预设了三种模式。更离谱的是,当我把同事写的复杂SQL贴进调试区,它居然用JPA的Specification重写了一版,性能直接提升了40%。

weixin_50019283的博客 284

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【python实用小脚本-36】深夜加班救星!一行Python代码让你的电脑自动关机

这里我们创建了一个“关机按钮”。os.system是跟电脑对话的传声筒,/s表示“我要关机啦”/t 1表示“1秒后执行”,避免突然袭击这个小小的自动关机脚本,就像给电脑设了个“生物钟”。深夜加班时强制自己准时睡觉下载大文件时设置“完成后自动关机”给家里的熊孩子限制定时游戏时间编程的魅力就在于此:用几行代码,就能把枯燥的重复操作交给电脑,把时间留给自己真正重要的事情。需要完整源码的朋友,欢迎在评论区留言,或者私信我,让我们一起用代码打造更聪明的生活!

kylner的博客 815

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

coze-loop神奇之处:自动修复bug功能实测

本文介绍了如何在星图GPU平台上一键自动化部署🔄 coze-loop - AI 代码循环优化器镜像,实现代码自动修复与优化。该工具能智能识别并修复常见编程错误如空指针异常、数组越界等,提升开发效率与代码质量,适用于日常编程调试与代码审查场景。

weixin_33480380的博客 261

程序员的10个神秘等式

假如你是一个程序员,那你可能发现一些非常神秘的等式,屡屡出现在程序员的生活里,让人哭笑不得。1.深夜独自写代码 === 高效率高产出2.加班写代码 === 低效率...

qq_24520459的博客 163

我是程序员,每一天都太难了!

互联网圈子里有一个神奇的群体——程序员。他们每天穿着格子衫,背着双肩包挤地铁,一到公司就陷入了“打代码-喝水-上厕所-打代码-喝水-上厕所”的死循环。热(jia)爱(ba...

腾讯技术工程 1636

程序员 -- 黎明前凋零的奇葩

最近,不知道为什么,老是觉得自己越来越来像夜间的某种生物,到底像什么呢?是的,吸血僵尸,没错,一只完全失去理智的吸血僵尸,还是国外有文化的那种,呵呵,伯爵之类的。 在一行行code的驱动下,在一篇篇blog的更新中,一朵尚未开放的奇葩也将随着黎明前微冷的寒风渐渐凋零,眼睁睁的看着那一丝匆忙掠过的晨光,抓住了却又不得不放开,因为实在是没有精力了,真的累了!当一个程序员累了,当一朵...

a994182的博客 146

深夜调试API的我,竟被这款神器拯救了…

更惊喜的是,当我对着杂乱的JSON响应发愁时,点击**“一键生成测试用例”**,系统竟然自动写好了断言脚本!昨天,当我看着新来的实习生用Hapydev5分钟定位到嵌套参数错误时,突然想起那个抓狂的深夜——有些工具,真的能改变程序员的命运。而当我把平台安利给团队时,最挑剔的CTO也点了头——权限管控细到能限制实习生只看特定接口,审计日志详细记录每个操作的设备指纹。最让我泪目的是——出差时在高铁上准备用手机打开浏览器准备扫码登陆,打开软件后直接调出了昨天未完成的测试任务!毕竟,我们的头发,值得被温柔以待。

weixin_48333069的博客 422

我是一个程序媛,是一个精致的女程序媛

我是一个程序媛,是一个精致的女程序媛 我是一个女程序媛,毕业于一个普通的大学,13年毕业,我喜欢写代码,喜欢看着一个个error被征服,喜欢见证那一行行英文变成美妙而神奇的东西,那种喜欢,是皮肤变差、样子变丑也不能阻止的。于是我在程序员的这条“不归路”上,越走越远。 ...

Connector_的博客 500

从熬夜改Bug到半夜哄娃,程序员的双向日常

不搞复杂开发,不啃源码,就简单复盘下这周踩的坑,随便写写碎碎念。第一,高并发场景下的分页查询,千万别只依赖数据库原生分页,一定要加一致性校验和重试兜底,不然很容易出现数据重复、错乱、漏数据的问题,线上隐性问题最难排查。干后端久了真的深有体会,本地跑通真的啥也不是,线上稳定性拼的全是边界场景的兜底思维,很多问题根本不是逻辑错了,是没扛住真实的线上并发和网络波动。心态和刚入行完全不一样了,以前只求功能实现,现在首要就是稳,日志埋点能加就加,代码能简单绝不复杂,线上出问题,清晰的日志真的能救命。

itmigrate的博客 181

写给程序员的春节祝福:愿你代码无Bug,生活有彩蛋

程序员春节生存指南:嘴上说着放松,电脑包却放在门口。这一年我们扛过了无数需求、Bug和熬夜,热情少了但技能强了。新年愿望很简单:少点临时需求,多些正常作息。愿每个程序员新年代码无Bug,人生有彩蛋,既能扛项目也能守健康。春节快乐!

不务正业的猿 840
上一篇: 读取文件时,程序经历了什么?
下一篇: 终于明白了,一文彻底理解I/O多路复用
码农的荒岛求生
博客等级 码龄10年 969粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值