线上PHP问题排查思路与实践

2024-09-03 03:32

本文主要是介绍线上PHP问题排查思路与实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天早上拜读了 @淘宝信海龙老师的博客中关于解决PHP线上问题的文章,条理清晰,有理有据,收获很大。特此和大家分享一下。
前言

前几天,在一淘网,腾讯网媒和微博商业技术联合组织的技术分享大会上,我分享了《在线PHP问题排查思路与实践》。此博文除了对PPT提供下载外,还会对ppt做简单的注释说明。主题分为三部分,常见问题,解决思路和案例分析。

常见问题

不同用户看到的错误可能不一样。一般用户看到的错误都是表层的现象。如,裸奔的错误页面:
luoben

这种裸奔的错误页面,经常被用户成为乱码,太丑太暴漏。甚至把一些不应该暴漏的敏感信息都暴漏了。如,nginx版本号,文件路径等。为了解决这些问题,设计师们又做了有情调的错误页。但是,错误五花八门,并不是一个错误页能掩盖的。
对于工程师,咱们看问题可能会更深入些。能看到问题背后的问题。如,看到502错误,他们会想到可能是后端PHP-FPM进程出现问题。如后端的PHP-FPM进程已经死掉,nginx无法连接到PHP-FPM进程。

处理思路

jiejuesilu

虽然问题五发八门,但是有一套解决思路可以整体处理这些问题。解决思路大概分为如下几个部分:恢复服务,保留现场,排查问题和验证。下面对这几部分分别加以说明。

恢复服务

huifufuwu

恢复服务,顾名思义。就是赶紧让用户感受不到错误的存在。为什么这样做呢?原因有如下两个。第一,如果不这样做,用户看到的是错误页面,用户体验不好。可能还会对公司带来直接的经济损失。 第二,如果不这样做,年底你的奖金就飞了。那如何恢复服务呢?下面说下不同场景下的几种操作方式。

摘机:所谓摘机就是摘除有问题的机器。这种操作的应用场景是,当提供服务的多台机器中,有部分机器出现问题时,可以这样操作。这就要求我们,对于线上运行的服务,必须保障有多台机器运行相同的服务,多台机器间没有依赖关系。其中一台或者几台被摘除不会影响到其他机器。

回滚:所谓回滚就是恢复到操作之前的状态。这种操作的应用场景是,当进行了上线或者软件配置修改后,出现了问题。

重启:当你的服务运行一段时间,突然出现了异常。如进程占用了cpu 100%。你可以通过重启的方式来解决。重启的过程就是一个资源释放和重新分配的过程。

降级:当你的网站的访问量超出了你服务器的负载时,网站就会出现问题。这个时候,就需要保证主要功能可用。把损失降到最低。

当然,网站出现问题时,并不是教条的套用,做单一的操作来恢复服务。而是根据情况进行相应的操作。遇到问题时,可能需要进行多个恢复服务的操作。但是,所有的这些操作的原则就是,把损失降到最低。

保留现场

baoliuxianchang

其实问题排查和警察破案过程是一样的。想想警察是如何保留现场的?商场内安装摄像头。不方便安装摄像头的场所(洗头房),就在场所外的大街上安装摄像头。虽然有监控,但是还有会有案件发生。案件出现后,他们会保护案发现场。其实我们对现场的保留,也是从这几方面入手。

系统内部日志:这就好比在商场内安装摄像头。如果有良好的日志记录,那就可以记录系统运行过程中出现的一些异常。良好的日志系统,也是我们在选择开源软件时的重要标准。

系统外部监控:这个就好比洗头房外大街上的监控。在系统中,总有一些地方是你不方便或者没权增加日志记录的。如,咱们在调用第三方服务的时候,肯定你也不方便在第三方服务中添加日志。这个时候,我们就需要增加对第三方服务的监控和日志记录。能时刻知道第三方服务是否可用。

保留运行状态:这个就是案发现场的保留。比如,你发现一个进程占用cpu 100%。你为了解决问题,贸然的重启进程,就是破坏了现场。

保留现场和恢复服务并没有一个明确的先后关系。他们共同是问题排查的基础。恢复了服务,你才可用安心的进行问题排查。保留了现场,你才有问题排查的数据来源。有时候,保留现场和恢复服务会有冲突。如,你就一台机器提供服务,这台机器上出现了问题,这个时候要如何处理呢?这个时候建议最短的时间备份现场,然后尽快的恢复服务。如,一个进程占用cpu 100%,那你就可以用 gcore 把进程生成core文件,然后重启进程。

对于PHP开发的系统,为了实现更健壮的日志系统,我这里有个小tip。可以使用register_shutdown_function 和 error_get_last。具体的可以查看。博文地址

所有的这些保留现场的操作,就是为之后的问题排查提供数据。

排查问题

排查问题的过程才是展现你福尔摩斯风采的时候。问题排查的过程就是用你掌握的知识和工具去分析数据的过程。现在,数据已经有了。知识和工具都需要掌握哪些呢?

知识

知识的海洋是浩瀚的。这里我只能做个大概的分类。

语言:PHP语言方面,除了了解基本语法以外,还要对PHP的内核有所了解。对PHP内核有所了解后,你就大概了解了php的执行流程。出现问题,你就可以大概推测是那个环节出现了问题。发现问题后,你可以根据掌握的知识分析出大概那里出现了问题。比如,当一个PHP进程占用cpu 100%。你就可以通过掌握的PHP内核的数据结构找出是大概那里的代码出现了问题。参见博文《当cpu飙升时,找出php中可能有问题的代码行》

网络:咱们毕竟是搞网络通信编程的。对网络通信方面的知识有所了解,是必须的。尤其是对一些协议要有大概的了解。通信协议的重要性,并不仅仅局限于面试时撑撑场面,更重要的是用来解决问题。查看博文 《tcpdump 和 wireshark组合拳,揪出有问题的机器》

软件:对搭建系统所使用软件要有所了解。如对memcached的内存管理策略有所了解的话,可以让你更好的对其调优,充分的利用内存,减少内存浪费。

系统:避免咱们搭建的系统运行在操作系统上。那就需要对操作系统所有了解。如,权限,系统日志位置,oom等。

工具

工欲善其事必先利其器。网络上有一张图总结的很好,把常用的工具总结的很全。

屏幕快照 2015-09-02 上午9.09.27

如果你把所有的工具都能很好的掌握,你就是神啦。

案例分析

案例分析中给出了三个案例。涉及网络,语言和系统三个方面。

网络:使用tcpdump排查mysql数据库tps飙升的问题

语言:php进程导致服务器cpu 100问题追查过程

系统:一个echo引起的进程崩溃

更多案例请查看 http://www.bo56.com/category/troubleshoot/

PPT下载

下载地址


这篇关于线上PHP问题排查思路与实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131904

相关文章

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

springboot依靠security实现digest认证的实践

《springboot依靠security实现digest认证的实践》HTTP摘要认证通过加密参数(如nonce、response)验证身份,避免明文传输,但存在密码存储风险,相比基本认证更安全,却因... 目录概述参数Demopom.XML依赖Digest1Application.JavaMyPasswo

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺