2011-11-25 52 views
1

我正在通過從Proc文件系統讀取值來編寫Perl中的小型進程監視器腳本。現在我能夠使用/proc/[pid] /狀態/proc/[pid]/io文件獲取線程數,進程狀態,讀取和寫入的字節數。現在我想計算進程的內存使用情況。搜索後,我開始知道內存使用情況將出現在/proc/[pid]/statm。但我仍然無法弄清楚該文件需要哪些必要字段來計算內存使用情況。誰可以幫我這個事?提前致謝。使用Proc文件系統計算進程的內存

回答

2

您可能想要residentsize。來自kernel.org

  • 大小程序總量
    • 這是整個程序,包括東西從不換
  • 居民駐留集大小
    • 的東西,在當前時刻RAM(這不包括換出的頁面)
+0

感謝您的回覆。坦率地說,我不回答。其實我想計算一下這個過程的內存使用情況。那麼這將適合這個? – Allwyn

+0

@Winbros'居民'。 – cnicutar

1

另一個(不太簡單但更精確)的可能性是解析/proc/123/maps文件,也許是通過使用pmap實用程序。它爲您提供有關「虛擬內存」(即進程的地址空間)的信息。

2

知道過程的「內存使用情況」非常困難。 VM大小和RSS是已知的,可測量的值。

但你可能想要的是別的東西。實際上,「VM大小」似乎太高,RSS通常似乎太低。

的主要問題是:

  • 多個進程可以共享相同的頁面。您可以將所有正在運行的進程的RSS加起來,並且以比計算機的物理內存多得多(這是在對內核數據結構進行計數之前)
  • 屬於進程的專用頁面可以換出。或者他們可能還沒有初始化。他們數數?
  • 您究竟如何計算內存映射文件頁?骯髒的?清潔的? MAP_SHARED或MAP_PRIVATE?

所以你真的需要考慮什麼纔算「內存使用量」。

在我看來,在邏輯:它不與任何其他進程共享

  • 私人網頁(NB:私人頁面仍然可以寫入時複製)必須即便算上如果換出
  • 共享頁面數應除以它們共享的進程數通過兩個進程共享的頁面數量的一半
  • 文件支持頁面,這是居民可以以同樣的方式
  • 文件支持的非居民頁面可以忽略
  • 計數如果在同一個頁面映射不止一次成同一進程的地址空間,第2次及以後可以忽略。這意味着如果proc 1將頁面X映射了兩次,並且proc 2將頁面X映射了一次,則它們都「收費」了半頁。

我不知道這樣做的任何實用工具。這似乎並不平凡,並且涉及(至少)讀取/ proc/pid/pagemap和其他一些/ proc接口,其中一些接口是僅限根的。

相關問題