我想在一台机器上运行一堆应用程序或容器。我想隔离以下资源的使用情况:
理想情况下,我希望实现所有资源的按比例使用,这样如果某些容器处于空闲状态,其他容器就可以利用它们。静态预订(例如,每10个应用程序10%)并不理想。
我知道我们可以为CPU做这件事,但我不确定这是否可以概括为一切。非常感谢详细解答(不仅仅是使用" tp / qdisc" /" iptables"用于网络)。
答案 0 :(得分:5)
使用控制组(cgroups)可以实现以下资源隔离:
当两个或多个进程可能使用太多资源而其他进程无法获得公平机会时,您可以使用cgroup告诉他们:如果您争取同一资源,则其中一个不能超过60个%和其他不超过30%等等。如果没有相同资源的竞争,我们只有一个请求者。他可以使用他想要的程度,直到另一个进程尝试使用它。
Introduction to Linux Control Groups
关于机器空闲时的扩展:如果使用完全公平计划程序(CFS),如果系统中有足够的空闲CPU周期,则cgroup可以获得更多的已分配CPU份额。
Redhat resource management guide:
当一个cgroup中的任务空闲且没有使用任何CPU时间时,这就是 剩余时间收集在未使用的CPU周期的全局池中。 允许其他cgroup从此池中借用CPU周期
如果CPU的runqueue中的任务耗尽,CPU会尝试拉动 来自其他繁忙CPU的额外任务,以便在它们出现之前为它们提供帮助 空闲。
当然,找到可移动的任务和/或需要一些搜索成本 空闲CPU,调度程序可能不会每次搜索域中的所有CPU 时间。实际上,在某些体系结构中,搜索范围涉及事件 限制在CPU所在的同一个套接字或节点中,同时 tick上的负载余额搜索全部。
例如,假设CPU Z离CPU X相对较远。即使CPU Z. 当CPU X和兄弟姐妹忙时,调度程序无法迁移 从X到Z唤醒任务B,因为它超出了搜索范围。如 结果,CPU X上的任务B需要等待任务A或等待负载平衡 在下一个打勾。对于某些特殊情况的应用,请等待 1滴答可能太长了。
实现资源隔离的其他方法很少:nice
(用于轻松调整),cpulimit
- 静态资源分配,当其他CPU空闲时,共享不会借用到其他进程。