跟踪线程内存和CPU消耗

我正在编写一个观察其他应用程序并跟踪资源消耗的Linux应用程序。 我正在计划使用Java,但编程语言对我来说并不重要。 目标很重要,所以我可以切换到其他技术或使用模块。 我的应用程序作为subprocess运行任何选定的第三方应用 大多数孩子软件解决了一些algorithm,如graphics,stringsearch等。观察程序跟踪孩子的资源,而它结束了工作。

如果子应用程序是multithreading的,也许有可能跟踪多less资源消耗每个线程? 可以使用任何非分配内存线程技术来编写应用程序:Java线程,Boost线程,POSIX线程,OpenMP,任何其他。

Solutions Collecting From Web of "跟踪线程内存和CPU消耗"

在现代的Linux系统(2.6)中,每个线程都有一个独立的标识符,与pid几乎相同。 它在进程表中显示(至少在htop程序中),它也有单独的/proc项,即/proc/<tid>/stat

检查man 5 proc ,特别注意statstatmstatus等。你应该在这里找到你感兴趣的信息。

唯一的障碍是获得这个线程标识符。 它与进程ID不同 ! 即在所有线程的getpid()调用返回相同的值。 为了得到实际的线程标识符,你应该使用(在一个C程序中):

 pid_t tid = syscall(SYS_gettid); 

顺便说一句,Java虚拟机(至少是OpenJDK Linux实现)在内部执行这个操作,并在后端将其用于调试目的,但不会将其暴露给java接口。

内存不分配给线程,并经常在线程间共享。 这使得谈论线程的内存消耗通常是不可能的,至少是没有意义的。

一个例子可能是一个有11个线程的程序; 1创建对象和10使用这些对象。 大部分的工作是在这10个线程上完成的,但是所有的内存都是在一个创建这个对象的线程上分配的。 现在怎么解释呢?

如果你愿意使用Perl,请看这个: Sys-Statistics-Linux

我将其与一些GD图形包一起使用,以生成各种进程的系统资源使用图。

有一件事要注意 – 你真的需要阅读/ proc和理解jiffies – 上次我看,他们没有正确记录在手册页,你需要阅读内核源码可能:

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

另外,请记住,在Linux中,线程和进程之间的唯一区别是线程共享内存 – 除了它们在内核如何实现它们方面相同之外。