为什么EC2 ubuntu映像没有交换?


82

我在EC2上启动了几个服务器,但它们没有交换。

我是在做错什么,还是机器根本没有?


我也想知道,但是我只是建立了一个EBS实例,将其格式化为swap,然后交换/ dev / sdg ...
Tom O'Connor

在Linux系统上使用SSD驱动器而不在SSD驱动器上设置交换也是典型的情况。主要是因为有些人偏执狂,因为一直在钻探同一组扇区,会对SSD的存储寿命产生负面影响。
djangofan 2011年

1
什么AMI和哪个EC2实例大小。AMI需要配置为使用交换分区,并且实例必须在启动时添加实例。
杰里米·布斯

如果可能的话,我建议不要在EC2上使用交换功能,除非您有99%的把握要使用它(IE只能在紧急情况下使用)。当我们在某些EC2实例上禁用交换时,我们每月的EBS IO成本可能减半。仅用我的2分钱就可以为您节省2分钱–是的,这很糟糕,我很抱歉,我会躲在一个角落里;)
涂抹

Answers:


74

没错,Ubuntu EC2 EBS映像未配置交换空间(至少适用于11.04)。“常规”实例类型的映像确实具有交换分区,尽管在我测试的映像上只有896 MB。

如果某些进程崩溃了,而您没有交换空间,则在OOM杀手in进来之前,服务器可能会停顿好一阵子,而使用交换,它只会变慢。因此,即使有足够的RAM,我也总是喜欢交换空间。这是您的选择:

  • 创建一个EBS卷(RAM大小的2-4倍),将其附加到您的实例(我喜欢将其称为/ memory / dev / xvdm作为“内存”)sudo mkswap /dev/xvdm,将其添加到fstab中sudo swapon -a,然后您就可以开始了。我之前已经做过,并且工作正常,但是它可能比实例存储要慢一些,因为它通过网络传输。

  • 或者,您可能可以对磁盘进行重新分区以添加交换分区,尽管这可能需要创建新的AMI。我无法在正在运行的实例中执行此操作,因为我无法卸载根文件系统,甚至无法访问磁盘设备(/ dev / xvda),只能访问分区(xvda1)。

  • 或者您可以创建一个交换文件。这是我目前首选的解决方案。

    sudo dd if=/dev/zero of=/var/swapfile bs=1M count=2048 &&
    sudo chmod 600 /var/swapfile &&
    sudo mkswap /var/swapfile &&
    echo /var/swapfile none swap defaults 0 0 | sudo tee -a /etc/fstab &&
    sudo swapon -a
    

    做完了 :)我知道很多人对使用文件而不是分区感到不快,但作为紧急交换空间,它肯定能很好地工作。


4
如其他答案所示,交换到EBS量可能会导致额外费用。不使用交换或交换到实例存储似乎是更好的解决方案。
isuldor

7
与EBS相比,使用实例存储是更好的选择。EBS是一个网络文件系统,因此通过与其他所有东西相同的网络连接连接到EC2实例。实例存储已附加到承载该实例的硬件上(这就是为什么在停止和启动实例时它不会持久存在的原因)。EBS唯一可以交换的选项是在使用实例存储所不附带的实例类型时,即t1.micro(鉴于它只有大约620MB RAM,这可能确实确实需要紧急处理。交换)。
ColtonCat

bs = 1M已经是二进制表示法,因此count = 2048乘数应为count = 2000-如果我没有记错的话。
ypocat

1
如果您要使用2GiB,则1024 * 2048似乎是正确的。
2013年

25

交换IMHO的最佳位置是实例存储。为什么?AWS不会在实例存储上向您收取I / O费用。此外,在许多情况下,实例存储的性能要比EBS高。只要确保您有一个脚本即可在停止实例的情况下重新创建交换文件。重新启动就可以了。为什么哦,为什么它默认不存在?

让我们找到实例存储。

root@domU-**-**-**-**-**-**:/var/log# fdisk -l

[...]

Disk /dev/xvda2: 160.1 GB, 160104972288 bytes
255 heads, 63 sectors/track, 19464 cylinders, total 312705024 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/xvda2 doesn't contain a valid partition table

华友世纪免费提供160.1GB!将您的交换放在那儿,当基于EBS的交换被错误地聚集时,忘记每台服务器100美元的超额费用。不幸的经验在这里聊天。

显然,在某些情况下,您看不到实例存储。

根据实例类型,您首先需要使用block-device-mapping选项将实例存储卷附加到实例。如果不这样做,您甚至可能看不到/ dev下的设备(根据如何在Amazon EC2中使用“实例存储卷”存储?


1
只是想指出,免费套餐中的t1.micro用户不能使用此选项。
Reuben L.

20

注意:亚马逊已更改其定价政策,并且自2016年中开始不对I / O请求收费。出于历史原因,答案一直保留在此处,但是在EC2 EBS支持的实例上使用(或不使用)交换不会产生任何成本影响。


这是设计使然。默认情况下,在EC2 EBS支持的实例上,交换功能处于关闭状态,以避免不可预测的成本。

如果您有需要大量内存的应用程序(例如,在很小的实例上),那么它可能会在EBS卷上生成大量的I / O请求。亚马逊每100万个I / O请求收费0.10美元(请参阅http://aws.amazon.com/pricing/ebs/

在正常情况下,您不必为此担心。通常,即使在较小的实例上,I / O请求的成本也要几美元,如果是这样的话。因此,如果您知道实例大小合适并且该交换仅会很少使用,请继续启用它。但是要小心一些小实例。

如果启用交换,则可能需要关注使用情况报告。(可选)您还可以通过转到CloudWatch控制面板并为总账单金额创建新的警报来设置账单提醒。这样,您将立即收到通知,这是实例发生的奇怪事件。


因为最常见的实例类型使用SSD卷,所以这个答案对我来说有点误导或令人困惑。 aws.amazon.com/ec2/instance-types
Taylor Edmiston,

2
@tedmiston:的确,此答案不再适用。我已经进行了调整,以反映新的现实,但是对于I / O请求基本上是免费的,因此启用(或不启用)交换现在可以在纯粹的技术基础上进行。
Gui Ambros

1

检查/etc/fstab文件,它们可能没有在您使用的映像中进行交换而设置。我认为有些人无需交换服务器即可运行,因为他们希望使用的内存永远不会超过总内存-交换会使一切变得非常缓慢。

但是,我总是对内存中的某些进程不断膨胀感到不安,因此,我建议您简单地设置一个交换驱动器并从正在运行的ec2实例中重新创建映像是您的明智之举。


2
偶尔的交换不会使系统变慢。
laebshade 2011年

0

一个简单的解决方案运行swapEC2图像是运行swap与压缩lz4ramzram-init

该解决方案并没有采取ram从远host

在此处输入图片说明


1
很有创造力,但是将RAM用作实际RAM比将其用作内存文件系统进行交换更有意义吗?(主要在内存不足时使用)减少应用程序创建交换的可用内存量似乎违反直觉……
HBruijn

有趣的答案,但我认为使用EBS /实例存储可能是更好的通用解决方案。我有一个t2.nano,具有512MB RAM和EBS上的512MB交换,效果很好。
蒂姆

显然,这确实从主机(EC2实例)中获取了RAM-RAM又从哪里来?这种方法的唯一好处是压缩了部分总RAM,但没有提供将SSD用作交换的功能。您可以改用zswap在常规交换文件/磁盘之上提供压缩RAM缓存的wiki.archlinux.org/index.php/zswap。有关zram的更多信息,请参见cnx-software.com/2018/05/14/…
RichVel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.