【问题标题】:Tracking threads memory and CPU consumption跟踪线程内存和 CPU 消耗
【发布时间】:2009-09-16 07:54:32
【问题描述】:

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

如果子应用程序是多线程的,也许可以通过某种方式跟踪每个线程消耗了多少资源?可以使用任何非分布式内存线程技术编写应用程序:Java 线程、Boost 线程、POSIX 线程、OpenMP 等。

【问题讨论】:

  • 您是否从 OProfile 中寻找灵感? oprofile.sourceforge.net
  • 不,这是我硕士学位的工作。也许我的讲师看起来 :-) 但是 OProfile 看起来很有趣。谢谢。

标签: linux multithreading memory resources


【解决方案1】:

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

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

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

pid_t tid = syscall(SYS_gettid);

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我不能说你不对。但是我们可以假设单线程内存使用量是当前特定线程工作的内存量。大多数线程在处理数据时使用信号量或互斥锁锁定内存。
    • 对不起,但这仍然没有意义。只读存储器根本不需要锁。当使用互斥体时,没有合理的方法来确定它保护的内存而不去代码。
    • 我不是在谈论只读内存。我们仍然可以统计线程的内存消耗。例如处理一些图表,为一些计数创建节点等。每个这些数据都可以由一个线程访问,由它自己创建并在工作完成后清理。
    • 那么,当一个线程将与一个节点一起工作时,该节点是否计入使用的内存?或者整个图的内存是否计入线程使用的内存?我并不是说没有特定于线程的 no 分配。这根本不够。在许多实际程序中,您可能会发现分配给进程的所有内存的 90% 不能唯一地分配给它的任何线程。最终结果:进程使用 50 MB,它的 10 个线程中的每一个“使用”1 MB,而 40 MB 是“丢失”的。因此,您的结果将不可信。
    【解决方案3】:

    如果您愿意使用 Perl,请查看:Sys-Statistics-Linux

    我将它与一些 GD 绘图包一起使用,为各种进程生成系统资源使用图。

    有一点需要注意——你真的需要阅读 /proc 并理解 jiffies——上次我查看它们在手册页中没有正确记录时,你可能需要阅读内核源代码:

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-18
      • 1970-01-01
      • 2011-02-20
      • 2010-11-05
      • 2014-09-21
      • 2015-10-06
      • 2017-10-01
      • 2014-03-07
      • 2010-09-08
      相关资源
      最近更新 更多