簡體   English   中英

我可以在OS X 10.5上使用dtrace來確定哪個perl subs導致了大部分內存分配?

[英]Can I use dtrace on OS X 10.5 to determine which of my perl subs is causing the most memory allocation?

我們有一個非常棒的perl代碼庫。

一些運行多個小時的進程(ETL作業)突然開始消耗比平常更多的RAM。 分析相關版本的變化是一個緩慢而令人沮喪的過程。 我希望使用更自動化的分析來識別罪魁禍首。

我們的現場環境是關於Debian擠壓的perl 5.14。

不過,我可以訪問很多OS X 10.5機器。 Dtrace和perl似乎在這個平台上很好地一起玩。 似乎在Linux上使用dtrace需要啟動更多工作。 我希望我們的實時系統和開發OS X系統之間的內存分配模式類似 - 或者至少相似,足以幫助我找到這種新內存使用的起源。

這個幻燈片:

https://dgl.cx/2011/01/dtrace-and-perl

顯示了如何使用dtrace來顯示perl sub對malloc的調用次數。 我感興趣的是跟蹤perl在進程生命周期內執行每個sub時分配的內存總量。

關於如何做到這一點的任何想法?

沒有一種方法可以做到這一點,並且在逐個子的基礎上進行此操作並不總是檢查內存使用情況的最佳方法。 我將推薦一組您可以使用的工具,一些工作作為一個整體,另一些工具允許您檢查代碼的單個部分或單個變量。

您可能想考慮使用Valgrind 甚至還有一個名為Test :: Valgrind的Perl模塊,它將幫助您為Perl構建設置一個抑制文件 ,然后檢查腳本中的內存泄漏或錯誤。

還有Devel :: Size ,它完全符合您的要求,但是基於逐個變量而不是逐個變量。

您可以使用Devel :: Cycle在復雜數據結構中搜索無意的循環內存引用。 雖然循環引用並不意味着在使用對象時浪費內存,但循環引用會阻止鏈中的任何內容被釋放,直到循環中斷為止。

Devel :: Leak比其他部分更加神秘,但它基本上可以讓你獲得有關任何SV的完整信息,這些SV在你的程序執行中的兩點之間沒有被破壞。 如果您通過子調用檢查這一點,您將知道該子例程分配的任何新內存。

您可能還想閱讀Perl手冊的perldebguts部分。

我無法提供更多幫助,因為每個代碼庫都會變得與眾不同。 Test :: Valgrind對於某些代碼庫非常有用,而對其他代碼庫則非常有用。 如果您打算嘗試一下,我建議您使用最新版本的Valgrind和Perl> = 5.10,因為Perl 5.8和Valgrind在歷史上並不相處得太好。

您可能想要查看Memory :: UsageDevel :: Size

檢查整個過程或子過程:

use Memory::Usage;
my $mu = Memory::Usage->new();

# Record amount of memory used by current process
$mu->record('starting work');

# Do the thing you want to measure
$object->something_memory_intensive();

# Record amount in use afterwards
$mu->record('after something_memory_intensive()');

# Spit out a report
$mu->dump();

或者檢查特定變量:

use Devel::Size qw(size total_size);

my $size = size("A string");

my @foo = (1, 2, 3, 4, 5);
my $other_size = size(\@foo);

my $foo = {
     a => [1, 2, 3],
     b => {a => [1, 3, 4]}
};
my $total_size = total_size($foo);

這個問題的答案是'是'。 Dtrace可用於分析perl進程中的內存使用情況。

這段代碼:

https://github.com/astletron/perl-dtrace-malloc/blob/master/perl-malloc-total-bytes-by-sub.d

跟蹤程序中每個子程序的調用和返回之間內存使用量的增加情況。 作為一個額外的好處,dtrace似乎為你排序輸出(至少在OS X上)。 涼。

感謝所有插話。我自己回答了這個問題,因為這個問題非常適合dtrace / perl。

您可以編寫一個基於Devel :: CallTrace的簡單調試模塊,它打印輸入的子目錄以及當前進程的當前內存大小。 (使用/ proc或其他。)

暫無
暫無

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

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