我计划租用一台物理服务器并在该服务器上的 LXC 容器内运行 MySQL。我想使用 cgroup limits 控制 MySQL 实例的最大内存使用量:
lxc.cgroup.memory.limit_in_bytes = 8192M
这将有效地控制容器可以使用的内存量,但容器top
内部free
仍将报告 LXC 主机(物理服务器)的总内存。我不是 Linux 如何管理内存的专家,但我假设 - 在物理机器上 - 如果 Linux 发现即将达到物理内存限制,它将开始交换。无论 Linux 是在容器内还是在物理主机上运行,它处理“有效”内存限制(无论是 cgroup 限制还是物理限制)的方式是否相同?
答案1
容器内没有运行 Linux,因为 Linux 是内核,您与主机共享它。您的应用程序(如 free 和 top)从 /proc 读取系统信息,从而获取有关主机的详细信息,因为 lxc 默认不会伪造有限的资源(与 OpenVZ 不同)。除非您的应用程序根据 ram/swap/cpu 数量而表现不同,否则这是可以接受的。如果您的应用程序试图分配比容器可用内存更多的内存,它将像非容器环境中的任何其他应用程序一样被 OOM 终止。
如果想要查看容器内部的有限资源,请在主机上执行以下操作:
apt-get install lxcfs
之后重新启动容器。LXCFS 将模拟容器 /proc 中的几个文件,应用程序将正确看到有限的资源(cpu、ram、swap)。
有关 lxcfs 主页的更多信息:https://linuxcontainers.org/lxcfs/
答案2
lxc——内核命名空间
cgroups - 监控资源消耗和限制的内核子系统
在 lxc 容器系统内部,不知道主机操作系统上 cgroup 的限制。Linux 内核(在主机上)将限制 cgroup 对资源的消耗。
lxc 和 cgroup - 两个独立的内核子系统。我们可以使用没有 lxc 的 cgroup,也可以使用没有 cgroup 的 lxc。
Openvz - 它有一组内核补丁,用于正确显示容器中的容器限制,但它们不考虑原始内核