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

标签 linux ubuntu memory linux-kernel

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

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

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

我正在寻找一种方法来衡量 CoW 的每个进程内存占用。 (打算从 python 中使用它,但是一旦我知道了相关的 C API,我就没问题了。)

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

用例:

我们正在尝试减少应用程序使用的总内存。我们在父进程中有非常大的数据结构,通过简单的 fork 与子进程共享。我们不需要修改子进程中的那些结构,但是修改引用计数器(在 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? (提供一些有用的细节来创建解决方案)

最佳答案

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

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

关于linux - 测量进程使用的内存,考虑写时复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29580512/

相关文章:

c++ - 如何让 Cmake 包含 gl/GL.h?

Ruby Net/SSH exec - 获取远程进程的 pid

linux - Shell 脚本不会以 root 身份在 cron 中运行

ubuntu - Vim 映射错误。 <A-j> 的映射导致在 ë 中的映射在 ubuntu 19.10 eoan

Python3 virtualenv 和 Django 模块

c - glibc 检测到 malloc() : memory corruption in C

c - 如何在函数内为数组分配内存

linux - udev 规则不触发 GUI 应用程序

c++ - 我如何在 ubuntu C/C++ 中生成带有 exuberant ctags 的标签文件,包括与 vim 一起使用的目录?

arrays - 将文件捕获到数组中并在 while 循环中使用该数组