Linux 测量进程使用的内存,说明写时拷贝

Linux 测量进程使用的内存,说明写时拷贝,linux,ubuntu,memory,linux-kernel,Linux,Ubuntu,Memory,Linux Kernel,Linux有写时拷贝,这意味着,在fork之后,子进程可以与父进程共享内存,只要它不修改它 假设父进程占用10GB的物理RAM。当我进行分叉处理时,操作系统使用的物理内存不会立即增加10GB(由于创建了一些管理结构,它可能会略微增加)。这可以使用freeshell命令确认。因此,free正确地解释了CoW 但是,当我向操作系统询问特定进程使用的内存量时(例如,使用top或我知道的任何C API函数),它显示子进程使用的物理内存立即为10 GB(在它修改任何内容之前)。因此,每进程内存跟踪函数不能

Linux有写时拷贝,这意味着,在fork之后,子进程可以与父进程共享内存,只要它不修改它

假设父进程占用10GB的物理RAM。当我进行分叉处理时,操作系统使用的物理内存不会立即增加10GB(由于创建了一些管理结构,它可能会略微增加)。这可以使用
free
shell命令确认。因此,
free
正确地解释了CoW

但是,当我向操作系统询问特定进程使用的内存量时(例如,使用
top
或我知道的任何C API函数),它显示子进程使用的物理内存立即为10 GB(在它修改任何内容之前)。因此,每进程内存跟踪函数不能正确解释CoW

我正在寻找一种方法来衡量每进程内存占CoW。(我将从python中使用它,但一旦我了解了相关的C API,我就可以了。)

澄清:出于记帐目的,多个进程使用的共享内存应该分配给父进程

用例:

我们试图减少应用程序使用的总内存。我们在父进程中有非常大的数据结构,通过简单的分叉与子进程共享。我们不需要在子进程中修改这些结构,但对引用计数器的修改(在python中)会导致部分内存被复制。我们正试图将这种情况发生的程度降至最低,以保留物理内存

相关问题

(提供可能的答案)


(为创建解决方案提供了一些有用的细节)

我不知道在内核之外有什么方法可以解决这个问题-您需要遍历每个进程的虚拟到物理映射,然后关联进程之间的物理映射,同时考虑没有物理映射的交换内存。当你完成的时候,你的答案就不再正确了


据我所知,没有任何操作系统能满足您的要求。如果这个问题值得解决,我想一定有人会这么做。

两个进程的虚拟页面映射到相同的物理页面;对于“谁拥有物理内存”没有明确的答案……哪个进程拥有内存的自然定义是父进程拥有共享内存,因为它在子进程启动之前就已经被使用了。这将为子进程分配(几乎)零内存,直到它真正开始修改它为止。在某些情况下,此定义可能没有用处,但在最明显的情况下,这有助于分析和提高内存使用率。这是一个好主意,但在实践中,并没有跟踪这一点。我不认为担心谁“拥有”内存是有成效的——而是专注于找出哪些页面映射到多个进程,而那些不是。在fork进行测试之前,是否有任何方法可以将某些页面设置为只读?如果您的代码试图对其进行写入,那么这可能会导致保护故障,从而让您至少在测试覆盖路径的范围内了解这些情况。您能否以某种方式使用进程间共享内存(仅从一侧读取)而不是fork之后的写时复制行为来重新工作?似乎您真正想要做的是将数据分组到一个位置,而不是将元数据(如引用计数)分组到另一个位置,因此,前者可以保留在许多未修改的页面中,而后者可以集中在几个已修改的页面中。也许改变结构的大小(更小更大的,内部有人工区分)会有所帮助。一个真正的解决方案是修改python以使用不同的分配器存储这两个类别,但这将是一个大项目。你能解释一下“无物理映射”是什么意思吗?我原以为我所问的共享内存会从父进程和子进程映射到物理内存,但映射会到同一个物理内存,不是吗?@max:有些内存可能被调出,其他内存可能尚未分配物理映射,但其他内存可能有意映射到文件。