【发布时间】:2012-09-04 22:43:39
【问题描述】:
我有一个在 FreeBSD/Apache 系统上运行的 Perl 脚本,它通过 DBI 对 MySQL 数据库进行一些简单的查询。服务器相当活跃(每天 15 万页),并且每隔一段时间(最多一分钟一次)就会导致进程挂起。我怀疑文件锁可能会阻止读取,或者可能是 SQL 调用,但我无法弄清楚如何获取有关挂起过程的信息。
Per Practical mod_perl 听起来像是识别让我头疼的操作的方法是系统跟踪、perl 跟踪或交互式调试器。我收集系统跟踪是 FreeBSD 上的 ktrace,但是当我附加到顶部的一个挂起进程时,进程被杀死后的唯一输出是:
50904 perl5.8.9 PSIG SIGTERM SIG_DFL
这对我没有多大帮助。任何人都可以提出更有意义的方法吗?我在 Unix 管理员方面并不是很先进,所以如果我听起来很愚蠢,您的耐心将不胜感激.... :o)
【问题讨论】:
-
我会尝试添加一些信号处理和日志记录以开始。如果可以的话,启用 mysql 日志记录肯定会有所帮助,以便查看在锁定时间戳之前/期间做了什么——这可能会提供一些进一步的见解。你碰巧在使用线程吗?您可以发布的任何日志信息都可能有助于任何潜在的 SO 用户也可以帮助您。对于信号处理,总是有 posix 模块 - perldoc.perl.org/POSIX.html#POSIX%3a%3aSigAction
-
最好的情况是如果有人能识别出错误,否则你必须开始记录你的出路。我对日志进行了后处理,因此每个请求将它们提炼成一行,仅包含对主要状态更改的描述以及所需的开始和结束状态。然后,您应该能够找到没有所需结束状态的行,并使用最后记录的状态作为提示,您应该在哪个方向进行更多记录。
标签: mysql perl apache freebsd dbi