1

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

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

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

  • 我对吗?
  • cpu_set 中的情况如何?
  • 考虑到隔离,cgroup 与 VM 有什么区别?

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

cgroups 实现中的任何提示都非常有帮助。

4

1 回答 1

3

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

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

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

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

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

  1. 运行来自没有 CAP_SYS_PTRACE 的不同用户的进程。安卓就是这么做的。
  2. 使用内核命名空间 - 进程将不知道其他是否存在 - 在pid级别执行保护。LXC 使用它,Docker 也可能使用它。
  3. 裸机虚拟化:Xen、KVM等。不仅进程页表是隔离的,内核也是。

恕我直言(1)就足够了,(3)是偏执狂的;)

于 2015-02-28T10:01:16.570 回答