现在的位置:首页  /  云计算培训 >云计算技术教程

运维程序员宝典:故障案例分析

来源: 薪享宏福
发布时间: 2019年03月25日
分享到:
案例一、sql问题的发现和分析过程
 
现象:某业务反馈比较慢,有时报502错误。
 
分析: PHP访问日志(access log)看到有个查询列表页执行的时间比较长,进一步通过strace工 具分析发现连接数据库和等待时间都比较长,估计是数据库负载较高。在MySQL中通过show processlist和分析慢查询,发现了问题SQL,有上千条,其中几条显示被锁了,分析问题SQL ,发现是表索引不合理引|起的。
 
结论和解决方案:
 
是SQL写得不合理和表设计索引不合理引|起的问题,加索引和优化SQL后即可解决,通过MySQL explain命令来分析SQL。关于SQL优化和MySQL优化,有专门的文章详细介绍,这里就不展开了。如何事前发现问题SQL,是运维和DBA的课题,可以考虑通过SQL的审计来实现。
 
案例二、调用外部接口引起的故障
 
现象:访问某页面卡,经常打不开
 
分析:研发刚换人,也不熟悉代码,代码很复杂,无法逐行阅读。运维上去看访问日志(access log),没有特别慢的情况,慢日志(access log)中可以看到偶尔有curl_ exec的调用出现,利用Linux的strace工具分析进程, 发现有连接某个IP ,但不知道是什么服务器,不是我们自己的。有可能是第三方的,怀疑是通过HTTP协议调用了第三方的接口,外部接口慢导致PHP进程慢。于是我们通过基于
xhprof的性能分析系统,发现(如下图所示):
通过xhprof发现PHP代码性能瓶颈
通过xhprof发现PHP代码性能瓶颈
 
结论和解决方案: 
curl访问外部接口占用了太多时间,而且没有设置访问超时时间。让外部接口提供方查找性能问题,同时在curl_ exec中设置超时时间为200ms ,如果外部接口不稳定就快速返回失败,而不是卡在那里影响全局。
 
strace能在系统层面和PHP进程层面发现问题,而不只是单个PHP脚本。curl是访问外部HTTP接口的工具, PHP代码中经常会使用,访问过程需要多个步骤, DNS、连接、等待处理、返回等, 时间较长。
 
案例三、缓存失效弓引起的
 
现象:告警系统发现某台缓存服务器的流量突然暴增,达到900Mbit/s.
 
分析:通过iftop等工具发现流量来自于多台应用服务器,缓存服务器端口是11211 ,是Memcached服务,分析mc状态,发现连接数也特别多。
 
慢日志显示缓存的获取函数较多,access log显示也较长,但是没有更多的信息。有人认为是缓存失效了,有人认为是缓存服务负载顶不住了,应该增加更多的mc服务器负载,也有研发认为是缓存内存不够了, 要求加大Memcached的内存空间。运维通过xhprof分析到有个PHP get mc缓存的函数调用( call )次数很多。分析PHP代码发现几乎每调用一次都要获取一次缓存。从开发经验来讲,如果获取太慢,这已经失去了缓存的作用。和开发沟通后发现是他新增了一个功
能, key只有10个,分析后发现value都在40KB-个,访问量一多,流量就会暴增。
 
结论和解决方案:很大的key而且调用频繁将会导致带宽暴增。
 
这需求有点不太合理,但是业务需要,也无法否定。可通过增加本地缓存来减少读取网络缓存的次数。最后将PHP apc的用户缓存作为本地缓存,缓存30秒后过期,这样就大大缓解了带宽和调用次数。

相关推荐:

学云计算要知道什么是操作系统

什么是云资源以及有什么特点

企业云计算的基础架构是什么?

云计算培训初学者常遇安装虚拟机出现Intel VT-x 禁用如何解决