热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

可定位性设计

码农们记忆最深刻的时刻非联调莫属了,在一个大型软件项目中,大量的特性的合入往往伴随着问题的大爆发,在蜂拥而至的虫族(bug)面前,定位手段就是码农们手中赖以战斗的武器!良好的定位手段能快速找出隐藏的b

码农们记忆最深刻的时刻非联调莫属了,在一个大型软件项目中,大量的特性的合入往往伴随着问题的大爆发,在蜂拥而至的虫族(bug)面前,定位手段就是码农们手中赖以战斗的武器!良好的定位手段能快速找出隐藏的bug,为快速消灭bug争取宝贵的时间。


在交付的压力面前,码农们往往没有足够的时间来进行定位手段的添加,没有定位手段保护的模块,在疯狂的虫群面前就像待宰的羔羊。

问题定位慢,就需要更多人力和时间的投入,没有精力进行剩余特性的开发和模块的持续优化,更糟糕的情况下,如果没有足够的信息支持问题定位,就需要进行依赖问题的复现,而很多问题恰恰又难以复现,就只有在发布前夕组织通宵达旦的攻关,伤神又伤身。

虫群的几轮冲击下来,码农们四处救火、疲惫不堪,模块质量更加恶化,陷入了恶性循环中。


作为一名有追求的码农,我们的精力应该投入到更有创造性的活动上,不应该在问题定位上耗费大好青春,更早的开展可定位性设计,就可以在联调阶段节省大量的问题定位时间,为解决问题、优化代码和追求美眉留下宝贵的时间,引导开发过程进入良性循环,此即磨刀不误砍柴工是也。


开展可定位性设计,首先我们要知道系统中存在哪些故障,建立起我们的故障模式库,才能有针对性的对症下药。

以作者从事的Linux内核开发为例,归纳起来,系统的故障大致分为以下几类:

1,崩溃

往往由空指针引用、错误的内存地址引用等问题引起,内核态中往往会导致系统复位,用户态对应就是进程的异常终止。

系统复位后,内存中的信息往往会被冲乱,此类问题一般依靠调试日志和复位时的堆栈/寄存器信息来进行定位,我们需要在关键事件和异常分支中增加调试打印,以在出现问题后推测出系统当时的状态。

有一种方法值得尝试,复位时内存是不会断电的,因此内存中的内容在复位前后是不变的,在嵌入式系统中,我们可以令业务的数据存放在内存的高位,OS加载时一般不会使用到高位的内存,可以最大限度的保存复位前的信息,辅助问题的定位。

2,挂死

密集出现于资源死锁、流程互斥错误、时序控制错误等问题,系统挂死后将无法处理业务请求,是最致命的错误之一。

系统挂死的时候是静态的,在这个过程中我们可以自由的查看内存中的内容,因此定位起来相对较为简单,我们需要建立起数据结构之间的关联,并最终挂到一个全局变量上,这样我们就能够通过定位手段一步步找到可疑的数据进行察看。

一个简单的计数可以有效帮助快速定位到可疑的模块,模块的输入输出的计数不匹配时,流程很可能被挂起在其中。

3,错误

错误的产生原因多种多样,一部分是对输入的边界值处理不当、场景遗漏、大压力导致的,通常异常处理流程又是平常难以覆盖到的分支,这可能导致错误被层层扩散到整个系统中。

调试日志、计数都可以有效的帮助定位错误,通过对模块的输入输出结果做计数,我们可以追踪到错误产生的源头,调试日志则可以显示出错误是如何产生的。

4,性能

性能问题的特征是严重依赖于问题环境的保留,一旦过了性能差的时间段,就很难找到性能瓶颈了。

定位性能问题,我们需要在关键路径上添加性能统计,最有价值的信息是最近时间段内的统计信息,以及响应最慢的数个请求,我们可以以60s为周期进行统计,出现性能问题时,我们将最近60s的统计信息显示出来,基本上就可以初步定位到瓶颈的所在,再针对性的做检测。

5,数据不一致

最阴暗的问题,常常造成灾难性的后果。交给其他模块的数据,悄无声息的就变了,实在是让人头痛不已,而且你无法知道数据是在什么时候发生改动的,事实上,你甚至可能永远也不知道发生数据不一致了,就像你不知道钱包中钞票的序号一样,如果你不记得写下去的数据是什么,又如何知道读起来的数据不对呢?



未完待续。


故障检测

现场保存

现场查看

流程追踪


推荐阅读
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • Linuxchmod目录权限命令图文详解在Linux文件系统模型中,每个文件都有一组9个权限位用来控制谁能够读写和执行该文件的内容。对于目录来说,执行位的作用是控制能否进入或者通过 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文介绍了如何在VSCode中查看运行日志的方法,对于新手来说,需要注意日志文件的设置位置。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文介绍了在使用TortoiseSVN的Repo-browser浏览SVN时出现的错误,以及解决方法。文章提到了卸载当前版本、安装较低版本、使用更下一层的路径等解决方案。同时指出该问题可能是客户端与SVN服务端不匹配造成的,且服务端无法升级更高的SVN版本。 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • Elasticsearch1Elasticsearch入门1.1Elasticsearch术语1.1.16.0以前的Elasticsearch术语1.1.26.0以后的Elasti ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
author-avatar
哥斯拉2502919771
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有