2009-09-16 139 views
7

我正在編寫一個觀察其他應用程序並跟蹤資源消耗的Linux應用程序。我正在計劃使用Java,但編程語言對我來說並不重要。目標很重要,所以我可以切換到其他技術或使用模塊。我的應用程序運行任何選定的第三方應用程序作爲子進程大多數兒童軟件解決了一些算法,如圖形,字符串搜索等。觀察程序在結束作業時跟蹤孩子的資源。跟蹤線程內存和CPU消耗

如果子應用程序是多線程的,可能以某種方式跟蹤每個線程佔用了多少資源?可以使用任何非分配內存線程技術來編寫應用程序:Java線程,Boost線程,POSIX線程,OpenMP,以及其他任何其他線程。

+1

你看過OProfile的靈感嗎? http://oprofile.sourceforge.net – 2009-09-16 07:57:36

+0

不,這是我的碩士學位。也許我的講師看起來:-)但是,OProfile看起來很有趣。謝謝。 – Pawka 2009-09-16 08:12:25

回答

5

在現代Linux系統(2.6)中,每個線程都有一個單獨的標識符,它與pid具有幾乎相同的處理方式。它在過程表中顯示(至少在htop程序中),它也有其單獨的/proc條目,即/proc/<tid>/stat

檢查​​並特別注意stat,statm, status等您應該在其中找到您感興趣的信息。

唯一的障礙是獲得這個線程標識符。它與進程編號不同!即所有線程中的getpid()調用返回相同的值。爲了獲得實際的線程標識符,你應該(在C程序)使用方法:

pid_t tid = syscall(SYS_gettid); 

順便說一句,Java虛擬機(至少,其OpenJDK的Linux實現)確實在內部,並用它在調試目的它的後端,但不暴露給java界面。

4

內存不分配給線程,並且通常跨線程共享。這使得談論線程的內存消耗通常是不可能的,至少是沒有意義的。

一個例子可能是一個帶有11個線程的程序; 1創建對象和10使用這些對象。大部分工作是在這10個線程上完成的,但是所有內存都分配在創建對象的一個​​線程上。現在怎麼解釋呢?

+0

我不能說你不對。但是我們可以假設單線程內存使用量是當前特定線程工作的內存量。大多數線程在使用數據時使用半色或互斥鎖鎖定內存。 – Pawka 2009-09-16 10:14:21

+0

對不起,但這仍然沒有意義。只讀存儲器根本不需要鎖。當使用互斥鎖時,沒有合理的方法可以確定它保護的內存,而無需執行代碼。 – MSalters 2009-09-16 11:28:59

+0

我不是在說只讀內存。我們仍然可以計算線程的內存消耗。例如,使用某個圖形,爲某些計數創建節點等。每個數據都可以由一個線程訪問,由其自己創建並在工作完成後清理。 – Pawka 2009-09-17 06:37:07

1

如果你願意使用Perl來看看這個:Sys-Statistics-Linux

我與一些GD圖形包一起使用它來生成各種流程的系統資源使用情況的圖形。

有一點需要注意 - 你真的需要閱讀/ proc和理解jiffies - 上次我看他們沒有正確記錄在手冊頁中,你需要閱讀內核源碼:

http://lxr.linux.no/#linux+v2.6.18/include/linux/jiffies.h

另外請記住,在Linux中線程和進程之間的唯一區別是,線程共享內存 - 比他們在內核中是如何實現他們相同的一種。

+0

Sys-Statistics-Linux鏈接被破壞.. – 2016-10-04 14:23:48