我用 C 语言编写了一个简单的容器,如下所述本文(不附属)并且效果很好。容器将挂载、UTS、IPC、PID 和 cgroup 命名空间分开(通过克隆(2))。
有一件事我还没有弄清楚:我想限制容器的“可见 CPU 和内存”,如htop
和类似实用程序所示。我当前的实现将子级(新 PID 命名空间的 PID 1)移动到新的 cgroup 中,如以下伪代码所示:
pid_t pid = fork();
# Child goes other stuff
mkdir /sys/fs/cgroup/memory/example
echo $pid > /sys/fs/cgroup/memory/example/cgroup.procs
echo 1073741824 > /sys/fs/cgroup/memory/example/memory.limit_in_bytes # 1 GiB
现在,当子进程尝试分配超过 1 GiB 的内存时,它会被终止,这是预期的行为。但是,诸如此类的实用程序htop
仍然显示主机上的全部内存量(例如 4 GB)。
同样,我可以将子进程放入新的 CPU 子组中并限制其 CPU 使用率,但htop
显示主机的 CPU 总量(及其负载)。
我应该如何限制容器的“可见”内存量和 CPU 亲和力?看起来 Docker 和 LXC 在这方面都做得很好。