如果我理解正确,那么在查询MySQL时,您的Perl进程会挂起,而这本身仍在运行。 MySQL服务器具有嵌入式故障排除功能,log_slow_queries选件。把以下几行你my.cnf
使绝招:
[mysqld]
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 10
之后,重新启动或重新载入MySQL守护进程。让我们一会儿服务器运行收集统计和分析这是怎么回事:
mysqldumpslow -s at /var/log/mysql/mysql-slow.log | less
在一台服务器矿山,上面记录的(-s at
订单由平均查询时间,BTW)是:
Count: 286 Time=101.26s (28960s) Lock=14.74s (4214s) Rows=0.0 (0), iwatcher[iwatcher]@localhost
INSERT INTO `wp_posts` (`post_author`,`post_date`,`post_date_gmt`,`post_content`,`post_content_filtered`,`post_title`,`post_excerpt`,`post_status`,`post_type`,`comment_status`,`ping_status`,`post_password`,`post_name`,`to_ping`,`pinged`,`post_modified`,`post_modified_gmt`,`post_parent`,`menu_order`,`guid`) VALUES ('S','S','S','S','S','S','S','S','S','S','S','S','S','S','S','S','S','S','S','S')
FWIW,它是一个WordPress超过30K的职位。
我会尝试添加一些信号处理和日志开始。如果可以的话,它肯定会有助于启用mysql日志记录,以便查看在锁定时间戳之前/期间所做的操作 - 这可能会提供一些进一步的见解。你碰巧在使用线程吗?任何你可以发布的日志信息都可能帮助任何潜在的SO用户来帮助你。 对于信号处理总是有posix模块 - http://perldoc.perl.org/POSIX.html#POSIX%3a%3aSigAction – AndrewPK
最好的情况是,如果有人可以识别错误,但否则你必须开始记录你的出路。我对日志进行了后处理,以便每个请求将它们提炼为一行,仅包含具有所需开始和结束状态的主要状态更改的描述。然后,您应该能够找到没有所需结束状态的行,并使用上次记录的状态作为提示,指出应该进行更多日志记录。 – mzedeler