所以,我对此有一些评论,这对我来说似乎更像是懒惰,而不是功能或要求。完全可以正确处理交换、分析内存并确定如何正确利用内存子系统而不会遇到交换。围绕此构建了一连串工具,您可以保证进程不会很容易地使用交换,因此性能点是不正确的。不放入此工具只是懒惰的编码,总体而言,完全删除交换将损害系统性能。这里的关键是正确使用它。我同意将 pod 换出到磁盘会影响性能,但是有许多东西应该换出到磁盘。
此外,Linux 内核旨在利用交换,完全禁用它会产生负面影响。解决这个问题的更好方法是将 pod 固定到主内存中,并且不允许它们交换到磁盘,减少 vfs 缓存压力,以便除非绝对必要,否则它不会交换,即使那样你也可能导致固定进程在主内存耗尽的情况下使 MALLOC 失败。
Kubernetes 的想法是将实例紧密打包到尽可能接近 100% 的利用率。所有部署都应使用 CPU/内存限制。因此,如果调度程序将 pod 发送到机器,它根本不应该使用交换。你不想交换,因为它会减慢速度。
主要是为了性能。
TL;DR 没有正确使用交换只是一种懒惰的技巧,表明对内存子系统的理解很差,并且缺乏基本的系统管理技能。设计基础设施服务而不理解这些系统注定会以失败告终。
所以,我对此有一些评论,这对我来说似乎更像是懒惰,而不是功能或要求。完全可以正确处理交换、分析内存并确定如何正确利用内存子系统而不会遇到交换。围绕此构建了一连串工具,您可以保证进程不会很容易地使用交换,因此性能点是不正确的。不放入此工具只是懒惰的编码,总体而言,完全删除交换将损害系统性能。这里的关键是正确使用它。我同意将 pod 换出到磁盘会影响性能,但是有许多东西应该换出到磁盘。
此外,Linux 内核旨在利用交换,完全禁用它会产生负面影响。解决这个问题的更好方法是将 pod 固定到主内存中,并且不允许它们交换到磁盘,减少 vfs 缓存压力,以便除非绝对必要,否则它不会交换,即使那样你也可能导致固定进程在主内存耗尽的情况下使 MALLOC 失败。
根据容器中的进程,容器发生硬故障或被 OOM 杀手杀死可能会导致一些非常灾难性的结果。然而,我理解在这些容器中运行的进程在理想情况下应该是无状态的和短暂的,但是在运行系统的 20 年中,我从未见过每个人都 100% 地遵循预期的设计。
此外,这还没有考虑到诸如非易失性存储器之类的未来技术,以及可用于使用混合磁盘/存储器系统显着扩展主存储器的英特尔 xpoint 等较新的存储器系统。使用这些类型的系统,他们可以直接将它们用作补充主内存或利用交换文件来扩展主内存,而对性能的影响可以忽略不计。
据我了解,原因是 kubelet 并非旨在处理交换情况,Kubernetes 团队也不打算实现这一点,因为目标是 pod 应该适合主机的内存。
从这个 GitHub 问题 #53533
有票可以再次启用它,您将在那里获得更多见解
https://github.com/kubernetes/kubernetes/issues/53533