记录一次生产环境bug的调试

记录一次生产环境bug的调试

  • 先交代下问题以及背景:
            公司数据处理中的一个job一直跑的好好的,突然从某一天开始job执行失败,重启环境后又正常执行,简单查看问题日志,日志中出现大量connection reset信息,问题不间断出现,并且dev环境无法重现。

  • 初始思路
            一开始运维把问题当作一个简单的网络连接中断问题来对待,修复思路大概开发是对运算框架中如果出现了类似的connection中断问题添加对应的重连机制进行应对。

  • 实际问题
            随着时间推移,问题越来越频繁,甚至重启后job都会继续失败。于是需要对线上的实际情况进行进一步摸排。首先查看了业务代码,发现一些做join的表没有做合适的缓存,另外一些数据量非常大的raw data中的filter数据貌似也没有生效,导致上亿的数据直接被计算框架拉入了jvm中,而之前的运算又迟迟没有结束,大量的线程处于运算中。有了这个发现于是在任务失败后让运维拉取了jstat -gcutil状况,发现果不其然,一次任务执行触发了多次的fullgc ,因为生产环境使用的是G1,如此多的的full gc充分说明了问题

S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT

  0.00 100.00  65.99  41.09  91.41      -   3327  668.558    24 1436.491 2105.048

    &nb

### 常见的程序错误调试方法 对于程序中的错误,采用系统的调试策略至关重要。一种有效的方法是在编写代码时就融入预防措施,比如使用 `try-except` 结构来捕捉并处理可能发生的异常情况[^1]。 #### 使用详细的日志记录 为了追踪应用程序内部的状态变化,在适当的位置加入详尽的日志可以帮助定位问题所在。这不仅限于发生错误的地方,也应覆盖到重要的业务逻辑节点。通过分析这些日志文件,开发者可以获得关于程序运行状况的第一手资料。 #### 断点调试技术 借助IDE内置的功能或者命令行工具设置断点,可以在特定条件下暂停执行流程以便仔细检查变量值和其他状态信息。这种方式特别适用于那些难以重现的问题场景。 #### 单元测试与集成测试 构建全面而细致入微的单元测试套件能有效地发现潜在缺陷,并确保每次修改都不会破坏现有功能。与此同时,定期开展集成测试有助于验证不同模块之间的交互是否正常运作。 #### 版本控制系统辅助排查 版本控制软件如 Git 不仅方便多人协作开发项目,而且其提供的历史变更记录也是解决问题的重要资源之一。当遇到新引入的 bug 时,可以通过比较最近几次提交间的差异快速锁定可疑区域[^2]。 #### 自动化监控与告警机制 针对生产环境部署的服务端应用而言,实施持续性的性能监测不可或缺。一旦检测到异常行为模式,则立即触发通知提醒相关人员介入调查。例如,在容器化环境中,任何偏离常规操作特征的应用实例都值得警惕[^4]。 ```python import logging logging.basicConfig(level=logging.DEBUG, filename='app.log') def divide(a, b): try: result = a / b except ZeroDivisionError as e: logging.error(f"Zero Division Error occurred: {e}") return None else: logging.info("Successfully performed division.") return result finally: logging.debug("This block always executes after the try and except blocks.") print(divide(10, 2)) print(divide(10, 0)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值