我在EC2上启动了几台服务器,但没有交换。
我做错了什么,或者是机器没有?
你是对的,Ubuntu EC2 EBS镜像没有configuration交换空间(至less11.04 )。 “常规”实例types的图像确实有一个交换分区,虽然我testing的只有896 MB。
如果某个进程爆炸了,而且没有交换空间,那么在OOM杀手启动之前,服务器可能会暂停一段时间,而交换则只会变慢。 出于这个原因,我总是希望有足够的内存来交换空间。 这是你的select:
创build一个EBS卷(2-4倍于你的RAM的大小),附加到你的实例(我喜欢称它为/ dev / xvdm作为“内存”), sudo mkswap /dev/xvdm
,将它添加到fstab, sudo swapon -a
,你很好走。 我以前做过这个,它工作正常,但它可能比实例存储慢一点,因为它通过networking。
或者你也许可以重新分区你的磁盘添加一个交换分区,虽然这可能需要创build一个新的AMI。 在运行的实例中,我一直无法做到这一点,因为我无法卸载根文件系统,甚至不能访问磁盘设备(/ dev / xvda),只有分区(xvda1)。
或者你可以创build一个交换文件。 这是我现在首选的解决scheme。
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
完成。 :)我知道很多人对于使用文件而不是分区感到厌烦,但是它确实可以像紧急交换空间那样工作。
交换恕我直言的最佳位置是实例商店。 为什么? AWS不会向实例商店的I / O收取您的费用。 另外,在许多情况下,实例存储比EBS更具性能。 只要确保你有一个脚本来重新创build交换文件,以防你停止实例。 重启很好。 为什么哦,为什么它不是默认的?
让我们find实例存储。
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美元的溢出。 不幸的经历在这里说话。
显然在某些情况下,您看不到实例存储。
根据实例types,您首先需要使用block-device-mapping选项将实例存储卷附加到实例。 如果你不这样做,你甚至可能看不到/ dev下的设备(按照如何在Amazon EC2中使用“实例存储卷”存储? )
注意 :亚马逊已经改变了他们的定价政策 ,截至2016年中旬,不收取I / O请求费用。 由于历史原因,答案在这里保存,但是在EC2 EBS支持的实例中使用(或不使用)交换没有成本影响。
这是devise。 交换在EC2 EBS支持的实例上默认closures,以避免不可预测的成本。
如果你的内存要求很高,那么stream氓软件(比如一个微小的实例)就会在你的EBS卷上产生相当多的I / O请求。 亚马逊每百万次I / O请求收取0.10美元(请参阅http://aws.amazon.com/pricing/ebs/ ) 。
在正常情况下,你不应该担心。 通常是I / O请求的成本,即使在较小的情况下也是几美元。 所以,如果你知道你有一个适当大小的实例 ,并且交换将不经常使用,那就继续并启用它。 但要小心小事。
如果启用交换,则可能需要关注使用情况报告。 也可以通过转到CloudWatch控制面板并为总计费用创build一个新的“警报”来设置帐单警报。 这样你会立即得到通知是你的实例奇怪的事情。
检查/etc/fstab
文件,它们可能是在您使用的映像中没有交换的情况下设置的。 我认为有些人不用交换服务器,因为他们希望永远不要使用更多的内存 – 交换使得一切超级慢。
不过,我总是对某些程序在内存中膨胀的偏执狂,所以我认为只需要设置一个交换驱动器,然后从正在运行的ec2实例中重新创build一个映像就可以了。