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

raf*_*mvc 91 linux ubuntu swap amazon-ec2

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

我做错了什么还是机器没有任何东西?

Jo *_*iss 78

你是对的,Ubuntu EC2 EBS 镜像没有配置交换空间(至少对于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
    
    Run Code Online (Sandbox Code Playgroud)

    完毕。:) 我知道很多人对使用文件而不是分区感到厌恶,但它作为紧急交换空间确实足够好。

  • 使用实例存储是比 EBS 更好的选择。EBS 是一个网络文件系统,因此通过与其他所有内容相同的网络连接连接到 EC2 实例。实例存储附加到托管实例的硬件(这就是为什么在您停止和启动实例时它不会持续存在的原因)。EBS 是交换选项的唯一时间是当您使用不附带实例存储的实例类型时,即 t1.micro(鉴于它只有大约 620MB RAM 可能是真正需要紧急交换)。 (9认同)
  • 交换到 EBS 卷可能会导致额外的成本,如其他答案所示。不使用交换或交换到实例存储似乎是更好的解决方案。 (5认同)

Gui*_*ros 25

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


这是设计使然。交换在 EC2 EBS 支持的实例上默认关闭,以避免不可预测的成本。

如果您有一个流氓的内存饥渴应用程序(例如,在一个很小或很小的实例上),它可能会在您的 EBS 卷上生成相当多的 I/O 请求。亚马逊每 100 万次 I/O 请求收费 0.10 美元(请参阅http://aws.amazon.com/pricing/ebs/

在正常情况下,您不必担心;通常 I/O 请求的成本——即使是在较小的实例上——也只有几美元。因此,如果您知道您有一个适当大小的实例,其中交换将很少使用,请继续启用它。但要小心微小的实例。

如果启用交换,您可能需要关注使用情况报告。(可选)您还可以通过转到CloudWatch 控制面板并为总账单金额创建新警报来设置账单警报。通过这种方式,您会立即收到通知,说明您的实例发生了一些奇怪的事情。

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

seb*_*min 25

交换恕我直言的最佳位置是实例存储。为什么?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
Run Code Online (Sandbox Code Playgroud)

万岁,160.1GB 免费!把你的交换放在那里,当你的基于 EBS 的交换被错误地挤满时,忘记每台服务器 100 美元的超额费用。不幸的经历在这里说话。

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

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


ehs*_*nul 1

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

但是,我总是对某些进程在内存中膨胀感到偏执,因此我认为您最好简单地设置一个交换驱动器并从正在运行的 ec2 实例重新创建一个映像。

  • 偶尔的交换不会使系统变慢。 (2认同)