发现问题

最近忽然从监控中发现,我们一个服务的一台机器负载比同机房的其他机器要高,而流入流出流量没有差别,进一步查看发现每个机房都有一台机器存在相同的现象,梳理后发现有问题的这些机器相比正常的机器多跑了一些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个游戏脚本
# 都有
# 一台
# 卡住了
# 两条
# 有什么
# 就会
# 打开了
# 看了
# 过了
# 也没
# 也要
# 没有任何
# 并在
# 较高
# 花了
# 可以看到
# 想当然
# 掉了
# 跑了
# 写了
相关文章:
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
魔毅自助建站系统:模板定制与SEO优化一键生成指南
如何在云指建站中生成FTP站点?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
如何用好域名打造高点击率的自主建站?
如何在IIS管理器中快速创建并配置网站?
历史网站制作软件,华为如何找回被删除的网站?
如何在万网ECS上快速搭建专属网站?
山东网站制作公司有哪些,山东大源集团官网?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
如何选择美橙互联多站合一建站方案?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
如何在云主机上快速搭建网站?
如何配置FTP站点权限与安全设置?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
怀化网站制作公司,怀化新生儿上户网上办理流程?
建站org新手必看:2024最新搭建流程与模板选择技巧
建站之星后台密码遗忘或太弱?如何重置与强化?
建站主机默认首页配置指南:核心功能与访问路径优化
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
如何在腾讯云免费申请建站?
青浦网站制作公司有哪些,苹果官网发货地是哪里?
python的本地网站制作,如何创建本地站点?
建站之星上传入口如何快速找到?
如何用景安虚拟主机手机版绑定域名建站?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
免费网站制作appp,免费制作app哪个平台好?
油猴 教程,油猴搜脚本为什么会网页无法显示?
建站之星安装路径如何正确选择及配置?
如何在阿里云完成域名注册与建站?
如何用已有域名快速搭建网站?
建站之星北京办公室:智能建站系统与小程序生成方案解析
在线制作视频网站免费,都有哪些好的动漫网站?
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
广东企业建站网站优化与SEO营销核心策略指南
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
深圳网站制作的公司有哪些,dido官方网站?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
如何快速重置建站主机并恢复默认配置?
动图在线制作网站有哪些,滑动动图图集怎么做?
小程序网站制作需要准备什么资料,如何制作小程序?
建站主机选购指南:核心配置优化与品牌推荐方案
如何在IIS7中新建站点?详细步骤解析
如何快速生成橙子建站落地页链接?
建站VPS能否同时实现高效与安全翻墙?
C#如何使用XPathNavigator高效查询XML
如何在Windows服务器上快速搭建网站?
如何在腾讯云服务器快速搭建个人网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。