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