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

时间:2015-02-28 08:40:06

标签: linux-kernel virtualization

我是cgroup的新人,我试图用它控制Linux服务器上的两个C ++进程。

我将每个进程的mem_limit设置为1G,这意味着它最多可以消耗1GB内存,对吧?

但我认为cgroup不保证像VM一样真正的隔离,例如,一个进程仍然可以读取(或写入)另一个进程的内存。 由于cgroup没有为它们分配任何内容,因此两个进程之间也会竞争以获取空闲内存块。

  • 我是对的吗?
  • cpu_set中的情况怎么样?
  • 考虑到隔离,cgroup与VM之间的区别是什么?

我用谷歌搜索它但只得到了很多" docker vs vm",这真的不是我想要的。

实施cgroup的任何提示都非常有用。

1 个答案:

答案 0 :(得分:2)

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

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

有一些方法(通常由调试器使用)来访问Linux中的其他进程内存:

  • /proc/PID/mem。如果您检查该文件的权限,您将看到只有相同的用户或root可以访问它。
  • process_vm_{readv,writev}系统调用。他们检查用户是否具有CAP_SYS_PTRACE能力。

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

  1. 从没有CAP_SYS_PTRACE的不同用户运行进程。 Android就是这么做的。
  2. 使用内核命名空间 - 进程将不知道其他是否存在 - 在 pid 级别执行保护。 LXC也可能使用它和Docker。
  3. 裸机虚拟化:Xen,KVM等。不仅流程页表是隔离的,而且也是内核。
  4. 恕我直言(1)足够了,(3)是偏执狂;)