跟踪线程内存和CPU消耗

Paw*_*wka 7 linux memory resources multithreading

我正在编写一个Linux应用程序,它可以观察其他应用程序并跟踪资源消耗.我正在计划使用Java,但编程语言对我来说并不重要.目标很重要,所以我可以切换到另一种技术或使用模块.我的应用程序将所选的第三方应用程序作为子进程运行 大多数儿童软件解决了一些算法,如图形,字符串搜索等.观察者程序在结束工作时跟踪子资源.

如果子应用程序是多线程的,那么可能以某种方式跟踪消耗每个线程的资源量?应用程序可以使用任何非分布式内存线程技术编写:Java线程,Boost线程,POSIX线程,OpenMP,任何其他.

P S*_*ved 6

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

检查man 5 proc并特别注意stat,statm,status等你会发现你有兴趣在那里的信息.

唯一的障碍是获取此线程标识符.这是与进程id不同!即getpid()所有线程中的调用返回相同的值.要获取实际的线程标识符,您应该使用(在C程序中):

pid_t tid = syscall(SYS_gettid);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,java虚拟机(至少,它的OpenJDK Linux实现)在内部执行,并在后端使用它进行调试,但不会将其暴露给java接口.


MSa*_*ers 6

内存未分配给线程,并且通常跨线程共享.这使得谈论线程的内存消耗通常是不可能的并且至少是毫无意义的.

一个例子可以是一个包含11个线程的程序; 1创建对象,10使用这些对象.大多数工作都是在这10个线程上完成的,但所有内存都是在创建对象的一个​​线程上分配的.现在如何解释这一点?