测量进程使用的内存,考虑写时复制

时间:2015-04-11 16:55:32

标签: linux ubuntu memory linux-kernel

Linux具有copy-on-write,这意味着,在fork之后,子进程可以与父进程共享内存,只要它不修改它。

让我们说父进程需要10 GB的物理RAM。当我分叉进程时,操作系统使用的物理内存不会立即上升10 GB(由于某些管理结构的创建,它可能略有上升)。这可以使用free shell命令确认。因此free正确地说明了CoW。

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

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

澄清:出于会计目的,应将多个进程使用的共享内存分配给父进程。

使用案例:

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

相关问题

https://serverfault.com/questions/676335/how-measure-memory-without-copy-on-write-pages(提供可能的答案)

How to know whether a copy-on-write page is an actual copy?(提供一些有用的细节来创建解决方案)

1 个答案:

答案 0 :(得分:1)

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

我知道没有提供您所要求的操作系统。如果它值得解决,我必须认为有人会这样做。