问题描述
我在EC2上启动了几台服务器,但它们没有交换。
我是在做错什么,还是机器根本没有?
最佳办法
没错,Ubuntu EC2 EBS映像未配置交换空间(至少适用于11.04)。 “regular” instance-type映像确实具有交换分区,尽管我测试的映像只有896 MB。
如果某些进程崩溃了,而您没有交换空间,则在OOM杀手开始运行之前,您的服务器可能会停顿好一阵子,而通过交换,它只会变慢。因此,即使有足够的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
做完了:)我知道很多人对使用文件而不是分区感到不快,但是作为紧急交换空间,它肯定能很好地工作。
次佳办法
交换恕我直言的最佳位置是instance-store。为什么? AWS不会在instance-store上向您收取I /O费用。此外,在许多情况下,instance-store比EBS性能更高。只要确保您有一个脚本即可在停止实例的情况下重新创建交换文件。重新启动就可以了。为什么哦,为什么默认情况下它不存在?
让我们找到instance-store。
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美元的超额费用。不幸的经验在这里聊天。
显然,在某些情况下,您看不到instance-store。
Depending on the instance type, you first need to attach the instance store volumes to the instance by using the block-device-mapping options. If you don’t do this, you may not even see the devices under /dev (as per How to use “Instance Store Volumes” storage in Amazon EC2?)
第三种办法
注意:亚马逊已更改其pricing policy,并且自2016年中开始不对I /O请求收费。出于历史原因,将答案保留在此处,但是在EC2 EBS-backed实例上使用(或不使用)交换不会产生任何成本影响。
这是设计使然。默认情况下,EC2 EBS-backed实例上的交换已关闭,以避免不可预测的成本。
如果您的memory-hungry应用程序很糟糕(例如,在很小的实例上),那么它可能会在EBS卷上生成大量的I /O请求。亚马逊每100万个I /O请求收费0.10美元(请参阅http://aws.amazon.com/pricing/ebs/)。
在正常情况下,您不必为此担心。通常,即使在较小的实例上,I /O请求的成本也要几美元,如果是这样的话。因此,如果您知道实例大小合适并且该交换将仅很少使用,请继续启用它。但是要小心一些小实例。
如果启用交换,则可能需要关注使用情况报告。 (可选)您还可以通过转到CloudWatch Control Panel并为总帐单金额创建一个新的警报来设置帐单提醒。这样,您的实例马上就会发生变化,这将使您立即收到通知。