`

排查PHP脚本执行卡住的问题

 
阅读更多

sudo strace -p 13793

 

sudo netstat -tunpa | grep 13793

 

解决问题

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

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

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

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

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

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

1
2
3
[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抓包看进程和数据库之间的交互:

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

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

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

1
echo getmypid(); sleep(10);

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

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

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

1
2
3
4
5
//...
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语句日志中,也发现确实只执行了两条:

分享到:
评论

相关推荐

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

    最近通过监控发现服务器中的一台机器异常,通过排除发现可能是php执行脚本出现了问题,于是通过一步步排查,最终解决了这个问题,下面这篇文章主要是记录了一次排查PHP脚本执行卡住的问题,需要的朋友可以参考下。

    jar包问题排查脚本.zip

    针对这些问题,我们可以通过特定的脚本来进行排查和解决。本篇文章将详细介绍三个实用的脚本——`find-jar-field`、`grep-jar`和`jar-conflict-detect`,它们是针对jar包问题的有效工具。 1. **find-jar-field** `...

    SQLServer脚本批量执行工具

    这种记录对于排查问题、追踪更改历史以及审计都非常有用。用户可以轻松查看每个脚本的执行状态(成功、失败或警告),并获取关于失败原因的详细信息。 在提供的文件"SqlServerUpgrade.exe"中,很可能包含了这个批量...

    记一次 Spring Boot 项目启动卡住问题排查记录.docx

    记一次 Spring Boot 项目启动卡住问题排查记录

    solaris 如何添加启动时自动执行脚本

    - **日志记录:** 考虑在脚本中加入日志记录功能,以便于后续的问题排查。 - **兼容性检查:** 如果是在不同版本的Solaris上部署脚本,建议进行兼容性测试,以确保脚本能够正常运行。 通过以上步骤,你就可以在...

    Linux应急响应辅助排查脚本

    Linux应急响应辅助排查脚本 一键运行导出日志 将该脚本下载并移动到Linux任意文件夹,以root权限运行即可导出result.log辅助快速应急响应主机排查。 可使用此脚本用于分析日常服务器差异及被攻击行为。

    cmd下运行php脚本

    - 例如,可以参考文章“记录一次排查PHP脚本执行卡住的问题”,了解如何处理这类常见问题。 通过以上步骤,我们不仅能够顺利地在CMD下运行PHP脚本,还能掌握一些高级技巧,如带参数运行、定时任务等,从而提高开发...

    批量执行脚本

    - 为了便于排查问题,批量执行脚本的过程中应记录详细的日志,包括每个脚本的执行状态、开始和结束时间、错误信息等。 - 可以将日志输出到控制台、文件或者日志服务,以便后期分析。 8. **脚本依赖与顺序**: - ...

    重启网卡脚本

    在IT管理领域,有时我们需要对网络接口进行快速的启停操作,特别是在排查网络问题或配置更新时。"重启网卡脚本"就是为了解决这个问题而设计的,它结合了`devcon.exe`工具和批处理脚本来实现一键管理网络接口的状态。...

    网卡IP快速切换脚本

    此外,IP查询功能允许用户查看当前网卡的IP配置状态,这在排查网络问题时非常有用。如果在选择网卡时出错,脚本还提供了重新选择的功能,确保操作的准确性。这个功能尤其适合那些管理多台设备或者在复杂网络环境中...

    Windows脚本宿主修复

    7. **故障排查**:如果脚本宿主出现问题,除了使用提供的修复工具,还可以尝试重启计算机、禁用脚本阻止功能(如通过Internet Explorer的安全设置)、检查病毒扫描软件是否阻止了脚本执行,或者通过事件查看器查看...

    4G模组 SIM卡无法识别排查解决方案

    在本文中,我们将详细讨论 4G 模组 SIM 卡无法识别的问题,并提供相应的排查和解决方案。 标题解释: 4G 模组 SIM 卡无法识别是一种常见的问题,导致模组无法连接网络和参与网络活动。在本文中,我们将讨论如何...

    GENESIS脚本!~

    这里的hooks文件夹可能包含了在脚本执行前、执行后或其他特定阶段运行的钩子函数,用于扩展或定制脚本的行为。 综合以上信息,"GENESIS脚本!"涉及的知识点可能包括: - 脚本语言基础:如Python、bash或者其他脚本...

    遨游网页助手 查看JS 运行脚本

    "遨游网页助手"是一款专为用户查看JavaScript运行脚本设计的工具,它提供了一种便捷的方式,帮助用户深入理解网页中的脚本执行过程。在网页开发和调试中,能够实时查看JavaScript的运行状态是非常重要的,这能帮助...

    PHP脚本修改Linux或Unix系统口令方法.pdf

    如果失败,应显示错误信息以便排查问题。 最后,安全是此类操作的核心。必须通过HTTPS协议来运行脚本,以保护密码在传输过程中的安全性。此外,脚本应该放在受密码保护的目录下,避免未经授权的访问。对用户输入...

    Logcat及adb shell命令的bat脚本实现例子

    如果在`bat`脚本中遇到进入`shell`后无法执行后续命令的问题,可能是因为没有正确处理命令的执行顺序或权限。确保每个命令都在适当的位置并赋予必要的执行权限是很关键的。 在编写`bat`脚本时,还需要注意以下几点...

    linux下独立程序执行php文件

    总的来说,"snail007-phprunner-0ce9948"是一个旨在解决Linux环境下无依赖执行PHP脚本问题的工具,它可能是通过嵌入PHP解释器、动态链接库或C++接口等方式实现的。理解其工作原理和实现方式有助于我们更好地利用这类...

    星穹铁道自动使用兑换码脚本

    运行过程中,脚本会自动执行兑换码的使用流程,按照预设逻辑进行登录、输入兑换码等操作。如果遇到问题,如登录失败、兑换码无效等,脚本可能会有相应的错误提示,根据提示进行排查。 总的来说,《星穹铁道自动使用...

Global site tag (gtag.js) - Google Analytics