全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

记录一次排查PHP脚本执行卡住的问题

发现问题

最近忽然从监控中发现,我们一个服务的一台机器负载比同机房的其他机器要高,而流入流出流量没有差别,进一步查看发现每个机房都有一台机器存在相同的现象,梳理后发现有问题的这些机器相比正常的机器多跑了一些PHP脚本,于是猜测是执行脚本出问题导致。

解决问题

登录机器后执行top命令,果然发现存在一个CPU占用较高的PHP进程,然后执行下列命令,发现存在一个由crontab启动的执行了很长时间的PHP脚本:

ps aux | grep 'php' | grep -v 'php-fpm'

由于之前也遇到过PHP脚本执行卡住的类似情况,当时的怀疑是跨机房的Mysql查询在网络抖动时导致Mysql连接卡住了,于是理所当然的将所有卡住的进程都kill掉了,再从负载上看机器马上就恢复正常了,于是心满意足的跑去干别的了。

过了一段时间,刷了下监控,发现问题又出现了,注释掉crontab并kill掉进程后,手动执行问题脚本,竟然能稳定复现问题!看来是把问题想得太简单了,尝试用strace命令看下卡住的进程当前究竟在干什么:

[tabalt@localhost ~] sudo strace -p 13793
Process 13793 attached - interrupt to quit

什么输出都没有!再用netstat看下这个进程是否打开了什么端口:

[tabalt@localhost ~] sudo netstat -tunpa | grep 13793
tcp  0  0 192.168.1.100:38019  192.168.1.101:3306  ESTABLISHED 13793/php
tcp  0  0 192.168.1.100:47107  192.168.1.102:6379  CLOSE_WAIT 13793/php 

可以看到进程打开了两个端口,分别与Mysql和Redis建立了连接,并且处于连接建立(ESTABLISHED)和对方主动关闭连接(CLOSE_WAIT)的状态;初看确实像是和数据库的连接卡住了,但是因为吃过亏上过当,咱们使用tcpdump抓包看进程和数据库之间的交互:

tcpdump -i eth0 host 192.168.1.101 and port 3306 -w ~/mysql.cap

抓了好一会,~/mysql.cap 文件中却也没有任何输出,难道进程和Mysql之间已经没有任何交互了?那为什么连接建立没有关闭呢?看来只能从头追踪一下脚本的执行情况了:

首先为了能来得及strace到进程,在PHP脚本最开始的时候输出进程的pid并sleep 10s:

 echo getmypid(); sleep(10); 

然后启动tcpdump准备抓包本机和Mysql的交互过程。

最后执行PHP脚本,并复制输出的pid后在新窗口中执行strace命令。

这下strace和tcpdump都有内容了!从strace结果看recvfrom之后不再有poll,但并没有看出来有什么不对:

//...
poll([{fd=4, events=POLLIN|POLLERR|POLLHUP}], 1, 1471228928) = 1 ([{fd=4, revents=POLLIN}])
recvfrom(4, "://xxx.com/\0\0\23jiadia"..., 271, MSG_DONTWAIT, NULL, NULL) = 271
poll([{fd=4, events=POLLIN|POLLERR|POLLHUP}], 1, 1471228928) = 1 ([{fd=4, revents=POLLIN}])
recvfrom(4, "_b?ie=UTF8&node=658390051\0\0008www."..., 271, MSG_DONTWAIT, NULL, NULL) = 206

再从抓包结果看,执行了两条SQL查询语句之后,进程没有再次发送查询请求的包,从程序记录SQL语句日志中,也发现确实只执行了两条:

select * from sites where type = 1 limit 50;
select * from sites where type = 2 limit 50;

但从这些现象中,仍然没有能看出任何端倪,只好祭出终极大法:输出调试!大概看了下代码,并在关键地方添加输出语句,于是代码看起来如下:

echo("start foreach\n");
foreach($types as $type)
{
 echo("foreach $type\n");
 $result[$type] = $this->getSites($type);
}
echo("end foreach\n"); 

执行后输出如下,查询type为2的网址时卡住了:

start foreach
foreach 1
foreach 2

开始怀疑调用的getSites()方法有问题,代码如下:

$sites = array(); // 省略从数据库查询的代码
$siteNum = 8;  // 省略从配置读的代码
$urlKeys = $result = array();
for($i = 0; $i < $siteNum; $i++)
{
 do {
  $site = array_shift($sites);
  $urlKey = md5($site['url']);
 } while(array_key_exists($urlKey, $urlKeys));

 $urlKeys[$urlKey] = 1;
 $result[] = $site;
}
return $result;

原来这里为了实现拿8个不重复的网址写了2个循环,如果结果中不重复的网址只有7个就会有一个空,少于7个就会有死循环!于是查了下type为2的网址个数,果然是只有6个!

总结

该问题从发现到解决花了大概1天时间,虽然最后证明是低级的代码BUG导致,但是整个排查过程还是挺有收获的,最开始的想当然证明是非常肤浅的,过程中tcpdump和strace的结果也已经很能说明问题了,对各个工具的应用应该要更加熟练,工具的结果也要深入分析。以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


# 执行php脚本  # php  # 脚本执行时间  # Nginx和PHP-FPM的启动、重启、停止脚本分享  # 在命令行下运行PHP脚本[带参数]的方法  # PHP命令行脚本接收传入参数的三种方式  # 如何使用Linux的Crontab定时执行PHP脚本的方法  # cmd下运行php脚本  # PHP教程之PHP中shell脚本的使用方法分享  # nginx php-fpm中启用慢日志配置(用于检测执行较慢的PHP脚本)  # Linux下php5.4启动脚本  # win7计划任务定时执行PHP脚本设置图解  # PHP 编写的 25个游戏脚本  # 都有  # 一台  # 卡住了  # 两条  # 有什么  # 就会  # 打开了  # 看了  # 过了  # 也没  # 也要  # 没有任何  # 并在  # 较高  # 花了  # 可以看到  # 想当然  # 掉了  # 跑了  # 写了 


相关文章: 制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  如何确认建站备案号应放置的具体位置?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  如何在云主机上快速搭建网站?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  如何快速打造个性化非模板自助建站?  如何选择CMS系统实现快速建站与SEO优化?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  如何零基础在云服务器搭建WordPress站点?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  如何安全更换建站之星模板并保留数据?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  网站制作模板下载什么软件,ppt模板免费下载网站?  如何批量查询域名的建站时间记录?  开封网站制作公司,网络用语开封是什么意思?  威客平台建站流程解析:高效搭建教程与设计优化方案  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  建站之星导航配置指南:自助建站与SEO优化全解析  电商网站制作价格怎么算,网上拍卖流程以及规则?  高端企业智能建站程序:SEO优化与响应式模板定制开发  PHP 500报错的快速解决方法  python的本地网站制作,如何创建本地站点?  建站之星如何修改网站生成路径?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  如何选择服务器才能高效搭建专属网站?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  建站之星各版本价格是多少?  大连 网站制作,大连天途有线官网?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  如何用花生壳三步快速搭建专属网站?  如何通过商城自助建站源码实现零基础高效建站?  南宁网站建设制作定制,南宁网站建设可以定制吗?  制作网站外包平台,自动化接单网站有哪些?  股票网站制作软件,网上股票怎么开户?  如何在自有机房高效搭建专业网站?  如何通过cPanel快速搭建网站?  宝塔新建站点为何无法访问?如何排查?  C#如何序列化对象为XML XmlSerializer用法  如何快速搭建高效香港服务器网站?  制作销售网站教学视频,销售网站有哪些?  建站OpenVZ教程与优化策略:配置指南与性能提升  装修招标网站设计制作流程,装修招标流程?  建站主机服务器选购指南:轻量应用与VPS配置解析  文字头像制作网站推荐软件,醒图能自动配文字吗?  建站DNS解析失败?如何正确配置域名服务器? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。