排查线上问题的9种方式

德国科技管理专家斯坦门茨早年移居美国,以其卓越才能在美国企业界崭露头角。有一次,福特公司的一组电机发生故障,公司在束手无策时请来了斯坦门茨。

斯坦门茨仔细观察电机,经过一番计算后,用粉笔在电机外壳上画了一条线,说:“从这里打开,把里面的线圈减少16圈。”工人们按照他的指示操作,电机果然恢复正常。福特公司支付酬金时,斯坦门茨索要了一万美元。

公司老板认为一条线要价一万美元太过昂贵。斯坦门茨回应:“用粉笔画一条线只需一美元,而知道在哪里画需要9999美元。”老板认为有理,最终支付了一万美元。

这个励志故事告诉我们,排查问题的重要价值不容小觑。今天我们就来总结一下排查问题的9种方法:

基础方法

监控告警

排查线上问题的9种方式问题发生时常用的手段包括生产测试、监控告警和人工客诉。人工客诉是我们最不愿意看到的,因此需要在业务受影响前及早发现。监控告警是发现问题的有效手段,具体可参考《通知&告警治理(降噪)的7种方法》这篇文章。

日志埋点

埋点是了解用户行为的重要步骤,但更重要的目的是识别用户的关键路径。通过注入特定的代码来记录关键指标,是提升应用性能的重要步骤。

日志和埋点之间存在细微差别。埋点可以看作是日志的子集,任何被埋点的数据都应该记录在日志中。

埋点负责发布关键性能数据以进行聚合分析,日志则提供了用户在不同级别跟踪应用的细节信息,从低到高依次为:

Verbose:几乎提供了所有细节,主要用于跟踪执行过程中的控制流Debug:表示数据主要用于调试Info:表示非错误信息Warning:表示可恢复的错误Error:表示不可恢复的错误日志的记录会贯穿应用的整个生命周期,而埋点只应在开发的特定阶段使用。通过埋点,可以收集特定类型或有价值的信息素材,基于这些素材可以进行许多有价值的分析和追踪。

问题复现

这个无需多解释,我们来聊聊复现的步骤:

● 确保所有步骤都被记录。记录下所做的每一件事、每一个步骤、每一个停顿。无意间丢失一个步骤或增加一个多余步骤,可能导致无法再现软件缺陷。在尝试运行测试用例时,可以利用录制工具准确记录执行步骤。所有目标是确保导致软件缺陷所需的全部细节是可见的。● 特定条件和时间。软件缺陷仅在特定时刻出现吗?软件缺陷在特定条件下产生吗?产生软件缺陷时网络是否繁忙?在较差和较好的硬件设备上运行测试用例会有不同的结果吗?● 压力和负荷、内存和数据溢出相关的边界条件。执行某个测试能导致产生缺陷的数据被覆盖,而只有在试图使用脏数据时才会再现。在重启BUG复现方法总结机器后,软件缺陷消失,当执行其他测试之后又出现这类软件缺陷,需要注意某些软件缺陷可能是在无意中产生的。

● 考虑资源依赖性,包括内存、网络和硬件共享的相互作用等。软件缺陷是否仅在运行其他软件并与其他硬件通信的“繁忙”系统上出现?软件缺陷可能最终证实与硬件资源、网络资源有相互作用,审视这些影响有利于分离和再现软件缺陷。● 不能忽视硬件。与软件不同,硬件按预定方式工作。板卡松动、内存条损坏或CPU过热都可能导致像是软件缺陷的失败。设法在不同硬件上再现软件缺陷。在执行配置或兼容性测试时特别重要。判定软件缺陷是在一个系统上还是在多个系统上产生。

抓包分析

tcpdump命令配合Wireshark等解析工具可对网络问题进行初步排查。比如http请求是明文传输,可以抓到完整的请求内容。但如果是加密的,至少可以看到有没有RST等异常。或者原本应该观察到的返回包有没有,判断是哪个链路出的问题。

排查线上问题的9种方式这需要对网络知识有较深的了解。可通过《网络通信知识地图》进行学习,特别是《白话TCP/IP原理》要了解。

高危方法

linux命令

有些命令危险性不高,比如TOP,使用方法可参考:《时刻掌握系统运行状态-深度理解top命令》。但是在线上不能随便使用。比如程序正在写一个文件,这时用命令行执行vim,可能导致fd文件描述符失效。关于文件描述符可参考《白话linux操作系统原理》或《趣谈IO多路复用的本质》。

感兴趣的朋友甚至可以自己实现一下fd文件描述符失效:

第一步:进程打开日志文件,使用lsof -p pid

简篇AI排版 简篇AI排版

AI排版工具,上传图文素材,秒出专业效果!

简篇AI排版 554 查看详情 简篇AI排版

第二步:vim没打开文件前(或者打开vim没进行wq保存)

第三步:当vim修改文件后wq时,会提示

排查线上问题的9种方式提示文件在读期间被修改了,我们选择yes

第四步:此时再使用lsof -p pid命令来查看打开的文件描述符,进程打开的文件描述符的状态变为了deleted状态。

linux命令可以作为排查问题的利器,比如我在《懂得三境界-使用dubbo时请求超过问题》里提到的netstat -s,但要注意不要对线上造成影响。

下面用图来总结常用命令使用场景,图小需要手工放大看:

排查线上问题的9种方式排查线上问题的9种方式排查线上问题的9种方式留后门法

很久之前我们使用Redis,但管理端做的不太好,我就在程序里留了后门:可以通过http接口对Redis进行增删改查操作。但是用http接口做管理,意味着没有标准的权限控制和操作标准流程,很容易受到攻击或误操作。

更正统的方法是使用标准的运维工具代替这些后门。

线上调试

举个例子,有次我们在进行测试环境演练,出现了个怪异的问题。后来有同事说另一个同事也在用这个环境做调试,所以才会调用那个接口的地方卡住,出现问题。这种问题要是出现在线上,就是故障了。

高级方法

代码走查

排查问题的最高境界是只通过review代码来发现问题。

逻辑推理

但很多大神的解决步骤是:第一,听别人讲述问题现象;第二,提出问题以求证;第三,推理出大致原因并给出可选方案及方案的注意点;第四,自己、更多情况下是他人进行验证。为啥是他人,能达到这种境界多是领导或帮别人排查问题的救火队长,问题发生和自己并没有直接关系。

想达到这种境界还是需要平时的积累和深入理解和深耕。源码和网络知识学起来~~

总结

一张图总结今天介绍的方法:

排查线上问题的9种方式

以上就是排查线上问题的9种方式的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/455462.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 01:12:57
下一篇 2025年11月8日 01:14:17

相关推荐

  • Laravel一主多从数据库配置:如何不使用常驻中间件实现读库负载均衡?

    Laravel 一主多从数据库配置与读库负载均衡 本文探讨如何在 Laravel 的一主多从数据库配置中,不依赖常驻中间件实现读库负载均衡。 挑战: Laravel 的一主多从架构,通常需要主库负责写入,从库负责读取。如何高效地将读请求分发到多个从库,避免单点压力,同时避免使用常驻中间件? 解决方案…

    2025年12月11日
    000
  • Docker Compose部署LEMP环境报错“Primary script unknown”是什么原因?

    Docker Compose 部署 LEMP 环境报错“Primary script unknown”解决方案 在使用 docker compose 部署 lemp (linux, nginx, mysql, php) 环境时,访问 php 文件出现 “primary script unknown”…

    2025年12月11日
    000
  • Hyperf Worker0 内存占用过高该如何排查和解决?

    Hyperf Worker0 高内存占用排查指南(轮询模式) Hyperf 应用中,如果仅 Worker0 内存占用过高,需要系统地进行排查。以下步骤将帮助您定位并解决问题: 第一步:确认内存占用 使用 ps aux 命令精确查看 Worker 进程的内存使用情况,确认确实是 Worker0 占用过…

    2025年12月11日
    000
  • Hyperf框架Worker0内存飙高怎么办?

    Hyperf框架Worker0高内存占用问题排查 Hyperf框架下,若仅Worker0内存持续飙升,且dispatch_mode为1(轮询模式),需按以下步骤排查: 一、静态全局变量检查 PHP垃圾回收机制可能导致静态全局变量在请求处理后未及时释放,造成内存累积。 仔细检查代码中是否存在超大静态全…

    2025年12月11日
    000
  • Hyperf Worker0 内存占用过高该如何排查?

    Hyperf Worker0 内存占用过高解决方案 Hyperf框架下,仅Worker0进程内存占用过高的问题,需要仔细排查以下几个方面: 确认调度模式: 确保dispatch_mode配置为1 (轮询模式)。如果设置为2,所有请求都将由Worker0处理,极易导致内存溢出。 自定义进程检查: 审查…

    2025年12月11日
    000
  • 如何用PHP和Selenium模拟登录新浪微博?

    用PHP和Selenium自动化新浪微博登录 本文介绍如何利用PHP和Selenium库模拟登录新浪微博。Selenium是一个强大的网页自动化工具,可以控制浏览器执行各种操作,例如模拟用户登录。 实现步骤: 安装Selenium库: 使用Composer安装PHP Selenium WebDriv…

    2025年12月11日
    000
  • 如何高效处理多个不同执行间隔的定时任务?

    巧妙应对多个定时任务的执行间隔差异 处理多个定时任务,且每个任务的执行间隔各不相同,直接使用循环遍历的方法效率低下,容易造成执行时间长的任务阻塞其他任务,影响精度。 本文推荐使用生产者-消费者模式来优化这一问题。 生产者(观察者) 生产者负责监控所有定时任务,检查是否有任务达到其预设的执行间隔。一旦…

    2025年12月11日
    000
  • TP5.1自定命令如何调用其他控制器方法?

    ThinkPHP 5.1 自定义命令调用其他控制器方法的解决方法 在ThinkPHP 5.1中,自定义命令和控制器运行在不同的环境下:命令行环境和HTTP请求环境。直接在自定义命令中调用控制器方法会因为作用域差异而失败。 问题描述:尝试在自定义命令中调用同一目录下的其他控制器方法,但执行失败。 解决…

    2025年12月11日
    000
  • EventHttp::setDefaultCallback 无法捕获错误?如何有效处理?

    有效处理 EventHttp::setDefaultCallback 中的未捕获错误 使用 EventHttp::setDefaultCallback 时,您可能会遇到一个棘手的问题:worker进程抛出的错误不会自动传递到主进程,导致错误无法被捕获。这是因为 EventHttp 基于 Reacto…

    2025年12月11日
    000
  • 如何异步处理一万条以上的小程序订阅消息?

    高效处理海量小程序订阅消息的策略 发送上万条小程序订阅消息时,直接使用PHP代码容易导致超时。为了解决这个问题,我们建议采用以下异步处理方案: 利用PHP的命令行接口(CLI):CLI模式下运行PHP脚本不受Web服务器超时限制,更适合处理耗时较长的任务。 引入消息队列机制:使用消息队列(例如Red…

    2025年12月11日
    000
  • 发送上万条小程序订阅消息如何避免超时?

    突破一万条限制:高效发送小程序订阅消息的策略 小程序开发中,批量发送订阅消息(超过一万条)常常面临超时难题。本文提供一种高效的解决方案,避免因直接使用PHP代码导致的超时错误。 核心思路:采用PHP的CLI模式结合Redis消息队列实现异步消息发送。 具体步骤: 创建PHP CLI脚本: 编写一个命…

    2025年12月11日
    000
  • 如何高效发送一万条以上的小程序订阅消息?

    突破小程序订阅消息发送量限制:高效发送一万条以上消息 直接使用PHP代码发送大量小程序订阅消息容易导致超时?本文提供高效解决方案,助您轻松发送一万条以上消息。 优化方案 为了避免PHP代码执行超时,建议采用以下策略: 利用PHP CLI模式: PHP的命令行接口(CLI)模式不受Web服务器超时限制…

    2025年12月11日
    000
  • 多个定时任务执行间隔时间不一致如何精准控制?

    精准控制多个定时任务执行间隔的策略 在需要同时运行多个定时任务,且每个任务拥有不同执行间隔的场景下,如何确保任务执行的精准性是一个关键问题。 简单的轮询方法容易受到任务执行时间的影响,导致间隔不准确。 本文提出一种基于生产者-消费者模式的解决方案,有效避免此问题: 生产者 (Scheduler): …

    2025年12月11日
    000
  • 如何高效实现异步日志处理?

    提升日志处理效率的异步策略 频繁的日志记录会造成严重的IO瓶颈,影响系统性能。本文将介绍如何通过异步处理来优化日志记录。 解决方案: 批量写入:将日志信息暂存至Redis等缓存数据库,再通过队列任务定时批量写入数据库或文件系统。专业日志系统:采用专业的日志处理系统,这类系统通常具备高效的日志收集、存…

    2025年12月11日
    000
  • 如何高效获取抖音和快手直播及播放量数据?

    高效获取抖音、快手直播及播放量数据的策略 老板需要抖音和快手数据?别慌!这里提供几种方法,助您轻松完成任务: 一、官方API接口 抖音开放平台: 提供全面API接口,涵盖用户、视频、直播等多维度数据。快手开放平台: 同样提供API接口,可获取粉丝数、评论数、直播人气等关键指标。 二、专业数据平台 百…

    2025年12月11日
    000
  • 医疗小程序多角色场景下如何优雅地处理角色切换及业务逻辑?

    巧妙应对医疗小程序多角色场景:角色切换与业务逻辑的优雅解决方案 医疗小程序常常涉及多种用户角色(例如医生、患者等),如何在角色切换时保持业务逻辑清晰简洁,避免代码复杂化?本文提供两种有效方法。 方法一:角色判断公共类 创建名为 RoleManagerUtil 的公共工具类,封装所有角色判断逻辑。业务…

    2025年12月11日
    000
  • MySQL排序还是PHP排序:处理海量数据时,哪个更快速有效?

    MySQL还是PHP?海量数据排序效率终极PK 处理巨量数据时,高效的排序至关重要。本文针对30万条记录规模的数据表,探讨MySQL排序和PHP排序的性能差异。 问题: 面对30万条记录,是先用MySQL排序再分页读取,还是直接读取所有记录后用PHP排序,哪种方法更高效? 立即学习“PHP免费学习笔…

    2025年12月11日
    000
  • ThinkPHP中静态方法:性能提升与数据污染,如何权衡?

    ThinkPHP静态方法:性能提升与数据污染的权衡 ThinkPHP框架中,大量使用静态方法,特别是Model层的静态方法,其优缺点一直备受争议。 静态方法的优势: 正如许多开发者所知,静态方法内存占用更低,对于ThinkPHP框架中常用的基础方法,静态化能显著提升性能。 立即学习“PHP免费学习笔…

    2025年12月11日
    000
  • HTTPS环境下,Vue前端项目如何通过Nginx反向代理访问后台API接口?

    使用Nginx反向代理解决Vue项目HTTPS环境下访问后台API接口问题 部署Vue前端项目并启用HTTPS后,常常遇到无法访问后台API接口的问题。本文将指导您如何通过配置Nginx实现反向代理,解决此类问题。 问题描述: 在HTTPS环境下,Vue前端项目无法访问部署在不同服务器或端口的后台A…

    2025年12月11日
    000
  • ThinkPHP中如何通过指定ID访问Session?

    ThinkPHP中指定ID访问Session的挑战与解决方案 如何在ThinkPHP框架中通过指定ID来访问Session数据?这是一个常见的难题。本文将分析问题根源并提供可行的解决方案。 问题描述及错误分析 直接使用session([‘id’ => ‘lia4nqcv260q435dc762…

    2025年12月11日
    000

发表回复

登录后才能评论
关注微信