最近我的朋友告诉我,在内存足够的情况下,关闭 Linux 网络服务器上的交换空间是个好主意。我的服务器有 12 GB,目前在峰值负载下使用 4GB(不计算缓存和缓冲区)。
他的观点是,在正常情况下,服务器永远不会使用其所有 RAM,因此它遇到 OutOfMemory 情况的唯一原因是由于某些错误/ddos/等。因此,如果交换被打开离开系统将耗尽内存,最终导致占用内存的程序(最有可能是 Web 服务器进程)崩溃,也可能是其他进程崩溃。如果交换被关闭在它会消耗内存和交换空间,最终导致同样的崩溃,但在此之前,它会将 sshd 等关键进程卸载到交换空间,并开始执行大量交换操作,导致速度严重下降。这样,在 DDoS 攻击下,系统可能会因巨大的延迟而进入完全无法使用的状态,我可能无法登录并终止 Web 服务器进程或拒绝所有传入流量(ssh 除外)。
这是正确的吗?我是否忽略了某些东西(例如,即使我有足够的 RAM,交换分区在某些方面也非常有用)?我应该将其关闭吗?
答案1
我想说这取决于你的使用情况,其余的答案已经很好地涵盖了这一点。 4G 交换毕竟是一种购买安全性的廉价方式。 我觉得这种廉价正是让人们不想关闭它的原因。
但让我用一个反问句来回答。如果钱不是问题,你可以选择两个系统——一个有 12G RAM 和 4G 交换空间,另一个有 16G RAM 但没有交换空间——你会选择哪一个?不幸的是,大多数人仍然会回答他们会选择 16G RAM 和仍然添加 4G 的交换空间,但这不符合我的观点。
另一方面,我个人认为 swappy 系统比崩溃的系统更糟糕。崩溃的系统会触发备用备份服务器更快地接管。在主动-主动(或负载平衡设置)中,崩溃的系统会更快地退出轮换。无 swap 系统再次获胜。
答案2
答案3
不,这不是一个好主意。‘某些流程出了问题’意味着你应该主动打电话
ulimit -d
在进程创建时或之前设置每个进程数据段内存的限制——也可能限制线程数量
ulimit -T
每个进程。ulimit 是你的朋友。在关闭交换之前,请考虑阅读内存调整指南之一。你也可以将内核参数更改为某些内容,以尝试处理 DOS 攻击或恶意程序。
换个角度看:系统上的总内存是 RAM + 交换空间。如果您有 12GB 的交换空间,则通过禁用交换空间,您实际上会将系统 VM 容量减半。这是个坏主意。这实际上不是辩论,只是阅读其他人多年来从之前的糟糕经历中了解到的内容。您的朋友可能也需要阅读一些内容。
答案4
另一个好办法是使用 zRAM 交换到 RAM。我认为这是个好主意!就性能而言,就像根本没有交换一样,而且还能防止系统负载过大时崩溃!
看这个:
http://www.webupd8.org/2011/10/increased-performance-in-linux-with.html
我的经验:在我现在写作的这台机器上,我禁用了交换,因为我有 4Gb RAM(在 2009 年这已经很多了!)。我只遇到过几个问题,其中一个是错误地同时打开了 127 张图片!
但是……这是一个工作站,如果它挂了,我可以重新启动。我认为在服务器上最好有交换,而内存中的交换对我来说听起来不错。