2013-04-03 101 views
1

以下DTrace腳本會給已執行過程中的所有分配的總和:如何使用DTrace確定進程的最大內存使用

pid$target::malloc:entry { @ = sum(arg0); } 

現在,我的最大總相當感興趣在進程的使用壽命期間(約50毫秒)分配內存使用量。我怎樣才能既產生什麼將超過總分配的內存使用情況(所有mallocs減去所有的FreeS之和的總和)的時間的圖表,或者只是其最大值。我試過手動跟蹤所有分配的內存塊,但超過了dtrace關聯數組的大小限制。

回答

1

首先,由於您不跟蹤free s和malloc s,因此您的dtrace腳本將爲您提供最大內存利用率的上限。你可能不關心這個。如果你做護理,因爲free不接受或返回的釋放範圍的大小,你可能會更好跟蹤brk()系統調用的返回值,這也佔了所有元數據的大小malloc存儲在堆上。這種替代(如果你想確切的答案)是要弄清楚如何將數據結構爲mallocfree工作,爲您的操作系統,並深入到DTrace中一些指針運算來獲得這些信息。

其次是謹慎的一個字 - 如果你想利用這個來實現非常快的分配器,記住,你需要的整個堆的大小(不只是內存malloc回報),因爲定位存儲在內存中的值是重要的,malloc返回的範圍不包含這個「死區」。現在

,對你的問題。

  1. 您可以通過跟蹤數據,因爲它的用武之地。只需使用printa(@)每次調用@ = sum(...)時間後打印聚集的當前值獲得的畫面隨着時間的推移。或者,如果您希望在圖片中生成更準確的時間軸,則可以使用malloc大小(如@[walltimestamp] = sum(...))記錄時間戳。在這種情況下,聚合中的每個條目將只包含一個分配大小,而不是所有聚合的總和。

  2. 如果您更喜歡第一個解決方案,但也想要一個精確的時間軸,則只需在第一個示例中調用printa(@)之前的trace(walltimestamp)即可。

如果你不使用DTrace的設置,你可以隨時使用/usr/bin/time -lp(在Mac OS X - 在其他平臺上同樣的事情存在,但參數是不同的),以獲取有關進程資源利用一些靜態信息。

% /usr/bin/time -lp 'date' 
Tue Jun 25 14:14:35 PDT 2013 
real   0.00 
user   0.00 
sys   0.00 
    561152 maximum resident set size 
     0 average shared memory size 
     0 average unshared data size 
     0 average unshared stack size 
     158 page reclaims 
     0 page faults 
     0 swaps 
     0 block input operations 
     0 block output operations 
     0 messages sent 
     0 messages received 
     0 signals received 
     0 voluntary context switches 
    3 involuntary context switches 
+0

謝謝你的答案。我對最大內存利用率感興趣(不僅僅是一個上限,因爲這是幾個數量級太高)。我嘗試過追蹤'brk()',但在我的操作系統(OSX)上''malloc()'似乎使用'mmap()'。我從追蹤'mmap()'/'munmap()'中獲得合理的總價值是不成功的。追蹤像目前常駐內存頁面的數量將是理想的,但我不知道如何做到這一點。 – digitalvision

+1

如何在你的進程上運行'/ usr/bin/time -lp'?我學會了這一招[從另一個問題(http://stackoverflow.com/questions/774556/peak-memory-usage-of-a-linux-unix-process),它似乎在Mac OS X上非常漂亮的工作僅供參考,DTrace中還有['vminfo'提供程序](https://wikis.oracle.com/display/DTrace/vminfo+Provider),但用於測量進程的最大大小將很困難。 – Dan

+0

謝謝。 '/ usr/bin/time -lp'給了我我想要的東西。 – digitalvision