2015-09-16 65 views
2

有沒有一種方法可以從正在運行的進程中確定(或估算)Solaris進程的內存使用情況?我需要編寫一個函數來進行內存清理,以在進程變得過大時將進程保持在某個閾值以下。Solaris上運行時進程的當前內存使用情況

似乎Solaris不支持gestusage或任何方式查詢系統的當前RSS/VSZ(內存使用情況),如Linux/Windows。

+0

你在用什麼語言進行編程?你可以使用prstat嗎? –

+0

我正在使用C/C++。 prstat是終端的命令。據我所知,在運行時沒有簡單的方法將這些信息提供給進程(如果有任何方法的話)。 – elizzmc

+1

通過'prstat'的手冊頁(http://docs.oracle.com/cd/E19253-01/816-5166/prstat-1m/index.html),'prstat'接受間隔和計數參數。你可以用'prstat 1 1'之類的東西運行'prstat'。你可以通過'popen()'來運行它,並以這種方式輕鬆收集輸出。添加'-n'選項以獲得更多的15個進程:'prstat -n 100000 1 1'。 –

回答

3

獲取信息的一種方法是從/proc文件系統讀取數據。你可以從/proc/self/psinfo/proc/self/map/proc/self/xmap得到你想要的信息。請參閱man -s 4 proc

/proc/self/psinfo文件包含struct psinfo/psinfo_t,如procfs.h所述。該結構包含size_t pr_size;,其中包含「過程映像的大小(單位爲kBytes)」和size_t pr_rssize;,其中包含「駐留集大小(單位爲kBytes)」。

/proc/self/map/proc/self/xmap文件包含struct prmap/prmap_t結構和struct prxmap/prxmap_t結構陣列,respecitively。兩個結構都包含一個定義爲「以字節爲單位的映射大小」的size_t pr_size;字段。

請仔細閱讀/proc - 確保您瞭解您嘗試讀取的數據是否存儲爲32位或64位進程。不速之客,我認爲Solaris /proc中的所有內容現在都是64位的。

+0

pr_rssize是rss的峯值,它不會告訴我當前的大小是多少。我知道我的流程太大的唯一方法是如果峯值發生變化,這不是檢查我的流程規模的可持續方式。我正在尋找一種方法來在任何特定時刻了解當前的rss。 – elizzmc

+0

編輯:RSS不會丟失,因爲釋放分配給進程的內存不會將內存返回到操作系統。因此,高峯RSS是唯一的RSS。標記爲最正確的答案。 – elizzmc

相關問題