我在 EC2 上启动了几个服务器,但它们没有交换。
是我做错了什么还是机器根本没有?
答案1
你是对的,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
完成。:) 我知道很多人对于使用文件而不是分区感到不舒服,但它作为紧急交换空间确实足够好。
答案2
笔记:亚马逊已经改变了他们的定价政策,并且自 2016 年中期起不再收取 I/O 请求费用。由于历史原因,答案保留在这里,但在 EC2 EBS 支持的实例上使用(或不使用)交换不会产生任何成本影响。
这是设计使然。EC2 EBS 支持的实例默认关闭交换,以避免不可预测的成本。
如果您有一个内存占用大的应用程序出现问题(例如,在一个很小的实例上),它会在您的 EBS 卷上生成大量 I/O 请求。亚马逊每 100 万个 I/O 请求收费 0.10 美元(请参阅http://aws.amazon.com/pricing/ebs/)。
在正常情况下,你不必担心;通常 I/O 请求的成本(即使在较小的实例上)也只有几美元。因此,如果你知道你有一个适当大小的实例如果交换不常使用,请继续启用它。但要小心小实例。
如果您启用了交换,您可能需要关注使用情况报告。您也可以选择通过以下方式设置账单提醒:CloudWatch 控制面板并为总账单金额创建新的警报。这样,如果您的实例出现异常,您将立即收到通知。
答案3
我认为交换的最佳位置是实例存储。为什么?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 美元的超额费用就不用管了。这是一次不幸的经历。
显然,在某些情况下您看不到实例存储。
根据实例类型,您首先需要使用块设备映射选项将实例存储卷附加到实例。如果不这样做,您可能甚至看不到 /dev 下的设备(根据如何在 Amazon EC2 中使用“实例存储卷”存储?)