【问题标题】:How to identify memory consumption per thread in a process?如何识别进程中每个线程的内存消耗?
【发布时间】:2018-10-02 02:02:59
【问题描述】:

用 C 编写的多线程进程几乎耗尽了所有系统内存。为了找出消耗大部分内存的线程,我使用gcore [pid] 创建了一个核心文件来检查每个线程的内存使用情况,但我找不到这样做的方法。

ps -eLFlm 和带有 -H 选项的 top 命令显示总内存消耗,但不是每个线程。

有什么有用的提示可以解决这个问题吗?

操作系统:Centos6

【问题讨论】:

  • 试试$ ps -T -p <pid>
  • 你确定这个说法找出消耗内存的线程?在你的进程中确实有多个线程产生。
  • ps -T -p 不显示内存信息。它显示线程的PID。我要检查的进程有 18 个线程,包括 LWP。
  • 你的程序在做什么?在耗尽系统内存之前运行多长时间?它有多大(数十万行 C)?你在使用什么库?所有这些细节都很重要,所以你最好edit你的问题并提供一些动机和背景!

标签: multithreading memory ps


【解决方案1】:

用 C 编写的多线程进程几乎耗尽了所有系统内存。找出消耗大部分内存的线程......

这个问题没有意义。根据定义,同一个进程的所有线程共享同一个virtual address space。您可以使用proc(5) 以编程方式查询它(例如,您的程序中的reading /proc/self/maps)。

有可能(并且很常见)在线程 A 中分配了一些堆内存(例如使用 malloc),稍后会在其他线程 B(通常是主线程)中释放(例如 free-d)线程,就在退出之前)。

C dynamic memory management根据定义是一个完整的程序属性。

一个典型的例子是pthread_create(3) 的最后一个arg 参数。它通常应该是堆分配的。您可以记录并采用调用线程(使用pthread_create的线程)将malloc它的约定,但创建的线程应该free它(您可以要求传递给pthread_create的每个start_routine应该free 那个arg)。

有什么有用的提示可以解决这个问题吗?

也许valgrind 可能会帮助您找到您的memory leaks。您最好使用DWARF 调试信息(例如编译with gcc -g)编译所有程序(可能还有一些相关库),然后重新启动程序。但是这样的 bug 很难找到,所以准备好花几个星期的时间来解决它们。


从概念的角度来看,garbage collection(以及smart pointersRAII,也许是reference counting 等...)的“理论”可能会有所帮助。所以请阅读GC handbook(它介绍了好的概念和术语,并解释了内存管理是一个完整的程序问题)。许多概念甚至与非 GC 语言(如 C 或 C++)中的程序相关。

您需要定义并遵循一些足够好的整个程序约定关于内存管理(这很困难)。

【讨论】:

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