我应该完全关闭 linux 网络服务器的交换吗?

Pom*_*oma 24 linux ubuntu performance web-server swap

最近我的朋友告诉我,在有足够内存的 linux 网络服务器上关闭交换是个好主意。我的服务器有 12 GB,目前在峰值负载下使用 4 GB(不包括缓存和缓冲区)。

他的论点是,在正常情况下,服务器永远不会使用其所有 RAM,因此它遇到 OutOfMemory 情况的唯一方法是由于某些错误/ddos/等。因此,如果关闭交换系统将耗尽内存,最终会导致占用内存的程序(很可能是 Web 服务器进程)和其他一些进程崩溃。如果打开交换它会同时占用 RAM 和交换空间,最终会导致同样的崩溃,但在此之前,它会卸载关键进程(如 sshd)进行交换,并开始执行大量交换操作,从而导致速度大幅下降。这样,当在 ddos​​ 系统下可能会由于巨大的滞后而进入完全无法使用的状态时,我可能无法登录并终止网络服务器进程或拒绝所有传入流量(除了 ssh)。

这是正确的吗?我是否遗漏了什么(例如,即使我有足够的 RAM,交换分区在某些方面也非常有用)?我应该关掉它吗?

chu*_*utz 28

我会说这取决于您的用例,其余的答案已经很好地涵盖了这一点。4G 的交换毕竟是购买一些安全的廉价方式。而且我觉得这种便宜是让人们不想关闭它的原因。

但让我用一个反问句来回答。如果钱不是问题,并且您可以在两个系统之间进行选择——一个有 12G 的 RAM 和 4G 的交换区,另一个有 16G 的 RAM 并且没有交换区——你会选择哪一个?不幸的是,大多数人仍然会回答说他们会选择 16G 的 RAM 并仍然添加 4G 的交换,这与我的观点不符。

另一方面,我个人认为交换系统比崩溃的系统更糟糕。崩溃的系统会触发备用备份服务器更快地接管。在主动-主动(或负载平衡设置)中,崩溃的系统会更快地停止旋转。无交换系统再次获胜。


Kha*_*led 14

即使您有足够的内存,也不建议关闭交换。如果您的服务器需要更多内存而它没有得到它,它将崩溃。但是,当您有交换区时,可以(在某种程度上)防止这种情况。

是的,使用交换时您的服务器性能会下降,但至少它是可操作且可访问的。然后,如果您的服务器开始使用交换,您可以计划在需要时添加更多内存。

我发现这个页面在谈论交换。看看第 3 节。

您可以控制swapiness,而不是关闭 swap 。


jim*_*ara 6

不,这不是一个好主意。“某些过程变得疯狂”意味着你应该已经主动打电话

ulimit -d

在进程创建时间或之前设置每个进程数据段内存的限制 - 并且可能限制线程数

ulimit -T

每个进程。ulimit 是你的朋友。在关闭交换之前,请考虑阅读其中一份内存调整指南。您也可以更改内核参数以尝试处理 DOS 攻击或坏程序。

这样看:系统上的总内存是 RAM + 交换。如果您有 12GB 的交换空间,您只需通过禁用交换空间就可以有效地将系统 VM 容量减少一半。馊主意。这不是辩论,实际上,它只是阅读其他人多年来从以前的糟糕经历中了解到的内容。您的朋友也可能需要阅读一些书。


小智 5

正如其他人所说,您可以通过修改“swappiness”参数有效地停止服务器,除非绝对必要。这控制了内核换出内存页面的积极程度。

您可以看到它当前的设置:

cat /proc/sys/vm/swappiness
Run Code Online (Sandbox Code Playgroud)

您可以使用(以 root 用户身份)“实时”编辑它:

# echo "10" > /proc/sys/vm/swappiness
Run Code Online (Sandbox Code Playgroud)

并使其持久化,将以下内容添加到 /etc/sysctl.conf:

vm.swappiness=10
Run Code Online (Sandbox Code Playgroud)