我们需要在 LAMP 服务器上设置交换分区吗?

我们需要在 LAMP 服务器上设置交换分区吗?

我们是否真的需要在带有 LAMP 的 ubuntu 服务器上交换分区?我认为我不需要它,但最好确定它是否不会导致一些不可预测的行为。
实际上我的想法是:

  • 服务器永不休眠
  • 如果是交换,则需要考虑负载平衡/流量整形等...

我是对的,我可以关闭生产服务器的交换吗?

谢谢!

答案1

我是对的,我可以关闭生产服务器的交换吗?

不,总是要留一些交换空间。

我曾经尝试运行没有交换的生产服务器,大约一周后,在 Wordpress 更新后,PHP 开始消耗比我们预期更多的 RAM。当您用完 RAM 并启用交换时,系统会变慢(有时会变慢很多,有时会变慢一点点,这取决于塞进去的东西),但您可以登录、查找问题并尝试修复它。

当内存耗尽且没有交换时,进程会终止,系统会停滞,很多时候你唯一的选择就是重启。但除非你重启,否则系统可能会崩溃。

在我的世界里,坏掉比速度慢更糟糕。

当然,如果你发现你的系统经常使用大量的交换空间(它通常会使用一些只是作为移出旧缓存内容的一种方式),你显然遇到了问题(“请插入 RAM”),但绝对建议将其作为安全网。


回应SpamapS的评论:

在“成功网站”的世界里,你拥有热故障转移、负载平衡和其他工具,这些工具允许一台机器爆炸,而对网站的其他部分没有任何影响。但这需要大量资金。对于大多数网站来说,拥有冗余硬件并不经济,即使它们能带来收入。

我完全不同意你对正常运行时间的评论。在传统的电子商务环境中,如果人们看不到你的网站,他们不能从您那里购买。这不仅仅是电子商务,如果网站瘫痪一段时间,所有的在线商业利益都会遭受更多批评。我之所以知道这一点,是因为我为公司托管网站和服务,并且运营自己的网站。缓慢 = 脾气暴躁,但瘫痪 = 愤怒。即使你每次只瘫痪一分钟,如果用户多次看到“瘫痪维护”通知,他们就会认为你无法维持网站正常运行。

速度缓慢的服务器并不是理想的选择,但交换并不是一直在运行,它是在修复问题时让系统继续运行的最后手段。

您还假设机器上只运行一个服务。如果您有巨额资金来拆分所有服务,那么这可能是真的,但在现实世界中,所有服务都会混在一起。多个网站、ssh 守护程序、ftp 服务器、电子邮件服务器等。一个进程泄漏到交换中甚至可能不会影响另一个服务。如果没有交换,所有服务都有同等的机会立即随机终止。您无法控制它。

当然,交换并不是唯一的答案。你需要监控来提醒你内存不足,但对于大多数人来说,拔掉电源插头并重新启动并不是答案。我相信这对你负责的跨国网站来说都是有效的,但对我们这些凡人(构成了互联网的大多数)来说,这样做就是商业自杀。

答案2

我不同意在生产服务器上进行交换。

根据我的经验,旋转磁盘交换会使您的系统变得难以预测,并且更容易出现令人沮丧的整个系统故障。高负载、受欢迎的服务器如果使用本地慢速磁盘执行任何操作,很快就会陷入比故障状态更糟糕的境地。响应时间将上升到正常水平的 100 倍,通过控制台或 ssh 登录等简单操作可能需要几分钟。

SSD 交换是一种特殊情况,至少可以消除通常会导致系统崩溃的寻道时间减慢问题。但是,写入速度仍然很慢,因此您仍然需要等待很长时间才能从失控的过程中恢复。

如果没有交换,您的 LAMP 服务器将简单地终止进程以释放 RAM。适当的监控应该会提醒您这一点,并在关键进程被终止时将服务器从生产中移除。这里最糟糕的情况是您的登录方法全部被终止,您必须进行硬重置/电源循环。这种最坏的情况在失控的交换机器上仍然同样可能发生,但更难检测。

如果您使用的是 PHP,请启用内存限制,并监视日志以了解其故障。这里有一个技巧,设置限制降低在开发服务器上比在生产中更容易。如果您在 apache 下使用 mod_php,请将 MaxRequestsPerChild 设置为几千,这样 httpd 就会在随着时间的推移变得太大之前死亡。最重要的是,监控内存使用情况!通常情况下,内存会随着时间的推移而增加,您只需在调试问题时定期重新启动泄漏的服务即可。

答案3

当系统决定需要物理内存来处理活动进程,而可用的未使用物理内存不足时,就会使用交换空间。如果系统恰好需要更多内存资源或空间,则物理内存中的非活动页面将移至交换空间,从而释放物理内存用于其他用途。

这种情况在服务器中会出现很多次。

a). 未优化的脚本会消耗大量内存
b). 备份等脚本总是会消耗大量内存
c). 流量很大

因此,保留一些交换空间是一种很好的做法。

更多细节:https://help.ubuntu.com/community/SwapFaq

答案4

我想感谢 Oli 的精彩回答 - 我知道这已经过时了。我发现分区是一个永远新鲜的话题!我完全同意 Oli 的帖子中的观点,我想分享这个 - 当然可以改进的 - 我用来监控服务器交换使用情况的脚本。

我总是将服务器和服务配置为完全不发生交换。如果发生交换,请确保出现问题,或者至少出现问题,超出了您的初始计划。

我在生产环境中每半小时执行一次此脚本。如果 Swap 使用率 != 0k,它会向我发送通知。大多数情况下,我将能够及时调查/采取措施解决此问题,事情变得真的错误的

期望您拥有:bash、top、echo、awk 和有效的邮件命令,但不执行任何检查。

希望有所帮助。

#!/bin/bash
CURRSWAP=$(top -b -n1 |grep Swap |awk '{print $4}')
ECOMM="echo $CURRSWAP means healthy, I wont take any action."
CURRDATE=$(date)
MAILDST="[email protected]"

case $CURRSWAP in
  [0]k) $ECOMM
        exit 0
        ;;
  *)    echo -e "Server: $HOSTNAME \n Date: $CURRDATE \n Current Swap partition usage: $CURRSWAP" | mail -s "Warning from $HOSTNAME" -- $MAILDST
        exit 0
        ;;
esac
exit 0

相关内容