【问题标题】:thread level memory consumption of process进程的线程级内存消耗
【发布时间】:2009-10-14 16:59:33
【问题描述】:

如何在 Linux 中获取基于每个线程的进程的内存消耗? 我知道我们可以使用 /proc/pid/task/tid/statm,但这对我的情况没有帮助。 所有线程都显示相同的值,并且与PID的statm相同。

我们可以做 valgrind,但我不是在寻找任何无效的读/写或泄漏。 Valgrind 不会告诉我任何线程级别的信息。

还有其他建议吗?

编辑: 如何分析我的代码?在哪个函数/行号等中分配了多少内存?

【问题讨论】:

  • 嗯,从概念上讲,所有线程都可以访问同一个内存池,因此它们都使用相同的内存量。您要跟踪的是每个线程的分配数量——我不认为 glibc 或内核会这样做。并考虑一下:如何计算在一个线程中分配并在另一个线程中释放的内存块?
  • 我可以在 malloc 之上编写包装器,它可以收集统计信息,但如果我使用大量 malloc 分析大量代码,这会很困难。
  • 使用调用gettid(2) 的malloc 包装器怎么样?这样,您可以保持调用代码相同,同时跟踪哪个线程正在调用包装器。
  • 我可以在 malloc 包装器中传递一些变量来跟踪线程。即使 tid 在多次执行中发生变化,这个数字也保持不变。但这不是问题。真正的问题是,必须使用互斥锁等跨线程维护全局统计变量。我的代码非常庞大,替换所有这些 malloc 将很困难。但这似乎是唯一可行的选择。

标签: c linux multithreading pthreads procfs


【解决方案1】:

所有线程共享相同的地址空间并使用相同的堆,因此除了它们的堆栈之外,它们应该都显示相同的内存使用情况。

【讨论】:

  • 感谢您的回答。让我重新表述我的问题:如何在线程级别分析我的二进制文件?我的意思是,在代码中的哪一点分配了多少内存?我的线程通常不共享内存块。他们只是共享一些 fds、IPC 文件等。
  • 接受这是我得到的唯一答案:D 我同意它显示相同的内存用法这一事实。除此之外,我无能为力..
【解决方案2】:

Linux中有一个选项可以查看cpu和内存的线程级使用情况

您可以将命令top 与选项-H-p 一起使用

top -H -p<PID>

命令将列出带有以下标头的结果,在这种情况下,您应该将PID 读作 TID(Thread id)。

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND`

在java进程的情况下很明显如下。如果您创建进程的线程转储并将线程 id 转换为十进制,则可以与 top -H -p &lt;PID&gt; 的输出中列出的 TID 匹配

对于

【讨论】:

    猜你喜欢
    • 2014-09-21
    • 2015-10-06
    • 2016-04-29
    • 2017-05-28
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    相关资源
    最近更新 更多