cgroup真的能保证进程互不干扰吗?

Can cgroup really guarantee process do not interfere each other?

我是 cgroup 的新手,我正在尝试使用它来控制我的 Linux 服务器上的两个 C++ 进程。

我把每个进程的mem_limit设置为1G,也就是说它最多可以消耗1GB内存,对吧?

但我认为cgroup并不能像VM那样保证真正的隔离,比如一个进程仍然可以读(或写)另一个进程的内存。 这两个进程之间也存在争夺空闲内存块的竞争,因为 cgroup 不会为它们分配任何东西。

我谷歌了一下,但只得到了很多 "docker vs vm",这真的不是我想要的。

关于 cgroups 实施的任何提示都非常有用。

首先,你误解了cgroups是什么。它不是隔离工具,它是资源限制工具,可以限制内存,CPU,I/O消耗,如mem_limit。

但是,每个进程都有自己的唯一地址 space,因此当 进程 1 是 CPU 上的 运行 时,process 2 没有使用页表,所以 process 1 无法通过简单地取消引用指针来获取 process 2 变量。 虚拟内存已经是一种隔离技术。

在 Linux:

中有一些方法(通常由调试器使用)访问其他进程内存
  • /proc/PID/mem。如果您检查该文件的权限,您将看到只有同一用户或根用户可以访问它。
  • process_vm_{readv,writev} 系统调用。他们检查用户是否有能力 CAP_SYS_PTRACE.

所以有几个选项可以禁止其他进程访问其他内存:

  1. 运行 来自不同用户的进程没有 CAP_SYS_PTRACE。 Android 做到了。
  2. 使用内核名称spaces - 进程将不知道是否存在其他内核 - 保护在 pid 级别执行。 LXC 也使用这个 Docker 可能也是。
  3. Bare-Metal Virtualization:Xen、KVM等。不仅进程页表是隔离的,内核也是隔离的。

恕我直言,(1) 已经足够了,(3) 适合偏执狂 ;)