我正在使用 lxc 在我的 18.04 笔记本电脑上建立 ubuntu 16.04 开发环境。当我ninja -j
在容器上进行并行构建 ( ) 时,我的计算机变得无响应并且永远无法恢复。发生这种情况时我必须重新启动它。我知道这很模糊,我怀疑这与内存使用或其他一些资源有关,在主机上构建时可以更好地管理这些资源。如果我记得这样做-j 4
(gnu 编译器),它就不会锁定。
我已经以最简单的方式设置了 lxc,我必须以 root 身份运行它。它无法访问网络设备,我使用配置文件在其上“安装”文件夹以与其共享存储库。下面是我的配置文件:
# Distribution configuration
lxc.include = /usr/share/lxc/config/common.conf
# For Ubuntu 16.04
lxc.mount.entry = /sys/kernel/debug sys/kernel/debug none bind,optional 0 0
lxc.mount.entry = /sys/kernel/security sys/kernel/security none bind,optional 0 0
lxc.mount.entry = /sys/fs/pstore sys/fs/pstore none bind,optional 0 0
lxc.mount.entry = mqueue dev/mqueue mqueue rw,relatime,create=dir,optional 0 0
lxc.arch = linux64
# Container specific configuration
lxc.rootfs.path = dir:/var/lib/lxc/u2/rootfs
lxc.uts.name = u2
# Network configuration
lxc.net.0.type = none
lxc.net.0.flags = down
# Share Display for gui applications
lxc.mount.entry = /dev/dri dev/dri none bind,optional,create=dir
lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir
lxc.mount.entry = /tmp/.X11-unix tmp/.X11-unix none bind,optional,create=dir
lxc.mount.entry = /dev/video0 dev/video0 none bind,optional,create=file
# Share folders
lxc.mount.entry = /home/tyler/workspace /var/lib/lxc/u2/rootfs/home/ubuntu/workspace none bind 0 0
我的问题有两个部分,如何隔离导致锁定的原因,以及如何配置 LXC 容器以防止它在进行并行构建时锁定我的计算机?
答案1
听起来您的 LXC 主机内存不足,系统正在终止进程。您有几个选择:
- 添加更多内存或添加交换文件/增加主机的交换
- 将您的 LXC 开发容器限制为一个或多个 CPU 核心,以使并行忍者构建不那么激进
对于选项 2,假设您有一个 4 核 CPU,则以下 LXC 命令应将您的容器限制为 2 个核,并为其在其中 50% 的核上提供调度时间(实际上 CPU 访问量减少了 75%)。
lxc config set container1 limits.cpu 2
lxc config set container1 limits.cpu.allowance 50%
(container1
上面是您的 lxc 开发容器名称)
首先调整CPU数量。如果您的主机内存不足,“cpu.allowance”命令对您的问题的影响可能较小。
由于来宾容器可用的 CPU 核心较少,ninja 应该启动较少的并行构建命令,从而使用较少的系统资源(特别是内存)。
编辑
要在不使用 LXD 命令的情况下进行这些更改,请编辑容器的配置文件并添加以下行:
lxc.cgroup.cpuset.cpus = 0-3
这将为容器核心 0 和 3 进行调整以适应。
这是一些进一步的阅读关于 lxc cgroup 配置参数。