为什么我不想启用交换?

为什么我不想启用交换?

我最近遇到了一个问题,一个恶意进程导致一些 ec2 实例内存耗尽并崩溃。这本来不应该是个问题,但我使用的是内存非常受限的 t2.small 实例,在有人响应我们的监控警报之前,它就内存耗尽了。

显然,如果可能的话最好避免使用交换,但如果我启用了交换,我的实例可能会保持在线,尽管性能会下降。

鉴于硬盘空间通常充足,启用交换似乎是个好主意,即使只在特殊情况下才需要它。

默认情况下,OpsWorks 仅为微型实例启用交换,而不为小型实例启用交换。为什么他们在启用交换方面如此保守,如果我不需要交换来进行正常操作,是否有理由不想启用交换?

答案1

我认为关键是你需要知道什么记忆你的流程是需要的。如果您使用的是 EC2,则意味着您已选择了一个可以覆盖部分工作负载的实例大小;我经常看到工作负载只有一个进程/服务。添加大量交换很便宜,但您需要知道何时/为什么使用交换。我经常在这里看到这样的答案:“添加交换以防某些非活动进程占用一些 RAM”,这对于桌面来说很有意义,但在您的 EC2 实例上,您应该了解进程的运行特性——尤其是在开发应用程序时——通过在开发期间禁用交换来了解它通常如何运行,然后在生产时添加交换并将交换性增加到高值(90+)。

另一种看待这个问题的方式是,在服务器环境中,尤其是在云中,您可以根据工作负载定制实例,您真的想要进程交换吗?这对性能来说可以吗?当您拥有一台内存太小的 2GB 机器,而该机器运行的进程需要 3GB 才能轻松运行,不断将页面交换到磁盘上时,您不会感到高兴。

答案2

您的物理内存是否用完了,或者后备存储是否用完了?如果是后者,即使没有任何数据写入,swap 也能让您的系统继续正常运行!

“如果我的正常操作不需要交换功能,那么我可能不想启用交换功能吗?”

是的。有交换空间对于操作系统高效利用物理 RAM 是必需的。

例如,假设某个进程创建了一个 256MB 文件的私有可写映射。如果没有交换,操作系统必须为该映射保留 256MB 的物理 RAM,即使这些 RAM 根本不需要,因为该映射永远不会被修改,以防进程决定修改该映射的每个字节。

本质上,如果没有交换,每个没有文件支持的干净可写页面都意味着一页物理 RAM 无法保存修改后的数据,即使这些页面在其整个生命周期内都可以丢弃。

即使您不需要交换,您也确实非常希望有交换可用。

答案3

YMMV,但对于交互式工作负载,我的经验是,如果您开始使用页面文件,整体系统性能无论如何都会停滞不前,而且这通常是由某些失控进程引起的,所以我宁愿让该程序崩溃(内存不足),也不愿毁掉我所有其他程序的性能。因此,我为我的家庭共享机器配置了没有页面文件和大量额外 RAM。我妻子对性能不佳的抱怨大大减少了。当我去年后来添加了 SSD 时,情况变得更好了。

相关内容