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

前言

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

常见问题

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

<img src="//pic.ikafan.com/imgp/L3Byb3h5L2h0dHAvd3d3LmJvNTYuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE1LzA5L2x1b2Jlbi5wbmc=.jpg" alt="luoben" width="693" height="522" class="alignnone size-full wp-image-829" /></a></p>

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

处理思路

<img src="//pic.ikafan.com/imgp/L3Byb3h5L2h0dHAvd3d3LmJvNTYuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE1LzA5L2ppZWp1ZXNpbHUucG5n.jpg" alt="jiejuesilu" width="702" height="525" class="alignnone size-full wp-image-831" /></a></p>

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

恢复服务

<img src="//pic.ikafan.com/imgp/L3Byb3h5L2h0dHAvd3d3LmJvNTYuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE1LzA5L2h1aWZ1ZnV3dS5wbmc=.jpg" alt="huifufuwu" width="701" height="525" class="alignnone size-full wp-image-834" /></a></p>

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

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

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

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

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

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

保留现场

<img src="//pic.ikafan.com/imgp/L3Byb3h5L2h0dHAvd3d3LmJvNTYuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE1LzA5L2Jhb2xpdXhpYW5jaGFuZy5wbmc=.jpg" alt="baoliuxianchang" width="701" height="525" class="alignnone size-full wp-image-836" /></a></p>

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

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

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

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

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

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

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

排查问题

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

知识

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

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

网络:咱们毕竟是搞网络通信编程的。对网络通信方面的知识有所了解,是必须的。尤其是对一些协议要有大概的了解。通信协议的重要性,并不仅仅局限于面试时撑撑场面,更重要的是用来解决问题。软件:对搭建系统所使用软件要有所了解。如对memcached的内存管理策略有所了解的话,可以让你更好的对其调优,充分的利用内存,减少内存浪费。

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

工具

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

<img src="http://www.bo56.com/wp-content/uploads/2015/09/屏幕快照-2015-09-02-上午9.09.27.png" alt="屏幕快照 2015-09-02 上午9.09.27" width="694" height="517" class="alignnone size-full wp-image-845" /></a></p>

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

时间: 2024-12-28 19:09:51

线上PHP问题排查思路与实践的相关文章

线上Java应用排查和诊断规范

线上Java应用排查和诊断规范 http://www.iteye.com/topic/1132132 标准做法一:OOM触发HeadpDump 目的: OOM发生时,输出堆栈快照文件,供研发人员分析. 在JVM中,如果98%的时间是用于 GC 且可用的 Heap size 不足2%的时候,将抛出 OOM 异常. 配置操作: Resin/Tomcat 配置文件里追加 -XX:+HeapDumpOnOutOfMemoryError ,当 OutOfMemoryException 错误发生时,会自动生

一次线上OOM故障排查经过

转贴:http://my.oschina.net/flashsword/blog/205266   本文是一次线上OOM故障排查的经过,内容比较基础但是真实,主要是记录一下,没有OOM排查经验的同学也可以参考. 现象 我们之前有一个计算作业.最近经常出现不稳定,无法正常响应的情况.具体表现是:各种连接超时,从mysql.mongodb和zookeeper到netty,能超时的都超时过了.其他看不到太多有效的异常. 所以我们首先怀疑的是网络问题,打电话跟运维确认,运维说网络问题的可能性几乎为0,因

业务技术协同线上化的硬盘式研发管理实践

摘要:在云效平台策划推出的<持续集成与交付:阿里最佳实践>专题中,阿里云效产品专家代平为大家深入浅出地分享了互联网的研发管理理念,解析了企业研发管理面临的挑战和困难,揭密了如何结合云效产品进行业务技术协同线上化的硬盘式研发管理实践. 以下内容根据演讲嘉宾视频以及PPT整理而成. 演讲嘉宾介绍 代平,阿里云效产品专家.在本次分享中,代平谈到自己的职业生涯目前总共经历了三个阶段,第一个阶段她从事研发.测试以及项目管理工作,在这个阶段水深火热地工作了四年,积累了大量的项目开发.测试以及管理经验.第二

【天池直播】天池线上赛自定义函数实践

本次直播你可以听到什么? 如何灵活应用天池平台自定义功能向线上赛发起挑战. 直播主题:天池线上赛自定义函数实践 直播时间:10月25日 晚20:00 直播地址:点击查看 直播嘉宾: 李雨亭 天池ID:余音,花名:墨音 数据挖掘竞赛选手,数据挖掘爱好者. 曾取得第一届阿里云安全算法大赛冠军等成绩. 直播内容: 1. 线上赛如何在odps利用MR/UDF进行个性化数据处理 2. xgboost生成叶子节点特征实战 有奖互动: 互动时间:10月25日直播活动后在互动帖中进行互动 互动时长:15-30分

青春正燃 第十届全国大学生信息安全竞赛创新实践能力赛线上赛圆满落幕

7月10日早上8:00,由教育部高等学校信息安全专业教学指导委员会主办,西安电子科技大学.永信至诚.国卫信安等承办,百度安全中心.阿里安全应急响应中心.腾讯安全平台方舟计划.360企业安全集团赞助支持的第十届全国大学生信息安全竞赛创新实践能力赛线上赛满落幕.本次竞赛从6月15日报名启动,短短的24天共吸引全国236所高校.近1700余人报名参加,是现在国内规模最大.影响力最高.参与院校最多的大学生信息安全竞赛,被广大师生成为"国赛". 7月9日早8:00正式开赛,瞬间i春秋竞赛平台就涌

开启PHP的error_log排查线上遇到的错误

做开发的经常碰到这种情况,在线下测试的挺好的程序,上传到线上(生产环境)就会出现奇奇怪怪的错误,比如出现个空白页面,也不知道是哪里出问题了,而线上又不允许调试,那该如何去解决这个问题呢?除了在仔细一遍遍的检查代码外,还可以通过开启php的error_log来排查错误. 大家应该都知道当php.ini中的display_errors设置为on的时候,运行程序的时候经常会看到满屏的notice warning啊什么的. 开启error_log的情况下也会记录这些notice warning信息,但是

【原创】线上环境 SYN flooding 问题排查

问题描述:       线上环境中,公司自研即时通讯软件不定时掉线.  问题排查:       由运维和测试人员发现并报告,线上环境出现网络异常,具体表现为登录服务器虚拟 IP 地址无法 ping 通,即时通讯工具不定时掉线:       在此情况下,现场人员第一反应就是受到了外部攻击(因为以前遇到过攻击情况),因为看到了如下信息  ... Apr 20 18:21:48 localhost kernel: possible SYN flooding on port 80. Sending co

【CDN 最佳实践】CDN访问异常排查思路

当客户使用 CDN 加速站点访问后,客户端的请求将首先发送到 CDN 的 L1 节点,再通过 L1 -> L2 -> 源站的网络路径回源获取资源.因此如果访问过程中出现问题就可能涉及到多级网络链路的问题.如何尽快定位并解决问题就成为疑难问题,本文将根据系统介绍如何定位 CDN 资源无法访问的问题点以及处理的思路. 域名配置和解析 当某个站点的资源 URL 访问出现异常时首先需要查看的即是对应的域名是否有正确配置解析到 CDN 上.如图 1 所示即是 CDN 加速域名的基本配置截图,从图中我们可

一则线上MySql连接异常的排查过程

Mysql作为一个常用数据库,在互联网系统应用很多.有些故障是其自身的bug,有些则不是,这里以前段时间遇到的问题举例. 问题 当时遇到的症状是这样的,我们的应用在线上测试环境,JMeter测试过程中,发现每次压力测试开始时访问低前几个http request请求会超时,而之后的请求持续测试中都不会.最后一点是Tomcat的log并没有报什么错误. 压测的内容就是起200线程不停的向这个http页面发送请求,这个页面逻辑也比较简单,会在后端向数据库插入一条数据,连接池采用阿里的Druid(这个坑