【问题标题】:How to analyse memory distribution in a process?如何分析进程中的内存分布?
【发布时间】:2018-10-15 18:07:24
【问题描述】:

我有一个正在运行的(私有)服务器,它使用大约 1.1G 虚拟内存(1.0G 物理内存)。虽然我有服务器的源代码,但我想找出更好的解决方案,我可以用它来全面了解服务器中对象之间的内存分布?像这样的东西:

HashTable: 50%, 500M

PlayerCache: 20%, 200M

OtherA: 10%, 100M

...

指针可能在对象中并指向动态分配的内存。

【问题讨论】:

  • 您可以通过将调试器附加到服务器进程并检查变量的大小来实现。
  • 那台服务器在做什么?是一些free software 程序吗?它是多线程的吗?所以编辑你的问题来改进它并获得更好的答案
  • 如果没有更多细节,这个问题太宽泛了,不清楚
  • 服务器是用什么编程语言编写的?您是否了解它的源代码,并且您愿意改进该源代码(并以某种方式对其进行检测)?请编辑您的问题甚至更多;在几段中解释服务器在做什么,关于源代码的一些细节(编程语言,源代码的大小,对它的熟悉程度)。也许在问题中显示您的一些源代码(最好是一些与您的代码相关的minimal reproducible example...)

标签: linux memory memory-management


【解决方案1】:

在 Linux 上,您可以使用 proc(5)pmap(1)(顺便说一句,pmap(1)top(1)ps(1) 都在使用 /proc/ 并且对您有用)。

因此,如果您的服务器 process 具有 pid 1234,您可以在终端中尝试 pmap 1234cat /proc/1234/maps 以了解您的进程的 virtual address space。也可以试试cat /proc/1234/status

请记住,进程在virtual memory 中运行,每个进程都有自己的虚拟地址空间,并且物理 RAM 是由内核管理的资源。您可能对RSS 感兴趣

您不会有一份详细说明每种类型或每个变量的动态内存使用情况的报告(因为一般来说没有任何意义:例如,在 C , 给定的malloc-ed 内存区域可以通过不同类型的强制转换来取消引用,并且可以通过几个变量进行访问(可能是间接访问)。如果您的程序使用C dynamic memory allocation,您可以使用malloc_stats(3)(它可以提供与内存区域大小相关的统计信息)。

你可以使用valgrind,非常适合打猎memory leaks

您可以修改您的服务器的源代码,以便以您的特定方式对它正在执行的heap allocation 进行处理和计算。例如,如果您使用 C++ 编写代码,您可以修改类的构造函数和析构函数以递增和递减一些 static 或全局计数器,或者提供一些特定于类的 operator newdelete。堆内存消耗是整个程序的属性(并且一般特定类型或变量无关)。有些程序有自己的(特定类型的)allocators 或使用基于竞技场的或region based allocation

还可以阅读有关garbage collection 的内容,例如GC handbook,获取有用的概念、术语和技术(例如tracing GCreference countingweak referencescircular referencessmart pointers 等)。它们甚至对manual memory management 也很重要。

内存管理和分配是特定于每个程序的,特别是在像 C 或 C++(或 Rust)这样具有手动内存管理的编程语言中,约定很重要,并且特定于每个程序。研究现有各种free software 服务器的源代码(例如ApacheLighttpdPostGreSQLXorgUnisonGit,...),你会发现每一个它们对内存管理有不同的约定。

【讨论】:

  • 为什么要投反对票,因为我改进了我的答案以解释 OP 的问题太笼统而无法获得有用的具体答案,但我试图给出一些提示。
  • 我询问然后删除了与我上面的答案相关的this meta question。没有 cmets 的投票让我有点恼火
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 2012-10-03
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 2011-06-15
  • 2016-02-10
  • 1970-01-01
相关资源
最近更新 更多