跟踪线程内存和CPU消耗
我正在编写一个观察其他应用程序并跟踪资源消耗的Linux应用程序。 我正在计划使用Java,但编程语言对我来说并不重要。 目标很重要,所以我可以切换到其他技术或使用模块。 我的应用程序运行任何选定的第三方应用程序作为子进程 大多数儿童软件解决了一些算法,如图形,字符串搜索等。观察程序在结束作业时跟踪孩子的资源。
如果子应用程序是多线程的,可能以某种方式跟踪每个线程占用多少资源? 可以使用任何非分配内存线程技术来编写应用程序:Java线程,Boost线程,POSIX线程,OpenMP,以及其他任何其他线程。
在现代Linux系统(2.6)中,每个线程都有一个单独的标识符,与pid具有几乎相同的处理方式。 它在进程表中显示(至少在htop程序中),它也有单独的/proc
项,即/proc/<tid>/stat
。
检查man 5 proc
并特别注意stat
, statm
, status
等。你应该在那里找到你感兴趣的信息。
唯一的障碍是获取此线程标识符。 它与进程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中,线程和进程之间唯一的区别是线程共享内存 - 除了它们在内核如何实现它们方面相同之外。
链接地址: http://www.djcxy.com/p/35051.html