题 为什么EC2 ubuntu图像没有交换?


我在EC2上启动了几台服务器而且他们没有交换。

我做错了还是机器没有?


74
2018-01-04 21:53




我也想知道,但我只是设置了一个EBS实例,将其格式化为swap,以及swapon / dev / sdg ...... - Tom O'Connor
它也是典型的,在Linux系统上使用SSD驱动器不在SSD驱动器上设置交换的情况。主要是因为有些人是偏执狂,它会一直钻一组相同的扇区,从而对SSD的存储寿命产生负面影响。 - djangofan
什么AMI和哪个EC2实例大小。 AMI需要配置为使用交换分区,实例必须在启动时添加它。 - Jeremy Bouse
如果可能的话,我建议不要在EC2上使用交换,除非你99%确定你不必使用它(因为它只是紧急情况)。当我们禁用某些EC2实例的交换时,我们每月的EBS IO成本可能会减半。只差我两美分就可以节省两美分 - 是的,这太可怕了,我道歉并将躲在角落里;) - Smudge
你也可以看一下这个步骤 docs.aws.amazon.com/AWSEC2/latest/UserGuide/... - Artem.Borysov


答案:


你是对的,Ubuntu EC2 EBS图像没有配置交换空间(for 11.04 至少)。 “常规”实例类型的图像确实有一个交换分区,虽然我测试的只有896 MB。

如果某个进程爆炸并且您没有交换空间,那么在OOM杀手开始之前,您的服务器可能会暂停一段时间,而使用交换时,它只会变慢。出于这个原因,我总是喜欢有交换空间,即使有足够的RAM。这是您的选择:

  • 创建一个EBS卷(RAM的大小的2-4倍),将它附加到您的实例(我喜欢称它为/ 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
    

    完成。 :)我知道很多人对使用文件而不是分区感到icky,但它肯定适用于紧急交换空间。


70
2018-06-12 14:46



如其他答案所示,交换到EBS卷可能会产生额外的成本。不使用交换,或交换到实例存储似乎是更好的解决方案。 - isuldor
使用实例存储是比EBS更好的选择。 EBS是一个网络文件系统,因此通过与其他所有网络连接相同的网络连接连接到EC2实例。实例存储附加到托管实例的硬件上(这就是为什么当您停止并启动实例时它不会保留的原因)。 EBS是交换选项的唯一时间是当你使用不带实例存储的实例类型时,即t1.micro(假设它只有大约620MB的RAM可能是真正需要紧急的那个)交换)。 - ColtonCat
bs = 1M已经是二进制表示法,所以count = 2048乘数应该是count = 2000 - 如果我没有错的话。 - ypocat
如果你想要2GiB,那么1024 * 2048似乎是正确的。 - Jo Liss


交换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中使用“Instance Store Volumes”存储?


21
2017-11-24 18:57



只想指出免费套餐上的t1.micro用户无法使用此选项。 - Reuben L.


注意:亚马逊改变了他们的 定价政策,截至2016年中期,我们不对I / O请求收费。答案保留在这里是出于历史原因,但是对EC2 EBS支持的实例使用(或不使用)交换没有成本影响。


19
2017-10-21 06:53



这个答案对我来说有点误导或混淆,因为最常见的实例类型使用SSD卷。 aws.amazon.com/ec2/instance-types - Taylor Edmiston
@tedmiston:的确,这个答案不再适用了。我已经调整以反映新的现实,但基本上I / O请求是免费的,因此现在可以在纯技术基础上实现交换(或不交换)。 - Gui Ambros


检查 /etc/fstab 文件,它们可能是在你正在使用的图像中没有交换的情况下设置的。我认为有些人在没有交换服务器的情况下运行,因为他们希望永远不会使用超过总内存 - 交换使一切都超级慢。

但是,我总是对一些在内存中膨胀的过程感到妄想,所以我认为只需设置一个交换驱动器并从正在运行的ec2实例中重新创建一个图像就是明智的。


1
2018-01-05 21:09



偶尔交换不会使系统变慢。 - laebshade


一个简单的运行解决方案 swap 在 EC2 图像是要运行的 swap 用...压缩 lz4 在 ram 同 zram-init

这个解决方案  采取 ram 远离 host

enter image description here


0
2017-08-24 08:14



非常有创意,但不会将RAM用作实际RAM比使用它作为内存文件系统进行交换更有意义吗? (主要在内存不足时使用)减少应用程序创建交换的可用内存量似乎违反直觉...... - HBruijn
有趣的答案,但我认为使用EBS /实例存储可能是一个更好的通用解决方案。我有一个t2.nano,512MB RAM和EBS上512MB交换,工作正常。 - Tim