为什么要在kubernetes(k8s)上禁用swap?

無名 发表于: 2021-09-09   最后更新时间: 2021-09-09 19:12:59   7,616 游览

自从Kubernetes 1.8以来,我似乎每次都需要在我的节点上禁用swap交换空间(或将--fail-swap-on设置为false)。

我找不到Kubernetes(k8s)社区坚持禁用swap交换的技术原因,这是由于性能原因吗?安全原因?为什么文档里没有这个原因?

发表于 2021-09-09
¥1.0

不正确地使用swap只是一个懒的行为,显示出对内存子系统的理解不深,以及缺乏基本的系统管理技能。设计基础设施服务而不了解这些系统,必然会以失败告终。

所以,我对此有一些评论,这在我看来更像是一种懒惰,而不是一种功能或需求。正确处理swap,分析内存,并确定如何在不影响swap的情况下正确利用内存子系统,这是绝对可能的。有一连串的工具围绕着这一点,你可以保证一个进程不会很容易地利用swap,所以性能的观点是错误的。不把这个工具放进去简直是懒惰的行为,而且总的来说,完全去除swap会对系统性能造成损害。这里的关键是正确使用它。我同意把pods换到磁盘上会影响性能,但是有很多东西应该被换到磁盘上。

此外,Linux内核的设计是为了利用swap,完全禁用它将会产生负面的影响。一个更好的处理方法是将pods固定在主内存中,不允许它们交换到磁盘,减少vfs缓存的压力,使它不交换,除非是绝对必要的,即使这样,你也可以使固定的进程在主内存耗尽的情况下不能MALLOC。

取决于容器中的进程,如果容器发生硬故障或被OOM杀手杀死,可能会导致一些相当灾难性的结果。然而,我知道在这些容器中运行的进程最好是无状态的和短暂的,但是在20年的系统运行中,我还没有看到每个人都100%地遵循预定的设计。

此外,这还没有考虑到未来的技术,如非易失性内存,以及较新的内存系统,如intel xpoint,可以使用混合磁盘/内存系统大大扩展主内存。有了这些类型的系统,他们可以直接将其作为补充主内存使用,或者利用交换文件来扩展主内存,对性能的影响可以忽略不计。

半兽人 -> bullshit 3年前

“不正确地使用swap只是一个懒的行为”,kubernetes社区认为,支持的大多数软件都很糟糕,所以对社区来说,默认情况下所有开发人员都是懒惰/无能的。

半兽人 -> bullshit 3年前

在普通的Linux系统中,分配的内存通常是实际使用内存的10倍或更多。大多数页面从未被访问过(堆栈),但有些页面确实被触及过,然后就不再使用。如果系统不能swap这些页面,它就会有更少的空间来加载代码和缓存文件,这将损害性能。即使是pods也不应该真的被固定在内存中。也许可以设计成一个较低的swappiness(交换率)。

kubernetes 的想法是将实例紧密打包以尽可能接近100%的利用率。 所有的部署都应固定CPU/内存限制。因此,如果调度程序将 pod 发送到一台节点机器上,它根本不应该使用swap,因为它会减慢速度。

它主要是为了性能。

bullshit -> 啊啊 3年前

另一个原因是,kubernetes社区这么做是为了偷懒。

半兽人 -> bullshit 3年前

是的,这个理由是荒谬的。Linux总是swap,因为它按需加载代码。这就是为什么Linux的性能在没有swap时总是更差的原因。

这样做的原因是 kubelet 不是为处理swap情况而设计的,Kubernetes 团队不打算实现这一点,因为目标是 pod 应该适合主机的内存。

来自:GitHub issue #53533

对swap的支持非常重要。 有保证的 pod 永远不需要交换。 Burstable pod 应该在不需要交换的情况下满足他们的请求。 BestEffort Pod 无法保证。 kubelet 现在缺乏智能来在 pod 中提供适量的可预测行为。

你的答案

查看kubernetes相关的其他问题或提一个您自己的问题