[英]Finding a Perl memory leak
已解決,請參閱編輯2
你好,
我一直在編寫一個Perl程序來處理本地(專有)程序的自動升級(對於我工作的公司)。
基本上,它通過cron運行,不幸的是有內存泄漏(或類似的東西)。 問題是泄漏只發生在我不看的時候(也就是說當通過cron運行時,而不是通過命令行)。
我的代碼不包含任何循環(或其他)引用,因此常用的工具對我Devel::Cycle
( Devel::Cycle
, Devel::Peek
)。
我怎樣才能找出內核殺死內存的內存是多少呢 ?
基本上,代碼SFTP進入服務器(使用```sftp ...```),調用OpenSSL來驗證文件,然后在需要更多文件時更多SFTP並安裝它們(解壓它們)。
在第一次SFTP會議之前我已經看到了延遲(約15秒),但它從來沒有使用太多的內存來殺死(在我面前)。
如果我不能解決這個問題,我需要用不同的語言重寫,這將花費寶貴的時間。
編輯:內核打印出以下消息,這使我相信它是內存泄漏:
[100023.123] Out of memory: kill process 9568 (update.pl) score 325406 or a child
[100023.123] Killed Process 9568 (update.pl)
我不相信這是cron的問題,因為在通過命令行運行它時會停止(有時約為15秒)。 此外,沒有使用環境變量(至少通過我所寫的內容,可能是潛在的事情嗎?)
編輯2:我自己找到了這個問題,在mobrule的下面評論的幫助下(回答這個問題)。 事實證明,腳本每天只從用戶的crontab(非root用戶)調用一次,並且(非root權限)導致特殊的無限循環情況。
對不起伙計們,我覺得以前沒有找到這個有點傻,但謝謝。
mobrule,如果你提交你的評論作為答案,我會接受它,因為它導致我發現問題。
結束編輯
謝謝,Brian
PS我可以發布小代碼片段,但不是由於公司政策而發布的全部內容。
您可以嘗試使用Devel :: Size來分析您的一些對象。 例如在main::
scope(.pl文件本身)中,執行以下操作:
use Devel::Size qw(total_size);
foreach my $varname (qw(varname1 varname2 ))
{
print "size used for variable $varname: " . total_size($$varname) . "\n";
}
將實際使用的大小與您認為每個對象的合理值進行比較。 可能會立即彈出一些可疑的東西(例如,一個聽起來很合理的任何東西都會大量膨脹)。
其他嘗試:
如果它是由cron運行的,那迭代后不應該死掉嗎? 如果是這種情況,我很難看到內存泄漏將是一個大問題...
您確定它是腳本本身,而不是使用內存的子進程嗎? 也許它最終會創建一個真正的ssh會話,而不是在一個會話中做一堆東西?
你怎么知道這是內存泄漏? 我可以想到操作系統會殺死一個程序的許多其他原因。
我要問的第一個問題是“這個程序是否始終在命令行中正常工作?”。 如果答案是“否”,那么我先解決這些問題。
另一方面,如果答案為“是”,我將研究在cron和命令行下執行程序之間的所有區別,以找出它為什么行為不端。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.