簡體   English   中英

找到Perl內存泄漏

[英]Finding a Perl memory leak

已解決,請參閱編輯2

你好,

我一直在編寫一個Perl程序來處理本地(專有)程序的自動升級(對於我工作的公司)。

基本上,它通過cron運行,不幸的是有內存泄漏(或類似的東西)。 問題是泄漏只發生在我不看的時候(也就是說當通過cron運行時,而不是通過命令行)。

我的代碼不包含任何循環(或其他)引用,因此常用的工具對我Devel::CycleDevel::CycleDevel::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";
}

將實際使用的大小與您認為每個對象的合理值進行比較。 可能會立即彈出一些可疑的東西(例如,一個聽起來很合理的任何東西都會大量膨脹)。

其他嘗試:

  • 一次消除一些功能,看看突然事情是否變得更好; 我首先使用任何外部庫
  • 不良行為是僅僅局限於一台特定的機器還是一個特定的操作系統? 將程序移動到其他系統以查看其行為如何變化。
  • (在單獨的安裝中)嘗試升級到最新的Perl(5.10.1),並升級所有CPAN模塊

如果它是由cron運行的,那迭代后不應該死掉嗎? 如果是這種情況,我很難看到內存泄漏將是一個大問題...

您確定它是腳本本身,而不是使用內存的子進程嗎? 也許它最終會創建一個真正的ssh會話,而不是在一個會話中做一堆東西?

你怎么知道這是內存泄漏? 我可以想到操作系統會殺死一個程序的許多其他原因。

我要問的第一個問題是“這個程序是否始終在命令行中正常工作?”。 如果答案是“否”,那么我先解決這些問題。

另一方面,如果答案為“是”,我將研究在cron和命令行下執行程序之間的所有區別,以找出它為什么行為不端。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM