如何向EC2实例添加交换空间?

336

我目前正在运行一个ec2微型实例,但是我发现这个实例偶尔会出现内存不足的情况。

除了使用更大的实例尺寸外,还有什么其他的解决方法吗?


还可以参考AWS文档中的实例存储交换卷,以及这篇AWS知识中心的帖子 - undefined
为什么EC2的Ubuntu镜像没有交换空间? - undefined
11个回答

626

解决这个问题的方法是为实例添加swap(即分页)空间。

分页的工作原理是在硬盘上创建一个区域并将其用作额外的内存,这种内存比普通内存慢得多,但更多的可用空间。

要将此额外空间添加到您的实例中,请键入:

sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
sudo /sbin/mkswap /var/swap.1
sudo chmod 600 /var/swap.1
sudo /sbin/swapon /var/swap.1

如果您需要大于1024的话,请将其更改为更高的数字。

要在重新启动后默认启用它,请将此行添加到 /etc/fstab 中:

/var/swap.1   swap    swap    defaults        0   0

39
“if” 意味着“输入文件”,“of” 意味着“输出文件”,“bs” 意味着“块大小”,而“count” 是您想要分配的块数。您可以阅读该命令的“man”页面以获取更多信息:http://linux.die.net/man/1/dd - Fábio Batista
6
这个dd命令的意思是“从/dev/zero复制到/var/swap.1。通过读取大小为1兆字节的1024个块来执行此操作。”这是创建一个填满零的1GB文件的快速方法。 - Nelson
3
够老了,但我的交换内存即使在重启后仍保持0%未使用,有任何帮助吗? - Girdhari Agrawal
4
如果您想检查是否已启用交换空间,请执行以下命令:$> free -m - herve
1
你可以使用 fallocate 命令来创建大文件,这个命令几乎是瞬间完成的(https://www.baeldung.com/linux/create-large-file),相比之下,使用 dd 命令创建多个 GB 大小的文件可能需要一段时间。在 EKS AMI 上,使用 fallocate -l 20G /swapfile 命令效果非常好。 - markfickett
显示剩余5条评论

234

应该将交换文件放在实例存储(临时)磁盘上,而不是EBS设备上。交换将导致大量IO并增加EBS的成本。EBS也比实例存储慢,而实例存储与某些类型的EC2实例免费提供。

通常它会挂载到/mnt,但如果没有,请运行

sudo mount /dev/xvda2 /mnt

要在该设备上创建一个交换文件,请按以下步骤执行,以创建一个4GB的交换文件。

sudo dd if=/dev/zero of=/mnt/swapfile bs=1M count=4096

确保没有其他用户可以查看交换文件

sudo chown root:root /mnt/swapfile
sudo chmod 600 /mnt/swapfile

创建并标记为交换文件

sudo mkswap /mnt/swapfile
sudo swapon /mnt/swapfile

请确认以下内容已添加到您的/etc/fstab文件中

/dev/xvda2      /mnt    auto    defaults,nobootwait,comment=cloudconfig 0   2
/mnt/swapfile swap swap defaults 0 0

最后启用交换空间

sudo swapon -a

7
这是我个人认为最全面的答案。 - Jon B
4
要挂载一个文件系统,必须指定文件系统类型。要查找文件系统,请输入命令:$df -T。这将显示设备及其文件系统,大多数为ext4。对于我来说,它是/dev/xvda1,而不是2。 - user1452686
10
根据http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#StorageOnInstanceTypes的说明,无法向t1/t2实例添加实例存储。尝试后似乎是正确的结论。 - muttonUp
3
你可以在现有的分区上创建一个实际的交换文件,而不是添加另一个作为交换的分区。这里有一篇适用于Centos 6的好指南 - https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-centos-6 - muttonUp
2
交换会导致大量的IO并增加EBS的成本。这可能适用于某些卷类型,但不适用于gp2,它仅针对存储进行更改。根据文档:“I/O包含在卷的价格中,因此您只为您提供的每个GB存储付费。”除了延迟问题之外,当涉及设置基于EBS的交换卷时,成本似乎可能不是一个问题。 - Brian Gerstle
显示剩余12条评论

44

你可以使用以下命令将1 GB 交换分区添加到您的实例中:

sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
sudo mkswap /swapfile
sudo swapon /swapfile

如果要在重启后默认启用它,请将以下行添加到/etc/fstab

/swapfile swap swap defaults 0 0

但是它会从我的哪个文件系统中获取空间来创建Swap? - Hussain
@Hussain,由于路径为/swapfile,它将在根文件系统中创建交换空间。但是您也可以挂载另一个文件系统并在那里创建交换文件,例如/mnt/blah/swapfile - David Levesque
可以确认这在t2.micro实例上可行。我把我的放在/mnt/swap,因为我喜欢一个干净的根目录。 - Mike Purcell
2
点赞这个答案是因为它最简洁并且能够完成工作。但是,应该添加swapfile chmod 600命令。 - Sõber

43

按照ajtrichards提供的步骤执行后,您可以使用以下命令检查您的亚马逊免费套餐实例是否在使用交换空间

cat /proc/meminfo

结果:

ubuntu@ip-172-31-24-245:/$ cat /proc/meminfo
MemTotal:         604340 kB
MemFree:            8524 kB
Buffers:            3380 kB
Cached:           398316 kB
SwapCached:            0 kB
Active:           165476 kB
Inactive:         384556 kB
Active(anon):     141344 kB
Inactive(anon):     7248 kB
Active(file):      24132 kB
Inactive(file):   377308 kB
Unevictable:           0 kB
Mlocked:               0 kB

交换空间总量:1048572 kB

可用交换空间:1048572 kB

Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        148368 kB
Mapped:            14304 kB
Shmem:               256 kB
Slab:              26392 kB
SReclaimable:      18648 kB
SUnreclaim:         7744 kB
KernelStack:         736 kB
PageTables:         5060 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1350740 kB
Committed_AS:     623908 kB
VmallocTotal:   34359738367 kB
VmallocUsed:        7420 kB
VmallocChunk:   34359728748 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      637952 kB
DirectMap2M:           0 kB

16
如果你正在使用 t2 实例(t2.microt2.mediumt2.small),那么你将无法使用临时或实例存储。因此,你需要在 EBS 上创建交换分区,具体取决于你的使用情况,这可能是个好主意也可能不是。 否则,可以按照 @David 的答案,在临时存储上创建交换分区以避免支付 EBS 成本。
更多信息请参见:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html,其中有一张表格显示了每种实例类型可获得的临时存储空间大小。

1
可以确认这通常是一个坏主意。如果您有一个进程失控了(我有一个节点服务器这样做过,还有一个Python / Celery设置),当它在您不知情的情况下整周读写您的EBS块时,将会产生大量费用 :-) - ZachM
5
根据 https://aws.amazon.com/ebs/pricing/ ,所有的EBS卷都包括IO,除了Provisioned IPOS SSD (io1)。您只需按每GB收费。这可能是最近在定价模型中进行的更改 - 但这意味着,即使EBS比真正的Instance Storage慢得多,读写也没有额外的费用。 - bobsoap
@bobsoap,您能否澄清一下?我查看了您的链接,并发现了这个内容:“例如,如果您使用1000 IOPS配置一个卷,在30天的月份中保留此卷15天,则在每个提供的IOPS月收费为$0.10的区域中,您将被收取50美元的IOPS费用($0.10每个提供的IOPS月* 1000个提供的IOPS * 15天/30)。即使卷从实例中分离,您也将为卷上提供的IOPS付费。” 这似乎意味着AWS将对读写操作收费。 - Valter Silva
4
@ValterHenrique您引用的文本仅适用于具有已预置IOPS的卷,但是您可以在多种不同的卷类型之间进行选择。如果您使用“普通”卷而没有预置IOPS(例如称为“gp2”的通用SSD卷类型),则读写操作不会额外收费。可能更好的比较链接:https://aws.amazon.com/ebs/details/ - bobsoap

11

一开始我使用了David的实例存储答案(在m5d.2xlarge上),但是,在停止EC2实例并重新启动后,我无法再次ssh进入该实例。

实例日志报告:“您处于紧急模式。登录后,键入“journalctl -xb”以查看系统日志,“systemctl reboot”以重新启动,“systemctl default”或“exit”以启动默认模式。按Enter进行维护”

相反,我按照此链接中的AWS说明操作,一切都完美运行,即使在关闭实例并重新打开后也是如此。

https://aws.amazon.com/premiumsupport/knowledge-center/ec2-memory-swap-file/

sudo dd if=/dev/zero of=/swapfile bs=1G count=4

使用sudo命令,将/dev/zero的内容写入/swapfile文件中,每次写入1G数据,总共写入4次。

sudo chmod 600 /swapfile

使用sudo命令,修改/swapfile文件的权限为600。

sudo mkswap /swapfile

使用sudo命令,将/swapfile文件格式化为swap分区。

sudo swapon /swapfile

使用sudo命令,将/swapfile文件作为swap分区启用。

sudo swapon -s

使用sudo命令,显示当前系统中所有已经启用的swap分区。
sudo vi /etc/fstab
/swapfile swap swap defaults 0 0

9
您可以按照以下步骤创建交换空间 在这里,我们将在/home/上创建交换空间。
  1. dd if=/dev/zero of=/home/swapfile1 bs=1024 count=8388608
    这里的count是交换空间的千字节计数。

  2. mkswap /home/swapfile1

  3. vi /etc/fstab
    添加以下内容:
    /home/swapfile1 swap swap defaults 0 0

  4. 运行:
    swapon -a


4
我们可以在任何服务器中添加交换空间。 使用dd命令创建一个文件。
 #dd if=/dev/zero of=/swapfile bs=1M count=2048
                    or
 #dd if=/dev/zero of=/swapfile bs=1024M count=2

bs表示块大小count指的是以MB或GB为单位的大小

我们可以反过来使用

创建后更改文件权限:

 #chmod 600 /swapfile 

然后将文件进行交换:
 #mkswap /swapfile 

然后使用swapon命令启用交换文件:
 #swapon  /swapfile 

使用 free 命令检查 swap 是否已启用:

 #free -h
 #swapon -s

1

1
从文档中可以看出:“在其当前形式下,Swapspace 可能不适合需要始终保持响应的系统;”。 - Dave Albert

0
你可以使用EFS来解决EC2上的存储问题。操作步骤如下:
1. 创建EFS卷。 2. 将其挂载到你在EC2上使用的应用程序目录。
EFS是一个可扩展的、完全托管的文件存储服务。 更多信息请参考此链接:https://aws.amazon.com/efs/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接