以下DTrace腳本會給已執行過程中的所有分配的總和:如何使用DTrace確定進程的最大內存使用
pid$target::malloc:entry { @ = sum(arg0); }
現在,我的最大總相當感興趣在進程的使用壽命期間(約50毫秒)分配內存使用量。我怎樣才能既產生什麼將超過總分配的內存使用情況(所有mallocs減去所有的FreeS之和的總和)的時間的圖表,或者只是其最大值。我試過手動跟蹤所有分配的內存塊,但超過了dtrace關聯數組的大小限制。
以下DTrace腳本會給已執行過程中的所有分配的總和:如何使用DTrace確定進程的最大內存使用
pid$target::malloc:entry { @ = sum(arg0); }
現在,我的最大總相當感興趣在進程的使用壽命期間(約50毫秒)分配內存使用量。我怎樣才能既產生什麼將超過總分配的內存使用情況(所有mallocs減去所有的FreeS之和的總和)的時間的圖表,或者只是其最大值。我試過手動跟蹤所有分配的內存塊,但超過了dtrace關聯數組的大小限制。
首先,由於您不跟蹤free
s和malloc
s,因此您的dtrace腳本將爲您提供最大內存利用率的上限。你可能不關心這個。如果你做護理,因爲free
不接受或返回的釋放範圍的大小,你可能會更好跟蹤brk()
系統調用的返回值,這也佔了所有元數據的大小malloc
存儲在堆上。這種替代(如果你想確切的答案)是要弄清楚如何將數據結構爲malloc
和free
工作,爲您的操作系統,並深入到DTrace中一些指針運算來獲得這些信息。
其次是謹慎的一個字 - 如果你想利用這個來實現非常快的分配器,記住,你需要的整個堆的大小(不只是內存malloc
回報),因爲定位存儲在內存中的值是重要的,malloc返回的範圍不包含這個「死區」。現在
,對你的問題。
您可以通過跟蹤數據,因爲它的用武之地。只需使用printa(@)
每次調用@ = sum(...)
時間後打印聚集的當前值獲得的畫面隨着時間的推移。或者,如果您希望在圖片中生成更準確的時間軸,則可以使用malloc
大小(如@[walltimestamp] = sum(...)
)記錄時間戳。在這種情況下,聚合中的每個條目將只包含一個分配大小,而不是所有聚合的總和。
如果您更喜歡第一個解決方案,但也想要一個精確的時間軸,則只需在第一個示例中調用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
謝謝你的答案。我對最大內存利用率感興趣(不僅僅是一個上限,因爲這是幾個數量級太高)。我嘗試過追蹤'brk()',但在我的操作系統(OSX)上''malloc()'似乎使用'mmap()'。我從追蹤'mmap()'/'munmap()'中獲得合理的總價值是不成功的。追蹤像目前常駐內存頁面的數量將是理想的,但我不知道如何做到這一點。 – digitalvision
如何在你的進程上運行'/ 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
謝謝。 '/ usr/bin/time -lp'給了我我想要的東西。 – digitalvision