【发布时间】: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