如果我理解正確,那麼在查詢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